it-swarm.com.ru

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' или одну из ее зависимостей. Предпринята попытка загрузить программу с неверным форматом.

89
Epaga

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

15
Epaga

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

Обратите внимание, что наиболее распространенной причиной этого исключения в наши дни является попытка загрузить 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 ( вместо Любой ЦП, как ранее ).

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

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

134
Ruben Bartelink

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

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

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

9
Sachin Kalia

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

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

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

6
James Crowther

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

1
Joseph Snow

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

0
mabiyan

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

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

0
SohamC

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

0
dermot kirk

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

0
GregN

Целевая сборка x64 64-разрядный хостинг на целевом сервере IIS

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

 enter image description here

0
VK_217

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

0
Daniel D

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

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

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

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

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

0
Logan

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

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

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

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

0
Soleil

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

 enter image description here

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

 enter image description here

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

0
zar