"Була спроба завантажити програму з неправильним форматом", навіть коли платформи однакові


461

Я викликаю функції з 32-бітної некерованої DLL в 64-бітній системі. Що я отримую:

BadImageFormatException: Була спроба завантажити програму з неправильним форматом. (Виняток з HRESULT: 0x8007000B)

Спочатку у мене були встановлені проекти на платформі Any CPU, тому я змінив їх на x86, але ця помилка все ще виникає. Це дійсно єдиний виправлення, яке я знаю для цього.

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

Що ще можу зробити? І перш ніж ви скажете "Використовуйте 64-бітну некеровану DLL", дозвольте мені зазначити, що її немає. ;)


1
Які проекти ви змінили на x86? І як їх виконувати, коли ви отримуєте виняток, через налагоджувач або вручну? Якщо останній, чи помітили ви, що, перейшовши на x86, ви отримали нову папку у своєму каталогу bin \? Це в основному бін \ x86 \ налагодження для файлів.
— Лассе В. Карлсен

Чи можете ви переконатися, що виконуваний файл працює в 32-бітному режимі (* 32 в диспетчері процесів)?
— JP Alioto

@Lasse V. Karlsen: Так, я видалив біт x86 з вихідного контуру, коли міняв платформу в кожному проекті. Мій перший проект - це DLL, який обертає функції в керованій DLL. Другий проект - це виконуваний файл, який використовує обгортку в першій DLL. Обидва встановлені на x86.
— Девід Браун

@JP: Насправді менеджер процесів не показує, що він працює як 32-бітний процес. Чому так?
— Девід Браун

Відповіді:


531

Якщо ви спробуєте запустити 32-бітні програми на IIS 7 (та / або 64-бітній ОС), ви отримаєте ту ж помилку. Отже, з IIS 7 клацніть правою кнопкою миші по пулу програм і перейдіть до «розширених налаштувань» та змініть «Увімкнути 32-бітні програми» на «ІСТИНА».

Перезавантажте веб-сайт, і він повинен працювати.

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


1
О, мої дні я ловлявся навколо встановлення додаткових компонентів IIS, коли це було відповіддю ... Чи може хтось запропонувати мінус у виборі цього параметра?
— notidaho

3
Ось хороша дискусія щодо питання про ефективність щодо цього: stackoverflow.com/questions/507820/…
— Ben Power

У мене проблема з SharpSvn, і це не допомагає. :( Sth дуже помиляється з цією збіркою, я вам кажу ...
— user2173353

4
Ця відповідь є wtf для мене, оскільки це питання зовсім не згадує IIS!
— Крістіанп

129

Так чи інакше, прапорець " Збірка" в Менеджері конфігурацій було знято для мого виконуваного файлу, тому він все ще працює зі старою будь-якою збіркою процесора. Після того як я це виправив, Visual Studio поскаржився, що не може налагодити збірку, але це було виправлено перезавантаженням.


Дуже дякую. Це теж мене. Перевірена вбудована програма Configuration Manager і тепер вона працює (настільний додаток WPF).
— danglund

1
Якщо ви зробили все вищезазначене і перевірили налаштування своєї платформи, побудуйте налаштування конфігурації, очистили рішення і воно все ще не працює - знайдіть усі екземпляри DLL та видаліть їх.
— Вілл Калдервуд

для VS 2015 це все ще діє - хоча мені не потрібно було перезапускати :)
— increddibelly

Це воно! Повторно відвідайте налаштування Менеджера конфігурацій - це відповідь.
— AndyUK

74

У візуальній студії клацніть правою кнопкою миші ваш проект -> На лівій панелі натисніть вкладку « Збірка »,

Властивості проекту, вкладка збірки

під Platform Target виберіть x86 (або загалом архітектуру, щоб відповідати бібліотеці, до якої ви посилаєтесь)

Властивості проекту, ціль платформи

Я сподіваюся, що це комусь допоможе! :)


2
Це виправлено мою проблему у VS2013, я знайшов альтернативне виправлення - залишити "Ціль платформи" як "Будь-який процесор", але встановіть прапорець "Віддати перевагу 32-бітовому".
— користувач1069816

2
Хоча вам потрібно використовувати .NET 4.5 або
— новішу версію,

1
Так, але я перетворив свій проект з "Будь-який процесор" на "x64". Мій 32-бітний проект працює нормально, але той же код, який я перетворив на 64-бітний, цей проект не працює нормально, як 32-бітний. Чи можете ви, будь ласка, дати мені належний процес перетворення 64 біт ...
— Ismayil S

@IsmayilS переконайтеся, що ви використовуєте 64-бітну версію бібліотеки, з якою ви посилаєтесь
— Marvin Thobejane

53

У мене теж була ця проблема. Спробували всі пропозиції тут, але вони не допомогли.

Я знайшов ще одну річ, щоб перевірити, що це зафіксувало для мене. У Visual Studio клацніть правою кнопкою миші проект та відкрийте «Властивості». Клацніть на вкладці "Компілювати" (або "Побудувати"), а потім натисніть "Розширені параметри компіляції" внизу.

Перевірте спадне меню "Цільовий процесор". Він повинен відповідати "Платформі", яку ви будуєте. Тобто, якщо ви будуєте "Будь-який процесор", тоді "Цільовий процесор" повинен говорити "Будь-який процесор". Пройдіть усі свої Платформи, зробивши їх активними і перевірте це налаштування.


2
І для тих, хто просто використовує компілятор, моє виправлення було додати "/ platform: x86" до прапорів компілятора.
— Урчин

Це виправило і для мене. Мені довелося скорегувати "ціль платформи" на вкладці "Побудувати".
— Джовен

якщо ви перебуваєте на 64 біті, також встановіть прапорець "віддаю перевагу 32 біт". Мені довелося відключити це для мене.
— N4ppeL

51

Якщо ви зіткнулися з цією помилкою, натискаючи зелену кнопку зі стрілкою, щоб запустити додаток, але все-таки хочете запустити додаток у 64 біті. Це можна зробити у VS 2013, 2015, 2017 та 2019 роках

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


3
Дякую. Я так багато пробував і нічого не допомагало. Ти мій рятівник життя. У мене 64-бітна ОС, встановлена ​​64-бітна Visual studio [яка досі працює як 32-бітна з невідомих причин]. Коли я ставлю свою платформу Target до x64, вона кидає помилку BadImageFormatException. З вашим виправленням це спрацювало. Я дав вам пропозицію. Ви рок
— SKCS Kamal

Я радий, що міг допомогти :)
— paibamboo

Це відповідь, яка мені потрібна. Дуже дякую!
— yushulx

Велике спасибі, це вирішило проблему. Він добре працює з 32-розрядним процесом Visual Studio 2017.
— samir105

1
все ще працює з VS 2019, дякую
— Джейк Гастон

36

Якщо ви використовуєте будь-який процесор , ви можете зіткнутися з цією проблемою, якщо встановлено прапорець 32-бітний параметр "Кращий"

Переконайтесь, що ви зніміть цю опцію в майні проекту Побудови вкладки!

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


3
Було б корисно, якщо ви могли б вказати, де в Visual Studio знайти цю опцію.
— trysis

@trysis, ця опція знаходиться на сторінці Build на панелі налаштувань проекту.
— Дрю Ноакс

1
Я говорив, що було б корисно ввести його. Оскільки ця відповідь стоїть, немає контексту, щоб сказати нещасному, можливо новому користувачеві StackOverflow, де його знайти.
— trysis

Який шлях отримати цю форму? Я не можу його знайти
— Адольфо Кореа

У Visual Studio клацніть правою кнопкою миші проект та виберіть "Властивості".
— Дрю Ноакс

8

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

