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

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

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

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

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

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

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

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

119
ответ дан 08 янв. '10 в 4:59
источник

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

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

enter image description here

489
ответ дан 06 янв. '11 в 23:08
источник

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

Project properties, build tab

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

Project properties, platform target

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

60
ответ дан 21 окт. '13 в 10:35
источник

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

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

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

45
ответ дан 12 дек. '11 в 22:13
источник

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

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

27
ответ дан 05 июля '16 в 16:46
источник

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

d6lCOlP.png

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

enter image description here

27
ответ дан 24 сент. '13 в 16:55
источник

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

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

8
ответ дан 05 окт. '12 в 16:55
источник

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

7
ответ дан 11 дек. '12 в 23:30
источник

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

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

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Изменить на

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

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

3
ответ дан 21 марта '12 в 16:45
источник

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

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

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

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

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

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

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

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

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

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

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

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

1
ответ дан 17 дек. '15 в 0:58
источник

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

1
ответ дан 22 июня '16 в 10:42
источник

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

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

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

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

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

1
ответ дан 16 окт. '17 в 17:42
источник

Другие вопросы по меткам или Задайте вопрос