Альтернативная причина BadImageFormatException в сборке .NET? - PullRequest
6 голосов
/ 22 марта 2010

Я работаю над консольным приложением .NET 3.5 в C #, которое использует неуправляемую DLL VC ++. Он работал без проблем, когда я работал над ним несколько недель назад, но я возвращаюсь к нему сегодня и теперь получаю BadImageFormatException («Была сделана попытка загрузить программу с неверным форматом. (Исключение из HRESULT: 0x8007000B)).

Моя рабочая станция для разработки работает под управлением 64-битной Windows 7, и я довольно много работаю с неуправляемым кодом, поэтому я сразу же проверил, что сборка .NET и библиотека VC ++ имеют цели x86. Они сделали.

Просто чтобы быть уверенным, я очистил и перестроил библиотеку VC ++ и сборку .NET, но безрезультатно.

Ни одна из систем не делает ничего особенно необычного. Библиотека VC ++ загружает двоичный файл данных и выполняет некоторую математическую обработку его содержимого. Сборка .NET имеет DllImports для библиотеки и некоторый код для ее подключения. Все это работало несколько недель назад.

Так что теперь мне интересно, есть ли какая-то другая причина исключения BadImageFormatException, которая встречается реже, чем конфликт x86 / x64, с которым я мог бы столкнуться.

Спасибо.

РЕДАКТИРОВАТЬ: я получаю одну и ту же ошибку независимо от режима x86 или x64, но при значении «Любой ЦП» выполнение достигает этой точки, но выполнение прерывается при последующем обращении к библиотеке VC ++ без исключения. Независимо от того, связано ли это с этой проблемой, есть ли что-то, что «Любой ЦП» делает иначе, как в x86, так и в x64, которое могло бы пролить свет на это?

Ответы [ 5 ]

4 голосов
/ 22 марта 2010

Когда я получаю эту ошибку, она всегда вызывается загрузкой 32-битной DLL в 64-битном процессе.

Установите файл EXE для компиляции в x86 и посмотрите, работает ли он.

3 голосов
/ 15 июля 2010

Проверьте наличие конфликта загрузки .dll!

Я звонил в C ++ / CLI из C #; библиотека C ++ / CLI является оберткой вокруг сторонней библиотеки dll.

Оказывается, у меня было два dll с одинаковыми именами, оба в пути (libeay32.dll).

Чтобы определить источник проблемы, я установил средства отладки Windows: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools Старая ссылка: http://www.microsoft.com/whdc/devtools/debugging/default.mspx

Запустите «gflags» (в папке «c: \ Program Files \ Debugging Tools...»), Чтобы включить отображение «оснасток» загрузчика

т.е.

> gflags -i <my test app.exe> +sls

затем запустите приложение в cdb (консольный отладчик) или windbg и просмотрите выходные данные, чтобы выяснить, какая dll вызвала исключение.

например.

> cdb -g <my test app.exe>

Переименование «неправильного» libeay32.dll продемонстрировало проблему, но является лишь временным решением!

В любом случае, тот же подход к поиску неисправностей может работать для вас.

3 голосов
/ 22 марта 2010

Возможно, вы пытаетесь загрузить сборку, созданную для CLR 4.0, в CLR 2.0.

2 голосов
/ 22 марта 2010

Учитывая ваше использование нативного кода здесь, я думаю, что наиболее вероятной проблемой здесь является то, что вы пытаетесь загрузить нативную DLL, как если бы она была. Это один сценарий, который породит BadImageFormatException.

Попробуйте запустить приложение и настроить его на разрыв для броска для BadImageFormatException и посмотрите, какая DLL загружается. Если он родной, тогда это проблема.

0 голосов
/ 07 августа 2013

В моем случае отключение Enable unmanaged code debugging во вкладке Debug свойств проекта EXE иронично, если оно проверено.

Если честно, я не уверен, почему это является причиной проблемы.

...