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


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.