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


408

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

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

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

Що я спробував:

  • Переконайтеся, що для обох проектів встановлено значення "Будь-який процесор", щоб встановити прапорець збірки . Вони є.
  • Переконайтеся, що обидва проекти відповідають одній цільовій структурі (.Net 4.0 Client Profile) .
  • У розділі ProjectB -> Посилання -> ProjectA -> Властивості, переконайтеся, що для "Copy Local" встановлено значення "True" _ (я перевірив, що ProjectA.dll копіюється правильно)
  • Очистіть / відновіть розчин. Я навіть спробував вручну видалити папки / bin та / obj в обох проектах.
  • Перезапустіть Visual Studio. Перезавантажте мій комп'ютер.
  • Перегляньте абсолютно нову копію сховища.

Але я все одно отримую ту саму помилку. Я поняття не маю, що я зробив для цього, а також як це виправити. Будь-які ідеї?


1
Якщо у вас є історія версій у сховищі, чи можете ви перевірити, чи є якісь відмінності у файлах csproj?
Стів

@Steve: За версією Mercurial, жодних змін, крім додавання посилань на нові .cs-файли
BlueRaja - Danny Pflughoeft

У вас така ж поведінка на іншій машині? Чи щось інше змінилося на апараті (наприклад, оновлення Windows, оновлення залежності тощо)?
Майк Паркхілл

Ви намагалися відновити ці нові файли .cs?
Майк Паркхілл

2
Це працює для мене ............ stackoverflow.com/a/9419522/191403
Som

Відповіді:


647

Я впевнений, що у вас конфлікт між 32 та 64 бітами. Це здається, що для вашого основного проекту може бути встановлено 32-бітне, тоді як для класу, на яке він посилається, встановлено 64-розрядне. Спробуйте подивитись на це питання ТАК і на це теж . Між ними, ви повинні мати можливість з'ясувати свою проблему.


71
Так. Я якось повністю не вистачає спаду "target target" project-->properties-->build- він був встановлений для x86; встановивши його на "Будь-який процесор", виправлено цю проблему. Я завжди думав, що цей параметр збігається з "спаданням платформи" у менеджері конфігурацій, але, мабуть, це не так (насправді "ціль платформи" в менеджері конфігурацій, здається, нічого не робить!)
BlueRaja - Danny Pflughoeft

10
Також переконайтесь, що проект не Будь-який ЦП з перевіреною 32-бітною прапорець Проект -> властивості -> побудувати
Reid Evans

26
PS: Ще одна причина - "Включити 32-розрядні програми" в налаштуваннях пулу додатків "помилково". Вам потрібно перезапустити IIS, встановивши його на true.
dvdmn

3
Найгірше, що зі мною трапилося з цією помилкою, було те, коли VS вирішила <PlatformTarget>x86</PlatformTarget>без жодних причин долучитися до одного із залежних проектів. Якби я не заглянув у SVN, я б ніколи не зрозумів, чому наш додаток MVC не запускається.
jahu

1
Будь ласка, встановіть у IIS DefaultAppPool-> Увімкнути 32-розрядні програми = True
Shantu

195

Можливо, ви зіткнулися з проблемою вашого веб-сайту після розгортання на сервері.

Тоді вам потрібно відрегулювати пул додатків до Увімкнути 32-бітні програми .

Кроки

  1. Відкрийте менеджер IIS
  2. Клацніть на пулове програм
  3. Виберіть потрібний пул додатків
  4. На правій панелі натисніть Розширені налаштування ...

  5. Встановіть Увімкнути 32-бітні програми на True

    Розширені налаштування Увімкнути 32-розрядні


1
Я щось пропустив? OP говорить про консольний додаток, а не про розгортання IIS: "ProjectB - консольний додаток, який залежить від ProjectA"
MickyD

129

У мене щойно було повідомлення про помилку під керуванням IIS Express у Visual Studio 2015. У моєму випадку мені потрібно було запустити 64-бітну версію IIS Express:

Інструменти → Параметри → Проекти та рішення → Веб-проекти
Установіть прапорець "Використовувати 64-бітну версію IIS Express для веб-сайтів та проектів".

Знімок екрана:

Знімок екрана VS для веб-проекту.


2
Це стосується навпаки, у мене було встановлено прапорець "Використовувати 64 біт" і мені потрібно було
зняти

32

У мене була ця сама проблема. Я встановив "Ціль платформи" проекту "А" ("Проект A" (клацання правою кнопкою миші) -> Властивості -> Збірка -> "Ціль платформи") на x86, але зберігав проект B в "Будь-якому процесорі". Установивши проект B на "x86", це виправлено.


15

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

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

7

Можливо, вам доведеться змінити налаштування пулу додатків "Увімкнути 32-бітні програми" на TRUE в IIS7, якщо у вашому проекті є щонайменше 1 32-бітний dll \ exe.


OP говорить про консольний додаток не IIS
MickyD

5

Перш за все, я отримав це у VS2017 зі старим проектом, який мені знадобився внести невеликі зміни, і оновив усі проекти до рамки 4.7.


Кілька інших згаданих виборів Any CPUможуть вирішити цю проблему.

Вам потрібно зробити кілька місць, і це може бути не просто так, як вибрати зі спадного меню. Це зафіксувало це для мене:

1) Вам потрібно зробити це обидва тут:

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

2) А також в Configuration Manager(правою кнопкою миші на рішення)

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

Але що робити, якщо його там немає ???

Потім натисніть Newі виберіть ці налаштування: ( спасибі @RckLN )

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


2

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


1
Працював у версії, але не вдався до налагодження. Встановіть усі .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-action-with-visual-studio.aspx


1
Розглянути підсумок зв'язаної статті на користь майбутніх читачів; у випадку, якщо посилання перерветься.
Bond - Java Bond

2

Жодне з цих рішень не працювало для мене - але, видаливши вміст папок bin та obj, все знову було здорово.


2

Це я отримав під час створення проекту за допомогою побудови Visual Studio Online (VSTS) за допомогою Visual Studio Buildкроків.

Рішення було:

  • Видаліть існуючу папку-джерело
  • Явно встановлено "Будь-який процесор" на платформі для всіх Visual Studio Builds, включаючи залежності (див. Скріншот нижче).
  • Повторно запустіть збірку

Скріншот VSO


2

Наступне вирішило проблему для мене, зніміть прапорець "Віддати перевагу 32-розрядному": введіть тут опис зображення


1

Я зіткнувся з тим же питанням. Це вискочило із синього кольору, і це мені здалося дивним.

У знімку "Виняток" для FusionLog я побачив у своєму повідомленні таке:

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

Більше про журнал синтезу: http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

Усі проекти мали цільовий процесор AnyCPU. Я змінив проект програми (проект, який посилається на всі інші проекти), на цільовий процесор x86. Зараз це працює.

Не впевнений, як відбулося змішування цільового процесора без видимих ​​причин, але все-таки.


1

Я також зіткнувся з цією проблемою в проекті, через кілька хвилин я знайшов рішення, ця проблема пов'язана з конфігурацією процесора. Якщо ви використовуєте Visual Studio 2010 або VS 2013 , просто перейдіть у властивості проекту, а потім виберіть " Компілювати з бічної панелі" і буде 5 спадних, 5-е випадаюче буде цільовим процесором:, слід встановити його на x86 або x64 відповідно до ваших вимог замість будь-якого процесора.

Мою проблему було вирішено після зміни її на x86.


1

Це також може статися, якщо у файлі app.config визначено декілька підтримуваних фреймворків і змушує програму запускатись в іншій .NET-рамці, відмінній від першої, згаданої у файлі app.config .

А також це спрацьовує, коли у вашій системі доступні обидва згадані рамки.

Для вирішення запропонуйте цільову рамку, яку ви будете використовувати для налагодження в app.config

Наприклад: якщо ви намагаєтеся запустити в .NET 4, файл конфігурації повинен мати щось подібне до цього,

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

1

У моєму проекті для C # властивість проекту -> [Build] -> Ціль платформи: будь-який процесор, і зніміть прапорець 32-бітового Prefer, щоб дозволити автоматичному вибору компілятора.


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"; тоді як скрізь це було "x64".

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

Також пам’ятайте, що VS - це 32-розрядний додаток, а IIS - 64-бітний. 32-розрядні програми відключені за замовчуванням у IIS.

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


0

Я виявив щось інше, ніж інші відповіді. Досягнення цього винятку в моєму проекті було результатом корумпованої компіляції. Не вносивши жодних змін, просто змушуючи перебудову , це було виправлено.


0

У мене було те саме питання. У моєму випадку проект B був бібліотекою базового класу .Net, у якій встановлено функцію "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.