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

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

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

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

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

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

Ответ 1

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

Ответ 2

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

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

enter image description here

Ответ 3

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

Project properties, build tab

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

Project properties, platform target

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

d6lCOlP.png

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

enter image description here

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Изменить на

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

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

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

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

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

Ответ 13

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

Ответ 14

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

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

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

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

Ответ 15

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

Ответ 16

У нас была та же проблема в ядре .NET. Решение состояло в том, чтобы загрузить 32-разрядную среду выполнения .netcore и получить целевой проект x86

В вашем csproj добавить

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

Это использовалось для компьютера с Windows, вам нужно будет настроить пути и так далее для Linux/OSX

Ответ 17

У нас была похожая проблема, и нам удалось ее исправить, установив целевую платформу на x86. Project Properties-> build

Ответ 18

Если вы импортируете неуправляемую DLL, используйте

CallingConvention = CallingConvention.Cdecl 

в вашем методе импорта DLL.