Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: J4NОтветов: 1

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

debuggingdllimport

Ответы

Ответ 1 · Tom Schardt

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы