Не удалось загрузить файл или сборку… Была предпринята попытка загрузить программу с неверным форматом (System.BadImageFormatException)


409

У меня есть два проекта, ProjectAи ProjectB. ProjectBконсольное приложение, которое зависит от ProjectA. Вчера все работало нормально, но вдруг сегодня, когда я бегу, ProjectBя получаю это:

BadImageFormatException не обработано :
не удалось загрузить файл или сборку 'ProjectA, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null' или одна из ее зависимостей. Была предпринята попытка загрузить программу с неверным форматом.

Оба являются просто обычными проектами, не зависящими ни от каких других проектов, не относящихся к .Net. Оба полностью .Net - нет родного кода и P / Invoke. У меня есть другие проекты, которые зависят ProjectAи все еще работают очень хорошо.

Вещи, которые я пробовал:

  • Убедитесь , что оба проекта установлены на «Любой процессор» с сборки галочкой. Они есть.
  • Убедитесь, что оба проекта предназначены для одной и той же целевой платформы (.Net 4.0 Client Profile) .
  • В ProjectB -> Ссылки -> ProjectA -> Свойства убедитесь, что для параметра «Копировать локально» задано значение «Истина» _ (я убедился, что ProjectA.dll копируется правильно)
  • Очистить / восстановить решение. Я даже пытался вручную удалить папки / bin и / obj в обоих проектах.
  • Перезапустите Visual Studio. Перезагрузите мой компьютер.
  • Проверьте совершенно новую копию хранилища.

Но я все еще получаю ту же ошибку. Я понятия не имею, что я сделал, чтобы вызвать это, и как это исправить. Любые идеи?


1
Если у вас есть история версий в хранилище, можете ли вы проверить, есть ли различия в файлах csproj?
Стив

@Steve: Согласно Mercurial, никаких изменений, кроме добавления ссылок на новые файлы .cs
BlueRaja - Дэнни Пфлугхофт

Вы получаете такое же поведение на другой машине? Что-то еще изменилось на компьютере (например, обновление Windows, обновления зависимостей и т. Д.)?
Майк Пархилл

Вы пытались вернуть эти новые файлы .cs?
Майк Пархилл

2
Это сработало для меня ............ stackoverflow.com/a/9419522/191403
сом

Ответы:


647

Я почти уверен, что у вас конфликт 32-бит / 64-бит. Похоже, ваш основной проект может быть установлен на 32-битный, в то время как класс, на который он ссылается, установлен на 64-битный. Попробуйте посмотреть на этот ТАК вопрос и этот тоже . Между ними вы должны понять свою проблему.


71
Do'h. Я почему-то полностью пропустил выпадающий список "целевой платформы" project-->properties-->build- он был установлен для x86; установка «Любой процессор» исправила эту проблему. Я всегда думал, что этот параметр был таким же, как раскрывающийся список «целевой платформы» в диспетчере конфигурации, но, очевидно, это не так (на самом деле «целевой объект платформы» в диспетчере конфигурации, похоже, вообще ничего не делает!)
BlueRaja - Дэнни Пфлюгофт

10
Также убедитесь, что в проекте не установлен какой-либо ЦП с установленным флажком Предпочитаемый 32-разрядный. Проект -> Недвижимость -> Сборка
Рейд Эванс

26
PS: Другая причина заключается в том, что «Включить 32-битные приложения» в настройках пула приложений - «ложь». Вам нужно перезапустить IIS после установки его в значение true.
dvdmn

3
Худшее, что случилось со мной с этой ошибкой, было, когда VS решил присоединиться <PlatformTarget>x86</PlatformTarget>к одному из зависимых проектов без всякой причины. Если бы я не изучал SVN, я бы никогда не понял, почему наше приложение MVC не запускается.
Джаху

1
Пожалуйста, установите в IIS DefaultAppPool-> Включить 32-битные приложения = True
Shantu

198

Возможно, вы столкнулись с проблемой вашего сайта после развертывания на сервере.

Затем вам нужно настроить пул приложений для включения 32-битных приложений .

меры

  1. Открыть IIS Manager
  2. Нажмите на пулы приложений
  3. Выберите пул приложений, который вы используете
  4. На правой панели нажмите Расширенные настройки ...

  5. Установите для параметра Включить 32-разрядные приложения значение Истина.

    Расширенные настройки Включить 32-битный


1
Я что-то пропустил? ОП говорит о консольном приложении, а не о развертывании IIS: «ProjectB - консольное приложение, которое зависит от ProjectA»
MickyD

129

Я только что получил это сообщение об ошибке при запуске IIS Express в Visual Studio 2015. В моем случае мне нужно было запустить 64-разрядную версию IIS Express:

Инструменты → Параметры → Проекты и решения → Веб-проекты
Установите флажок «Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов».

Скриншот:

Скриншот настроек VS для веб-проекта.


2
Противоположность относится к тому, что у меня была
пометка

32

У меня была такая же проблема. Я установил для Project A «Цель платформы» («Project A» (щелчок правой кнопкой мыши) -> Properties-> Build -> «Platform Target») на x86, но оставил для проекта B значение «Любой ЦП». Установка Project B's на "x86" исправила это.


15

У меня была эта проблема при запуске модульных тестов (xunit) в Visual Studio 2015, и я обнаружил следующее исправление:

Menu Bar -> Test -> Test Settings -> Default Processor Architecture -> X64

7

Возможно, вам придется изменить настройку пула приложений «Включить 32- битные приложения» на «ИСТИНА» в IIS7, если в вашем проекте есть хотя бы 1 32-битная библиотека dll \ exe.


ОП говорит о консольном приложении, а не о IIS
MickyD

5

Во-первых, я получил это в VS2017 со старым проектом, в котором мне нужно было внести небольшие изменения, и перевел все проекты в фреймворк 4.7.


Несколько других упомянули, что выбор Any CPUможет решить эту проблему.

Есть пара мест, где вам нужно это сделать, и это может быть не так просто, как выбрать из выпадающего списка. Это исправило это для меня:

1) Вам нужно сделать это здесь:

введите описание изображения здесь

2) А также в Configuration Manager(правый клик по решению)

введите описание изображения здесь

Но что, если его там нет ???

Затем нажмите Newи выберите эти настройки: ( спасибо @RckLN )

введите описание изображения здесь


2

У меня была одна и та же проблема с несколькими проектами в одном решении, в итоге я установил все целевые платформы на .NET Framework 4 и x86 для целевого процессора, и он, наконец, успешно скомпилирован.


1
Работал в Release, но не в Debug. Установите все в .Net Framework 4 (НЕ обновление 1), и теперь отладка запускается.
DCastenholz

2

Эта проблема также может возникнуть, если вы пытаетесь упаковать 64-битный проект с помощью установщика MSI в VS. («Причина в том, что собственный shim, упакованный с MSI-файлом, является 32-разрядным исполняемым файлом».)

Смотрите здесь для получения дополнительной информации: http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx


1
Подумайте об обобщении связанной статьи для будущих читателей; в случае, если ссылка не работает.
Бонд - Ява Бонд

2

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


2

Я получил это при создании проекта через Visual Studio Online (VSTS) Visual Studio Build.

Решение было:

  • Удалить существующую исходную папку
  • Явно установите «Любой ЦП» в платформе для всех сборок Visual Studio, включая зависимости (см. Скриншот ниже).
  • Перезапустить сборку

Скриншот VSO


2

Следующее решило проблему для меня, снимите флажок «Предпочитать 32-битный»: введите описание изображения здесь


1

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

В снимке исключений для FusionLog я увидел следующее в его сообщении:

... C: \ Windows \ Microsoft.NET \ Framework64 ...

Подробнее о журнале Fusion: http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

Все проекты имели целевой процессор AnyCPU. Я изменил проект приложения (проект, который ссылается на все другие проекты) на целевой процессор x86. Теперь это работает.

Не знаю, как произошло смешивание целевого процессора без видимой причины, но это произошло.


1

Я также столкнулся с этой проблемой в проекте, через несколько минут я нашел решение, эта проблема связана с конфигурацией процессора. Если вы используете Visual Studio 2010 или VS 2013 , просто перейдите в свойства проекта и затем выберите « Компилировать» на боковой панели. и там будет 5 выпадающих, 5-й выпадающий будет Target CPU: вы должны установить его на x86 или x64 в соответствии с вашими требованиями вместо любого CPU.

Моя проблема была решена после замены на x86.


1

Это также может произойти, просто указав несколько поддерживаемых платформ в файле app.config и заставив приложение работать в другой платформе .NET, отличной от упомянутой первой в файле app.config .

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

