Приложение, созданное точно так же, как в конфигурации отладки, так и в конфигурации выпуска, не работает в выпуске для Win7: BadImageFormatException

Я разрабатываю приложение на машине Win7 x64.

Есть некоторый код, который вызывает внешний файл .dll. Файл .dll был создан для 32-разрядных машин. Проблема, с которой я сталкиваюсь, заключается в том, что при запуске приложения в отладчике в конфигурации Debug оно работает нормально. Как только я переключаюсь на Release, любой вход в метод, который вызывает вызов .dll, завершается с ошибкой

An unhandled exception of type 'System.BadImageFormatException' occurred in MyCool.exe

Additional information:  is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)

Конфигурации Release и Debug одинаковы, и приложение создается для x86. Эта проблема возникает только на компьютерах с Windows 7. У наших клиентов, использующих XP, нет проблем. Правда, у нас нет клиентов, использующих XP x64, поэтому я не смог это проверить.

Вот изображение моих конфигураций решения:

Мои конфигурации

Я изменил параметр Platform: на все возможные комбинации, но он все еще не работает. Есть ли что-то скрытое в конфигурации Debug?

EDIT: я понял это, но я действительно не понимаю проблемы.

На вкладке Build каждого проекта в свойствах проекта (вкладка Compile для проектов VB) я должен установить Target CPU на x86 вместо AnyCPU.

Может быть, это для другого вопроса, но: Почему? В чем разница между настройкой платформы всего решения на x86 и настройкой целевого ЦП на x86 для каждого проекта. Кроме того, на изображении выше: для чего тогда поле Platform??


person Brandon    schedule 19.02.2015    source источник
comment
Да, это не имеет ничего общего с настройкой платформы. Ни имена (x86), ни AnyCPU не имеют значения. Имеют значение только настройки в Project + Properties, Build.   -  person Hans Passant    schedule 19.02.2015
comment
..... Итак..... что тогда делает Платформа?   -  person Brandon    schedule 19.02.2015
comment
Ничего такого. Это имеет значение только для проектов C++. Там, где это имеет большое значение, это влияет на используемый компилятор и компоновщик. Компиляторы .NET не зависят от платформы, поскольку MSIL является независимым.   -  person Hans Passant    schedule 19.02.2015
comment
Это невероятно вводит в заблуждение, но я думаю, что это имеет смысл...   -  person Brandon    schedule 19.02.2015


Ответы (1)


Это связано с тем, что AnyCPU будет работать как 64-битная, но ваша DLL, скорее всего, скомпилирована как 32-битная DLL. Вы не можете перекрестно вызывать 32-битные библиотеки DLL из 64-битного исполняемого файла.

При настройке вашего приложения на x86 это заставит его скомпилировать (и запустить) как 32-битное приложение.

person wwelles    schedule 02.03.2015