Как отладить исключение 0x8007000B?

У нас есть приложение на C #, которое скомпилировано как AnyCPU. Это приложение использует внешнюю библиотеку (которая также является .Net DLL на AnyCPU), которая загружает некоторые библиотеки C ++ во внешние DLL.

Эти внешние библиотеки предназначены либо для X86, либо для X64. У нас есть событие postbuild, которое копирует событие из X64 в выходную папку.

У нас все работало годами, и у нас есть много модульных тестов, использующих эту библиотеку.

Недавно на одном компьютере (машине сборки) UnitTests теперь дает сбой со следующим стеком вызовов.

The type initializer for 'Dew.Math.Units.MtxParseClass' threw an exception.
   at System.Runtime.CompilerServices.RuntimeHelpers._RunClassConstructor(RuntimeType type)
   at System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type)
   at Dew.Math.TExprContext..cctor()

The type initializer for 'Dew.Math.Units.MtxVec' threw an exception.
   at System.Runtime.CompilerServices.RuntimeHelpers._RunClassConstructor(RuntimeType type)
   at System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type)
   at Dew.Math.Units.MtxParseClass..cctor()

An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
   at Dew.Math.Units.Nmkl.kmp_set_blocktime(Int32 Value)
   at Dew.Math.TMtxVecController..ctor()
   at Dew.Math.Units.MtxVec.InitializeMtxVec()
   at Dew.Math.Units.MtxVec.Dew.Math.MtxVec()
   at Dew.Math.Units.MtxVec..cctor()

Мы проверили, что C ++ DLL имеет 64-битный формат, наше приложение находится в AnyCPU на 64-битных компьютерах, поэтому обычно у нас не должно быть этих ошибок.

Странно то, что: мы ничего не трогали ни к этим тестам, ни к тестируемым классам, тесты по-прежнему работают нормально на всех других компьютерах.

Итак, мой вопрос:

Как это отладить:

  • Как узнать точный путь к DLL, которая не загружается
  • Как быть уверенным, что мы выполняемся в X64, а не в x86?
  • Есть ли другие идеи, которые помогут мне решить эту проблему?

person J4N    schedule 06.09.2017    source источник
comment
Неизменно 32/64 битное несоответствие. Если ваши библиотеки DLL 64-битные, то ваш .net-код должен быть нацелен на 64-битный, а не на AnyCPU.   -  person David Heffernan    schedule 06.09.2017
comment
@DavidHeffernan 1) Я знаю, что это несоответствие 32/64, я пытаюсь понять, ПОЧЕМУ. 2) Я не согласен. Создание AnyCPU DLL позволит вам использовать эту DLL 64- или 32-битным исполняемым файлом. Вопрос, на который вы ссылаетесь, не дает никаких подсказок о том, как определить, какая DLL загружена внешней библиотекой.   -  person J4N    schedule 06.09.2017
comment
Итак, когда вы меняете цель на 64-битную, вы наблюдаете тот же сбой?   -  person David Heffernan    schedule 06.09.2017
comment
@DavidHeffernan Я не могу сделать это легко, у нас более 350 проектов в решении и нет цели для 64-битной платформы, именно из-за этого мы используем AnyCPU, таким образом, мы можем выполнить конфигурацию только один раз для каждого проекта. Я обнаружил, что если я запускаю тесты с NUNIT-CONSOLE, он выполняется как Environment.Is64BitProcess == false. Если я выполню их через resharper, у меня будет Environment.Is64BitProcess ==true   -  person J4N    schedule 06.09.2017
comment
Почему вы боретесь с этим? Вы знаете, что вам нужен 64-битный процесс.   -  person David Heffernan    schedule 06.09.2017
comment
@DavidHeffernan Просто упомяну: msdn.microsoft.com/en-us/library/ ee782531.aspx В нем четко указано, что для выполнения моих тестов как 64-битных тестов я должен выбрать AnyCpu или Необязательно x64   -  person J4N    schedule 06.09.2017
comment
@DavidHeffernan Нет, мы также распространяем 32-битную версию нашего приложения. Для чего мы даем разные версии внешних библиотек (но ту же самую DLL для нашего приложения)   -  person J4N    schedule 06.09.2017
comment
Некоторым людям не помочь. Система сообщает вам, что у вас есть несоответствие битов. Почему ты не можешь это принять?   -  person David Heffernan    schedule 06.09.2017
comment
@DavidHeffernan Я не принимаю это, потому что один и тот же точный код с теми же точными библиотеками работает на некоторых 64-битных компьютерах и не работает на некоторых других. Я пытаюсь понять почему. Кроме того, я не знаю, КАКАЯ DLL имеет эту проблему.   -  person J4N    schedule 06.09.2017
comment
В любом случае, это не тот вопрос, который вы упомянули, у него определенно та же основная причина, но это определенно не тот же вопрос.   -  person J4N    schedule 06.09.2017
comment
Шаг 1, узнайте разрядность процесса   -  person David Heffernan    schedule 06.09.2017


Ответы (1)


Обратите внимание, что при использовании AnyCPU на x64 предпочтительнее 32-битная версия. Вы можете изменить это в настройках сборки проекта.

person Tom Schardt    schedule 06.09.2017
comment
Я видел эти параметры, но это только для исполняемого файла, для библиотечных и модульных тестов вы не можете указать это. - person J4N; 06.09.2017
comment
@ J4N: Да, конечно. Приложение определяет разрядность всего, что работает в контексте. - person Tom Schardt; 06.09.2017