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

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

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

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

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

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

Ответы [ 16 ]

2 голосов
/ 15 февраля 2012

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

Из свойств проекта в обозревателе решений на вкладке "Сборка" я выбираю целевую платформу из x86

1 голос
/ 16 октября 2017

Опираясь на ответ @ paibamboo

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

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

Похоже, что есть два места, где состояние этого ящика не сохранено, которое стало несинхронным. Отпроверка и повторная проверка синхронизировались снова.

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

1 голос
/ 22 июня 2016

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

1 голос
/ 17 декабря 2015

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

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

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

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

1 голос
/ 30 апреля 2013

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

0 голосов
/ 27 июня 2019

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

В вашем csproj файле добавьте

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

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

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

...