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-битный InstallUtilLib
shim,даже в системе 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. Мое решение было:
- щелкните правой кнопкой мыши проект
- выберите свойства
- установите флажок "Предпочитать 32-разрядный"
- Цель платформы: любой процессор
Попробовав все упомянутые решения, я нашел 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
вообще указывают на эту самую ветку.
Если ваша проблема связана с
WindowsBase
илиPresentationFramework
dll и у вас установлены анализаторы, убедитесь, что они установлены для всех проектов в вашем решении или ни для одного из них.Ссылка на всю структуру в
.csproj
файл вашей библиотеки, а не только дваdlls
:<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>Library</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <RazorLangVersion>3.0</RazorLangVersion> <UseWpf>True</UseWpf> </PropertyGroup>
Удалить
bin
а такжеobj
dirs, очистите раствор и восстановите.
У меня была такая проблема, когда зависимость от
Я обнаружил, что размер InstallUtil.exe = 0 КБ в каталоге C:\Windows\Microsoft.NET\Framework\v4.0.30319. Я заменил InstallUtil.exe с другого сервера и смог установить службу.
Моя проблема была другой. Это произошло после неожиданного отключения моей машины Windows 7. Я выполнил чистое решение, и он побежал, как и ожидалось.
Я была такая же проблема. Я использовал стандартную команду для исполнения. Это был вызов X64 ro, запущенный против тестов X86. Мне нужно было указать X86, а не версию 64 для nunit-runner.
Я использовал командную строку PowerShell, которая решила проблему для меня!
Мы нашли другое решение проблемы с тем же симптомом:
Мы увидели эту ошибку, когда обновили проект с.net 4.7.1 до 4.7.2.
Проблема заключалась в том, что, хотя мы больше не ссылались на System.Net.Http в проекте, он был указан в разделе зависимых сборок нашего web.config. Удаление этой и любых других неиспользуемых ссылок на сборки из web.config решило проблему.