System.BadImageFormatException: не удалось загрузить файл или сборку (из installutil.exe)

Я пытаюсь установить службу Windows с помощью InstallUtil.exe и получаю сообщение об ошибке

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

Что дает?


РЕДАКТИРОВАТЬ: (не по OP) Полное сообщение, извлеченное из dup, получает больше хитов [для googleability]:

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

Исключительная ситуация при инициализации установки: System.BadImageFormatException: Не удалось загрузить файл или сборку 'file:///C:\xxx.exe' или одну из ее зависимостей. Предпринята попытка загрузить программу с неверным форматом.

20 ответов

Решение

Убедитесь, что самая новая платформа (та, с которой вы скомпилировали ваше приложение) является первой в PATH. Это решило проблему для меня. (Найдено на форуме)

Еще немного подробностей для полноты на случай, если кому-то это поможет...

Обратите внимание, что наиболее распространенной причиной этого исключения в наши дни является попытка загрузить 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 \ Framework64\ v2.0.50727 \ installutil.exe

не будет работать (подставьте в другие версии фреймворка: v1.1.4322 (Только 32-битная, так что эта проблема не возникает) и v4.0.30319 по желанию выше).

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

Наконец, обратите внимание, что в Visual Studio 2010 этот инструмент по умолчанию будет генерировать двоичные файлы x86 ( а не Any CPU, как было ранее).

Полные детали System.BadImageFormatException (говоря, что единственная причина - несоответствующая битность, действительно является чрезмерным упрощением!).

Еще одна причина BadImageFormatException в установщике x64 это то, что в Visual Studio 2010 по умолчанию .vdproj Тип установки Install генерирует 32-битный InstallUtilLibshim,даже в системе x64 (поиск "64-разрядных управляемых пользовательских действий вызывает исключение System.BadImageFormatException" на странице).

Ключ должен установить соответствующие параметры процессора для проекта, которые находятся в двух местах.

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

Это для VS2013, но, возможно, то же самое для других версий.

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

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

и он должен установить ваше 32-битное приложение просто отлично.

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

Я использую 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 исправил мою проблему; сервис установлен безотказно!

Я надеюсь, что это помогает кому-то еще там.

У меня была эта проблема с WinForms Project с использованием VS 2015. Мое решение было:

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

Попробовав все упомянутые решения, я нашел 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>

Удаление линии работало на меня.

В моем случае я использовал Framework64, как показано ниже.

      cd\
cd "C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
installutil.exe "C:\XXX\Bin\ABC.exe"
pause

В случае, если это кому-нибудь поможет, я смог исправить это же исключение, используя этот ответ на аналогичный вопрос, но я не получил исключение от использования installutil.exe.

Я столкнулся с этой проблемой сегодня. В моем случае цель моего приложения (имела ссылку на 64-битную DLL) была установлена ​​на AnyCPU но Prefer 32-bit флажок под целевой платформой отмечен по умолчанию. Это было проблемой и все работало нормально после отмены проверки Prefer 32-bit вариант.

В случае наличия этого сообщения в реальных тестах, но не в модульных тестах, это потому, что выбранные сборки копируются на лету в $(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\, Но иногда могут быть не выбраны несколько сборок, например, dll VC++ в случае проектов взаимодействия C++/ C#.

После сборки xcopy не решит проблему, потому что скопированный файл будет удален живым тестовым движком.

Единственный обходной путь на сегодняшний день (28 декабря 2018 г.) - избегать тестов Live и выполнять все в модульных тестах с атрибутом. [TestCategory("SkipWhenLiveUnitTesting")] применяется к тестовому классу или тестовому методу.

Эта ошибка видна в любой Visual Studio 2017 до 15.9.4 и должна быть устранена командой Visual Studio.

Целевая сборка x64 Целевой сервер Хостинг IIS 64 Bit

Щелкните правой кнопкой мыши хостинг appPool, на котором запущен веб-сайт / веб-приложение, и установите для параметра включения 32-битного приложения = false.

Таким образом, для успешной установки 64-битной службы в 64-битной системе необходимо установить значение x64 для Build и Project\Build\Platform.

Проблема в том, что каждый System.BadImageFormatException: Could not load file or assembly включая те, которые не связаны с installutil.exe вообще указывают на эту самую ветку.

  1. Если ваша проблема связана с WindowsBase или PresentationFramework dll и у вас установлены анализаторы, убедитесь, что они установлены для всех проектов в вашем решении или ни для одного из них.

  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 dirs, очистите раствор и восстановите.

У меня была такая проблема, когда зависимость отбыл пропущен вс проектом Wix в том же решении. Это в ВС 2022.

Я обнаружил, что размер InstallUtil.exe = 0 КБ в каталоге C:\Windows\Microsoft.NET\Framework\v4.0.30319. Я заменил InstallUtil.exe с другого сервера и смог установить службу.

Моя проблема была другой. Это произошло после неожиданного отключения моей машины Windows 7. Я выполнил чистое решение, и он побежал, как и ожидалось.

Я была такая же проблема. Я использовал стандартную команду для исполнения. Это был вызов X64 ro, запущенный против тестов X86. Мне нужно было указать X86, а не версию 64 для nunit-runner.

Я использовал командную строку PowerShell, которая решила проблему для меня!

https://learn.microsoft.com/en-us/dotnet/framework/windows-services/how-to-install-and-uninstall-services

Мы нашли другое решение проблемы с тем же симптомом:

Мы увидели эту ошибку, когда обновили проект с.net 4.7.1 до 4.7.2.

Проблема заключалась в том, что, хотя мы больше не ссылались на System.Net.Http в проекте, он был указан в разделе зависимых сборок нашего web.config. Удаление этой и любых других неиспользуемых ссылок на сборки из web.config решило проблему.

Другие вопросы по тегам