Якщо ви будуєте командну систему та отримуєте цю помилку, на вкладці процесу визначення збірки є налаштування "Платформа MSBuild". Якщо для цього встановлено значення "Авто", ви можете відчути цю проблему. Змінивши його на "X86", ви також можете усунути помилку.


це найближча відповідь на те, що я переживав. У мене був dll, який мав бути x86. Я використовував його в іншому проекті, який за замовчуванням був AnyCPU. Їм просто потрібно відповідати. У цьому випадку це не мало значення, тому я змінив новий проект на x86.
— greg

8

У моєму випадку я використовував рідну DLL в C #. Ця DLL залежала від кількох інших DLL-файлів, які були відсутні. Після того, як були додані інші DLL-файли, все працювало.


4

Спираючись на відповідь @paibamboo

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

Мій колега встановив цей прапорець (він явно його шукав), але було повідомлення про помилку. Через кілька годин він зняв прапорець і знову перевірив її. Ось і ось: Код тепер пройшов успішно.

Здається, що є два місця, де збережено стан цього вікна, який вийшов із синхронізації. Зніміть і повторно перевіривши його, синхронізував його ще раз.

Запитання для більш обізнаних користувачів: Чи було оновлення чи щось на минулому тижні (для VS 2015), яке де-синхронізувало штати?


3

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

Опубліковано Луїсом Маком 12.12.2010 о 8:50 Я виявив ту саму проблему, лише для конкретного проекту, коли збирався на 64-бітній машині. Виправлення роботи SEEMS полягає в ручному зміні одного символу в потоці зображень КОЖНОГО ВРЕМЯ, що контролер користувача або форма редагуються в дизайнері

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Перейти

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

Це 00LjAuMC4w назад до 0yLjAuMC4w в кінці рядка (00 назад до 0y)


1
Короткий підсумок посилання буде корисним @Shaul :)
— Marvin Thobejane

Чудовий. Дякуємо, інструктаж додає вміст у ваш коментар
— Marvin Thobejane

2

У моєму випадку я використовую крихітний .exe, який перезавантажує посилання DLL за допомогою Reflection. Тож я просто виконую ці кроки, що економить мій день:

З властивостей проекту на Explorer Explorer на вкладці build я вибираю цільову платформу x86


2

У моєму випадку я проводив тести через MSTest і з'ясував, що я розгортаю і 32-бітну, і 64-бітну DLL в тестову каталог. Програма надала перевагу 64-бітній DLL і призвела до її відмови.

TL; DR Переконайтеся, що для тестів розгортаєте лише 32-бітні DLL-файли.


2

У нас була подібна проблема, і нам вдалося її виправити, встановивши ціль платформи на x86. Властивості проекту-> збірка


Так x86 dll відрізняються від x64? Чи є спосіб виявити це у файлі DLL, на який посилаються?
— NoBugs

@NoBugs Схоже, ти можеш. Подивіться на цю тему
— Джо

1

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


1

Мені вдалося виправити цю проблему, порівнявши мою версію збірки з версією .NET на сервері.

Я двічі клацнув .exe, щоб побачити, що буде, і він сказав мені встановити 4.5 ....

Тож я знизив до 4.0, і це спрацювало!

Тому переконайтеся, що ваші версії відповідають. Він працював на моїй платформі Dev відмінно, але сервер мав старішу версію .NET


1

У моєму випадку це був неправильний зміст файлу. DLL було завантажено з Інтернету, але вміст DLL був HTML-сторінкою: D Спробуйте перевірити, чи це бінарний файл, якщо здається, що це правильна DLL :)


1

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

У csprojфайл додайте

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

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

Це було використано для машини Windows, вам доведеться коригувати шляхи та інше для Linux / OSX



0

1: Перейдіть до: Інструменти> Параметри> Проекти та рішення> Веб-проекти> Використовуйте 64-бітну версію IIS Express 2: змініть нижче налаштування для проекту веб-сервісу. введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.