System.BadImageFormatException: не удалось загрузить файл или сборку (из installutil.exe) - PullRequest
93 голосов
/ 27 ноября 2008

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

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

Что дает?


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

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

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

Ответы [ 15 ]

139 голосов
/ 29 января 2010

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

Обратите внимание, что наиболее распространенной причиной этого исключения в наши дни является попытка загрузить 32-битную (/platform:x86) DLL-библиотеку в процесс, который является 64-битным или наоборот (то есть загрузить 64-битную (*) 1004 *) 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, как требуется выше).

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

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

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

Другая причина BadImageFormatException в установщике x64 заключается в том, что в Visual Studio 2010 по умолчанию .vdproj Тип проекта установки генерирует 32-разрядную InstallUtilLib шим, даже в системе x64 (Поиск «64-разрядные управляемые настраиваемые действия вызывают исключение System.BadImageFormatException» на странице).

16 голосов
/ 27 ноября 2008

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

10 голосов
/ 05 июля 2013

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

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

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

6 голосов
/ 23 января 2013

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

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

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

1 голос
/ 31 декабря 2018

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

  1. щелкните правой кнопкой мыши проект
  2. выберите свойства
  3. отметьте «Предпочитать 32-битный»
  4. Цель платформы: любой процессор
1 голос
/ 31 июля 2014

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

0 голосов
/ 15 мая 2019

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

enter image description here

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

enter image description here

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

0 голосов
/ 10 мая 2019

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

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

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

0 голосов
/ 13 марта 2019

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

0 голосов
/ 18 января 2019

Целевая сборка x64 Целевой сервер, 64-разрядный IIS

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

enter image description here

...