В качестве обходного пути, приведите целевой фреймворк, который вы собираетесь использовать для отладки, в app.config

пример: если вы пытаетесь запустить в .NET 4, файл конфигурации должен иметь что-то похожее на это,

<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>

1

В моем проекте для C # свойство проекта -> [Build] -> Цель платформы: любой ЦП и снимите флажок Prefer 32-bit, чтобы позволить компилятору выбирать автоматически.


1

Для сборки Chilkat .NET 4.5 требуется, чтобы среда выполнения VC ++ 2012 или 2013 была установлена ​​на любом компьютере, на котором выполняется ваше приложение. На большинстве компьютеров он уже установлен. Ваш компьютер будет иметь его, потому что Visual Studio была установлена. Тем не менее, если развертывание на компьютере, где требуемая среда выполнения VC ++ недоступна, произойдет описанная выше ошибка:

Установите все нижеуказанные пакеты

Распространяемые пакеты Visual C ++ для Visual Studio 2013 - vcredist_x64

Распространяемые пакеты Visual C ++ для Visual Studio 2013 - vcredist_x86

Распространяемые пакеты Visual C ++ для Visual Studio 2012 - vcredist_x64

Распространяемые пакеты Visual C ++ для Visual Studio 2012 - vcredist_x86


1

Если вы используете LibreOffice из своей программы через интеграцию с Cli .net, как я, я получаю ту же ошибку. Я использую старую версию LibreOffice в производственной среде на моем ПК. Я установил более новую версию, которая находилась в конфликте. Просто удалите LibreOffice. Я нашел решение здесь .NET CLI: не удалось загрузить файл или сборку «cli_cppuhelper»


0

Это может быть немного забавно, но у меня была та же проблема с нормальным рабочим кодом. Я добавил StreamWriter и StreamReader, и он выдал эту ошибку. Решение было в том, что я взял этот код в скобки для комментариев, затем сделал отладку, и он снова начал работать


0

У меня также была эта проблема при запуске модульных тестов с использованием ReSharper в Visual Studio 2017 и исправлена ​​следующая конфигурация:

введите описание изображения здесь

Также вы можете изменить настройку теста запуска ReSharper: https://resharper-support.jetbrains.com/hc/en-us/articles/207242715-How-to-run-MSTest-tests-using-x64-configuration


0

В моем случае отсутствовала зависимость в dll, которая вызвала это исключение. Я проверил с Dependency Walker, добавил недостающую DLL и проблема была решена.

Более конкретно, я каким-то образом повредил свой opencv_core340.dll, случайно добавив к нему ключевые слова SVN, и, таким образом, моя dll больше не могла его использовать. Однако я не верю, что решение этой проблемы зависит от того, повреждена ли DLL или отсутствует. Я просто добавляю это ради предоставления полной информации.


0

Стреляй! Я знал об этой проблеме. Я думал, что все делал правильно, пока случайно не увидел «x86» в окне вывода VS, и тогда я понял причину. Потрачено несколько минут на это сегодня.

Конфигурация в окне «Опубликовать» была установлена ​​на «x86»; в то время как везде это был «х64».

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

Также имейте в виду, что VS - это 32-разрядное приложение, а IIS - 64-разрядное. 32-разрядные приложения по умолчанию отключены в IIS.

введите описание изображения здесь


0

Я обнаружил что-то отличное от других ответов. Достижение этого исключения в моем проекте было результатом испорченной компиляции. Без внесения каких-либо изменений, только принудительное восстановление , это было исправлено.


0

Я была такая же проблема. Проект B в моем случае представлял собой .Net Core Class Library, в которой установлен Nuget «Microsoft.Management.Infrastructure». Ошибка состояла в том, что я назвал свой проект B "MI". Я изменил название проекта на что-то другое, и вдруг все снова заработало.


-1

Моя машина показала мне обновление BIOS, и я подумал, не связано ли это с внезапным появлением этой ошибки. И после того, как я сделал обновление, ошибка была решена, и решение построено отлично.


-1

Вы пытаетесь запустить файл .exe из cmd? Это была моя ошибка. Просто запустите файл .exe, дважды щелкнув по нему. Если это .NET Core SCD для Windows 8.1 / Windows Server 2012 R2 x64.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.