"Была сделана попытка загрузить программу с неправильным форматом", даже если платформы одинаковы

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

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

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

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

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

374
задан David Brown 08 янв. '10 в 0:21
источник поделиться

15 ответов

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

112
ответ дан David Brown 08 янв. '10 в 4:59
источник поделиться

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

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

enter image description here

465
ответ дан bluwater2001 06 янв. '11 в 23:08
источник поделиться

В Visual Studio щелкните правой кнопкой мыши ваш проект → На левой панели щелкните вкладку Сборка,

Project properties, build tab

в разделе Платформа Target выберите x86 (или, в целом, архитектура, чтобы соответствовать библиотеке, к которой вы привязываетесь)

Project properties, platform target

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

52
ответ дан Marvin Thobejane 21 окт. '13 в 10:35
источник поделиться

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

Я нашел еще одну вещь, чтобы проверить, исправил ли это для меня. В Visual Studio щелкните правой кнопкой мыши проект и откройте "Свойства". Перейдите на вкладку "Скомпилировать" и нажмите "Расширенные параметры компиляции" внизу.

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

43
ответ дан Denis 12 дек. '11 в 22:13
источник поделиться

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

d6lCOlP.png

Удостоверьтесь, что снимите флажок с этой опцией на вкладке "Сборка проекта"!

введите описание изображения здесь

20
ответ дан Drew Noakes 24 сент. '13 в 16:55
источник поделиться

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

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

18
ответ дан paibamboo 05 июля '16 в 16:46
источник поделиться

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

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

8
ответ дан StingyJack 05 окт. '12 в 16:55
источник поделиться

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

7
ответ дан Tomasz Stypich 11 дек. '12 в 23:30
источник поделиться

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

Отправленный Luis Mack 5/12/2010 в 8:50 утра Я нашел ту же проблему, только для конкретного проекта при компиляции на 64-битной машине. Исправлено, что SEEMS работает, чтобы вручную изменить один символ в потоке изображения. КАЖДЫЙ РАЗ. Пользовательский контроль или форма редактируются в дизайнере

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Изменить на

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

Это 00LjAuMC4w назад к 0yLjAuMC4w в конце строки (00 назад до 0y)

3
ответ дан Shaul Behr 21 марта '12 в 16:45
источник поделиться

В моем случае, я использую маленький .exe, который перезагружает связанные DLL через Reflection. Поэтому я просто делаю эти шаги, которые экономят мой день:

Из свойств проекта в проводнике решений, на вкладке build, я выбираю target platfrom x86

2
ответ дан asdf_enel_hak 15 февр. '12 в 12:21
источник поделиться

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

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

2
ответ дан Mike C 07 мая '15 в 22:30
источник поделиться

Мне удалось исправить эту проблему, сопоставив мою версию сборки с версией .NET на сервере.

Я дважды щелкнул файл .exe, чтобы увидеть, что произойдет, и он сказал мне, чтобы установить 4.5....

Итак, я понизил рейтинг до 4.0, и он сработает!

Поэтому убедитесь, что ваши версии совпадают. Он отлично работал на моем блоке dev, но у сервера была более старая версия .NET.

1
ответ дан Nate 17 дек. '15 в 0:58
источник поделиться

У меня эта проблема решена в "Windows". После проверки всех моих настроек, очистки решения и его восстановления я просто закрыл решение и снова открыл его. Затем это сработало, поэтому VS, вероятно, не избавился от некоторых вещей во время очистки. Когда логические решения не работают, я обычно обращаюсь к нелогичным (или, казалось бы, нелогичным). Windows не подвела меня.:)

1
ответ дан user1771386 30 апр. '13 в 12:38
источник поделиться

В моем случае это было неправильное содержимое файла. DLL была загружена из Интернета, но содержимое DLL было HTML-страницей: D Попробуйте проверить, является ли он двоичным файлом, если это похоже на правильную DLL:)

0
ответ дан Ludwo 22 июня '16 в 10:42
источник поделиться

Основываясь на ответе @paibamboo

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

У моего коллеги был установлен этот флажок (он явно искал его), но у него было сообщение об ошибке. Через несколько часов он снял флажок и снова проверил. Вот и вот: Код теперь работает с успехом.

Кажется, что есть два места, в которых состояние этого блока сохранено, что стало не синхронизированным. Un- и перепроверяя, он снова синхронизировал его.

Вопрос для более осведомленных пользователей: Было ли обновление или что-то на прошлой неделе (для VS 2015), которое дешифровало состояния?

0
ответ дан MilConDoin 16 окт. '17 в 17:42
источник поделиться

Другие вопросы по меткам