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



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




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




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



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



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

2232   15  

15 ответов:

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

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

enter image description here

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

на Visual Studio, щелкните правой кнопкой мыши проект -> на левой панели нажмите кнопку Build tab,

Project properties, build tab

под Целевой Платформы выберите x86 (или в более общем плане архитектура чтобы соответствовать библиотеке, на которую вы ссылаетесь)

Project properties, platform target

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

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

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

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

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

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

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

убедитесь, что вы убрать этот параметр в свойства проекта Build tab!

enter image description here

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

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

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

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

опубликовано Luis Mack на 5/12/2010 в 8: 50 AM я нашел ту же проблему, только для конкретного проекта при компиляции на 64-разрядной машине. Исправление, которое, кажется, работает, чтобы вручную изменить один символ в потоке изображений каждый раз, когда usercontrol или форма редактируется в конструкторе

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

заменить на

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

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

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

в свойствах проекта в обозревателе решений щелкните на вкладке построить, Я выбираю целевая платформа х86

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.