System.BadImageFormatException: Не вдалося завантажити файл або збірку (з installutil.exe)


104

Я намагаюся встановити службу Windows за допомогою InstallUtil.exe і отримую повідомлення про помилку

System.BadImageFormatException: Не вдалося завантажити файл або збірку ' {xxx.exe}' або одну з її залежностей. Була зроблена спроба завантажити програму з неправильним форматом.

Що дає?


EDIT: (Not by OP) Повне повідомлення, вилучене з дублювання, отримує більше показів [для googleability]:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C: \ xxx.exe Microsoft (R). Утиліта встановлення. Framework Framework Версія 4.0.30319.1 Авторські права (c) Microsoft Corporation. Всі права захищені.

Виняток стався під час ініціалізації установки: System.BadImageFormatException: Не вдалося завантажити файл або збірку 'файл: /// C: \ xxx.exe' або одну з його залежностей. Була зроблена спроба завантажити програму з неправильним форматом ..

Відповіді:


154

Ще кілька деталей для повноти, якщо це комусь допоможе ...

Зауважте, що найпоширенішою причиною цього винятку в ці дні є спроба завантажити 32-бітову специфічну ( /platform:x86) DLL в процес, який має 64 біт, або навпаки (а саме завантажувати 64-бітну специфічну ( /platform:x64) DLL в процес, який є 32 біт). Якщо ваш platformнеспецифічний ( /platform:AnyCpu), це не виникне (якщо припустити, що посилання, що посилаються, не мають помилки).

Іншими словами, працює:

% windir% \ Microsoft.NET \ Framework \ v2.0.50727 \ installutil.exe

або:

% windir% \ Microsoft.NET \ Framework 64 \ v2.0.50727 \ installutil.exe

не буде працювати (замінити в інших базових версіях: v1.1.4322(лише 32-розрядні, тому ця проблема не виникає) і, v4.0.30319як бажано у вище).

Очевидно, що, як описано в іншій відповіді, також знадобиться номер версії .NET installutilдля запущеного вами файлу, який буде> = (бажано =) того, що використовується у файлі EXE / DLL, у якому запущено інсталятор.

Нарешті, зауважте, що у Visual Studio 2010 інструментарій за замовчуванням створює x86 бінарні файли ( а не Будь-який процесор, як раніше ).

Повна інформація про System.BadImageFormatException (кажучи, що єдиною причиною є невідповідність прикусу - це справді груба спрощеність!).

Іншою причиною встановлення BadImageFormatExceptionпід програмою x64 є те, що в Visual Studio 2010 тип .vdprojвстановлення за замовчуванням генерує 32-бітну InstallUtilLibшиму навіть у системі x64 (пошук "64-розрядних керованих користувацьких дій кидають виняток System.BadImageFormatException" на сторінки).


У мене була така ж проблема, коли я починав налагодження відповідно до того, що ви сказали вище, я виявив, що Platform: був встановлений як x86. Коли я змінив його на будь-який процесор, він спрацював :)
Atta H.

У мене інсталятор Windows із спеціальними діями. Моя установка повинна працювати в системі x64, тому властивості "Спеціальні дії" повинні перевірити опцію "Run64Bit" в істинному режимі. Це вирішило мою проблему.
Хаген

16

Переконайтеся, що найновіший Framework (той, з якого ви склали додаток), є першим у PATH. Це вирішило для мене проблему. (Знайдено на форумі )


Це посилання, здається, немає. Не надто дивно, хоча. 6 років тому.
Аль-Лелопат


9

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

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

і він повинен добре встановити ваш 32-розрядний додаток.


Такий сценарій був для мене. Дуже корисна відповідь.
Simos Fasouliotis

Принаймні , зв'язати оригінальну відповідь: stackoverflow.com/revisions/5229405/1
crusy

8

Ключовим моментом є встановлення параметрів відповідності процесора для проекту, які є в двох місцях.

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

А також переконайтесь, що параметри архітектури однакові в меню Тест >> Налаштування тесту >> Архітектура процесора за замовчуванням >>, як показано нижче.

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

Це стосується VS2013, але можливо те саме і для інших версій.

Оновлення - для VS2019:

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


Це правильний спосіб виправити цю помилку. Тобто, якщо ви не хочете возитися з можливо сотнями файлів csproj.
Біжан

6

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

Я використовую Visual Studio 2010 Express. Я написав тестову службу, яка насправді нічого не зробила. Пізніше це було лише справжньою справою.

Я написав службу і спробував встановити її за допомогою installutil.exeі отримав таку помилку:

System.BadImageFormatException: Не вдалося завантажити файл або збірку "{filename.exe}" або одну з її залежностей. Була зроблена спроба завантажити програму з неправильним форматом.

Поки те саме, що і автор-оригінал.

Тут було рятівним спостереженням Рубен про 32-бітний вихід Visual Studio 2010.

