«Была сделана попытка загрузить программу с неверным форматом», даже если платформы одинаковы - PullRequest
433 голосов
/ 08 января 2010

Я вызываю функции из 32-битной неуправляемой DLL в 64-битной системе. Что я получаю:

BadImageFormatException: была предпринята попытка загрузить программу с неверным форматом. (Исключение из HRESULT: 0x8007000B)

Сначала мои проекты были настроены на платформу Any CPU, поэтому я изменил их оба на x86, но эта ошибка все еще происходит. Это действительно единственное исправление, которое я знаю для этого.

DLL не повреждены или что-то еще, потому что я могу использовать их с другими программами (для которых у меня нет источника). Я подумал, что, возможно, он не нашел зависимости, но я проверил, и все они там. Плюс, не бросит ли это DllNotFoundException в этом случае?

Что еще я могу сделать? И прежде чем вы скажете: «Вместо этого используйте 64-разрядную неуправляемую DLL», позвольте мне отметить, что ее нет. ;)

Ответы [ 16 ]

503 голосов
/ 06 января 2011

Если вы попытаетесь запустить 32-разрядные приложения на IIS 7 (и / или 64-разрядном компьютере с ОС), вы получите ту же ошибку. Итак, в IIS 7 щелкните правой кнопкой мыши пул приложений приложений и перейдите в раздел «Дополнительные параметры» и измените «Включить 32-разрядные приложения» на «ИСТИНА».

Перезагрузите ваш сайт, и он должен работать.

enter image description here

123 голосов
/ 08 января 2010

Каким-то образом флажок Build в Configuration Manager был снят для моего исполняемого файла, поэтому он все еще работал со старой сборкой Any CPU. После того, как я это исправил, Visual Studio пожаловалась, что не может отладить сборку, но это было исправлено с помощью перезапуска.

67 голосов
/ 21 октября 2013

В Visual Studio , щелкните правой кнопкой мыши свой проект -> На левой панели перейдите на вкладку Build ,

Project properties, build tab

в Platform Target выберите x86 (или, в более общем случае, архитектура , чтобы соответствовать библиотеке, на которую вы ссылаетесь)

Project properties, platform target

Надеюсь, это кому-нибудь поможет! :)

50 голосов
/ 12 декабря 2011

У меня тоже была эта проблема.Перепробовал все предложения здесь, но они не помогли.

Я нашел другую вещь, чтобы проверить, что исправило это для меня.В Visual Studio щелкните правой кнопкой мыши проект и откройте «Свойства».Нажмите на вкладку «Компиляция» (или «Сборка»), а затем нажмите «Дополнительные параметры компиляции» внизу.

Проверьте выпадающий список «Target CPU».Он должен соответствовать «Платформе», которую вы строите.То есть, если вы создаете «Любой ЦП», тогда «Целевой ЦП» должен сказать «Любой ЦП».Просмотрите все свои платформы, сделав их активными, и проверьте этот параметр.

37 голосов
/ 05 июля 2016

Если вы сталкиваетесь с этой ошибкой, когда нажимаете зеленую кнопку со стрелкой для запуска приложения, но по-прежнему хотите запустить приложение в 64-битном режиме. Вы можете сделать это в VS 2013, 2015 и 2017

Перейти к: Инструменты> Параметры> Проекты и решения> Веб-проекты> Использовать 64-разрядную версию IIS Express

33 голосов
/ 24 сентября 2013

Если вы используете Любой ЦП , вы можете столкнуться с этой проблемой, если установлен флажок Предпочитать 32-битный :

image

Убедитесь, что вы снимите отметку эту опцию в Build вкладке свойства проекта!

enter image description here

8 голосов
/ 05 октября 2012

Немного не по теме этого поста, но поиск этого сообщения об ошибке привел меня сюда.

Если вы собираете систему через систему команд и получаете эту ошибку, вкладка процесса определения сборки имеет параметр "MSBuild Platform" Если для этого параметра установлено значение «Авто», вы можете столкнуться с этой проблемой. Изменение его на «X86» также может устранить ошибку.

7 голосов
/ 12 декабря 2012

В моем случае я использовал нативную DLL в C #. Эта DLL зависела от нескольких других отсутствующих DLL. После добавления этих других библиотек все заработало.

3 голосов
/ 21 марта 2012

Также см. этот ответ , который решил ту же проблему для меня.

Автор: Luis Mack 12.05.2010 в 8:50 AM Я нашелта же проблема, только для конкретного проекта при компиляции на 64-битной машине.Исправление, которое SEEMS работает, состоит в том, чтобы вручную изменять один символ в потоке изображения КАЖДЫЙ РАЗ, когда пользовательский контроль или форма редактируются в конструкторе1012 * 00LjAuMC4w обратно в 0yLjAuMC4w в конце строки (от 00 обратно до 0y)

2 голосов
/ 07 мая 2015

В моем случае я выполнял тесты через MSTest и обнаружил, что развертываю 32-битную и 64-битную DLL в каталог test. Программа предпочитала 64-битную DLL и вызывала ее сбой.

TL; DR Убедитесь, что в тестах используются только 32-битные DLL.

...