System.BadImageFormatException, когда целевая среда равна 4.0

У меня есть исключение времени выполнения после изменения Target Framework в .net framework 4: Первое случайное исключение типа "System.BadImageFormatException" произошло в

При создании с целевой структурой 3.5 все работает нормально.

Платформа, к которой я создаю, - это x86 (я узнал, что создание x64 ночью вызывает проблему).

В чем может быть проблема?

Ответы

Ответ 1

MSDN перечисляет возможные причины для этого, поэтому я предлагаю выполнить это как контрольный список:

  • Делается попытка загрузить неуправляемую библиотеку динамических ссылок или исполняемый файл (например, системную DLL-систему Windows), как если бы это была сборка .NET Framework.

  • DLL или исполняемый файл загружается как 64-разрядная сборка, но содержит 32-битные функции или ресурсы. Например, он полагается на методы взаимодействия COM или вызовов в 32-разрядной динамической библиотеке ссылок.

  • Компоненты были созданы с использованием различных версий .NET Framework. Как правило, это исключение возникает, когда приложение или компонент, который был разработан с использованием .NET Framework 1.0 или .NET Framework 1.1, пытается загрузить сборку, которая была разработана с использованием .NET Framework 2.0 с пакетом обновления 1 (SP1) или более поздней версии, или когда приложение, которое было разработано используя .NET Framework 2.0 с пакетом обновления 1 (SP1) или .NET Framework 3.5, пытается загрузить сборку, которая была разработана с использованием .NET Framework 4. Исключение BadImageFormatException может быть сообщено как ошибка времени компиляции или исключение может быть выбрано во время выполнения.

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

Возможно, добавление дополнительной информации о конфигурации/зависимостях вашего проекта (ов) позволит нам быть более решительным.

Ответ 2

Убедитесь, что все проекты в вашем решении строятся на x86 или x64 или Any Cpu - любое несоответствие может вызвать эту проблему.

Точно так же, если вы используете сторонние библиотеки, проверьте свою целевую платформу.

Еще одна вещь, которую следует учитывать, заключается в том, будет ли она размещена в IIS - в этом случае вам нужно убедиться, что битность ваших сборок соответствует битности процесса хостинга IIS. Если вы на машине x64, то это может быть x64 (если только 32-битный хостинг не был включен).

Я должен сказать, что я вообще не отклоняюсь от Any Cpu, если у меня нет внешней зависимости от COM-компонента, который только x86 или x64. Это почти всегда вызывает головные боли.

Ответ 3

Скорее всего, одна из ваших сборок ссылается на сборку x64 при создании для x86 или x86 при создании для x64.

Ответ 4

Если ваш проект запускался в первый раз, и эта ошибка возникла после изменения целевой инфраструктуры, это также может означать, что Visual Studio внесла некоторые изменения в сборку, и некоторые из ваших библиотек уже не были совместимы.

Итак, попробуйте просмотреть конфигурации сборки.

В основном это поможет: Перейти к Свойствам приложения > Сборкa > Отметьте "Предпочитаете 32-битный"

Ответ 5

Если вы работаете над рамкой 4.5, попробуйте снять флажок "Предпочитаю 32-битный флажок" на вкладке "Отладка" свойств проекта.

У нас была та же проблема с рамкой 4.5. Пробовал много вариантов. Наконец, мы отключили опцию "Предпочитаем 32-битный флажок" на вкладке "Отладка" свойств проекта и работали.

Ответ 6

У меня была эта точная проблема сегодня, BadImageFormatException произошла только тогда, когда я изменил целевую структуру на что-то > 3.5. Все остальные ответы на SO об этом исключении говорят о битте (32 против 64) наших сборок (что является общей проблемой, но не относится к этому случаю).

Если проект работает отлично, когда он построен против .NET 3.5 и выдает BadImageFormatException на .NET 4.0 или выше, обязательно проверьте файл App.config для поддерживаемого элемента Runtime. Мой сказал это:

<supportedRuntime version="v2.0.50727" sku="Client" />

Это заставит вашу программу работать в среде выполнения .NET 2.0, которая не может загружать изображения .NET 4.0 (но может загружать изображения .NET 3.5). Любая строка, которая говорит об этом, должна быть удалена при переключении на версию фрейма выше 3.5.