Я використовував 64-бітну версію installutil.exeі, безумовно, вихід збірки Visual Studio 2010 був 32-розрядним. Тільки щоб додати трохи додаткового значення тут, ви можете знайти 32-бітну версію останньої платформи .NET і пов'язане з нею installutil.exeу папці C: \ Windows \ Microsoft.NET \ Framework . Використовуючи цю версію installutil.exeвиправленої моєї проблеми; сервіс встановлений без зачіпки!

Я сподіваюся, що це допомагає комусь іншому там.


Я не знаю, що ви маєте на увазі під 32-розрядною версією, але я спробував цю, і вона не працювала: C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727
user2568374

3

Спробувавши всі згадані рішення, я знайшов PlatformTargetякийсь доданий до AnyCPUконфігурації у своєму проекті .csproj.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

Видалення лінії працювало для мене.


У моєму випадку, де я хочу скласти 64-бітну версію, в одному з вузлів PropertyGroup бракувало вузла <PlatformTarget> x64 </PlatformTarget>, тому, імовірно, він був дефолт 32-х бітовим і викинув помилку у форматі зображення. Як тільки я додав цей відсутній вузол до групи властивостей, помилка зникла.
Том Реган

Спроба цього рішення призвела до ще однієї проблеми для мене, а саме те, що застосунок app.config не завантажувався під час виконання, незважаючи на те, що файл конфігурації присутній у вихідному каталозі . проте, спробувавши підхід зару ( Processor Architecture for AnyCPU Projects), все почне знову працювати.
Біжан

1

У мене виникла ця проблема з проектом WinForms за допомогою VS 2015. Моє рішення:

  1. клацніть правою кнопкою миші проект
  2. виберіть властивості
  3. поставте прапорець "Віддати перевагу 32-розрядному"
  4. Ціль платформи: будь-який процесор

0

У мене було те саме питання. Я використовую стандартну команду для виконання. Це закликало X64 ro працювати проти тестів X86. Мені потрібно було вказати X86, а не X64 версію nunit-runner.


0

Підводячи підсумок, і Build, і Project \ Build \ Platform повинні бути встановлені на x64, щоб успішно встановити 64-бітну службу в 64-бітній системі.


0

Моє питання було іншим. Це сталося після несподіваного відключення моєї машини Windows 7. Я виконав чистий розчин, і він пройшов так, як очікувалося.


0

У випадку, якщо це повідомлення є в живих тестах , але не в одиничних тестах , це тому, що вибрані збірки копіюються на льоту $(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\. Але десь декілька збірок не можуть бути обрані , наприклад, VC ++ dll у випадку інтероп c ++ / c # проектів.

Після збирання xcopyне виправить проблему, оскільки скопійований файл буде стертий тестовим двигуном.

Єдине вирішення на сьогодні (28 грудня 2018 року) - це уникати «тестів», які виконують, і робити все в одиничних тестах з атрибутом, [TestCategory("SkipWhenLiveUnitTesting")]застосованим до тестового класу або методу тестування.

Цей помилка бачиться в будь-якій програмі Visual Studio 2017 до 15.9.4, і її потрібно вирішити командою Visual Studio.


0

Цільова збірка x64 Цільовий сервер Хостинг IIS 64 біт

Клацніть правою кнопкою миші appPool хостинг із запуском веб-сайту / веб-програми та встановіть 32-бітну програму enable = false.

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


0

Я сьогодні зіткнувся з цим питанням. У моєму випадку для моєї програми (мала посилання на 64-розрядний dll) ціль платформи була встановлена, AnyCPUале Prefer 32-bit прапорець у розділі цільової платформи встановлено за замовчуванням. Це була проблема, і вона спрацювала нормально після Prefer 32-bitопції неперевірки.


0

Ми знайшли інше рішення проблеми з тим же симптомом:

Цю помилку ми побачили, коли ми оновили проект з .net 4.7.1 до 4.7.2.

Проблема полягала в тому, що, хоч ми вже не посилалися на System.Net.Http у проекті, він був перелічений у розділі залежної асоціації нашого web.config. Видалення цієї та будь-яких інших невикористаних посилань на збірку з web.config вирішило проблему.


0

Проблема полягає в тому, що кожен, System.BadImageFormatException: Could not load file or assemblyвключаючи ті, які зовсім не пов'язані з installutil.exeцією ниткою.

  1. Якщо ваша проблема пов'язана з dll WindowsBaseабо PresentationFrameworkdll, і у вас встановлені аналізатори, переконайтесь, що вони встановлені для всіх проектів у вашому рішенні, або для жодного з них.

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

  2. Посилайтеся на весь фреймворк у .csprojфайлі вашої бібліотеки, а не лише на два dlls:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
  3. Видаліть binі objзабруднете, очистіть розчин і відновіть.

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