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

104

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

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

Что дает?


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

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

Epaga
источник

Ответы:

154

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

Обратите внимание, что наиболее распространенной причиной этого исключения в наши дни является попытка загрузить 32-разрядную ( /platform:x86) DLL в процесс, который является 64-разрядным, или наоборот (а именно, загрузить 64-разрядную ( /platform:x64) DLL в процесс, который является 32 бит). Если ваш platformis non-specific ( /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тип Install Project по умолчанию создает 32-разрядную InstallUtilLibпрокладку, даже в системе x64 (поиск по запросу «64-разрядные управляемые настраиваемые действия вызывают исключение System.BadImageFormatException» в страница).

Рубен Бартелинк
источник
У меня была такая же проблема, когда я начинал отладку в соответствии с тем, что вы сказали выше, я обнаружил, что платформа: установлена ​​как x86. Когда я поменял его на Any CPU, это сработало :)
Atta H.
У меня есть установщик Windows с настраиваемыми действиями. Моя установка должна запускаться в системе x64, поэтому в свойствах настраиваемых действий необходимо установить для параметра «Run64Bit» значение true. Это решило мою проблему.
Хаген
16

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

Epaga
источник
Эта ссылка, кажется, исчезла. Впрочем, это не так уж удивительно. 6 лет назад.
Эл Лелопат
9

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

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

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

Сачин Калия
источник
Для меня это был сценарий. Очень полезный ответ.
Симос Фасулиотис, 01
По крайней мере, свяжите исходный ответ: 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 framework и связанную 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>

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

SohamC
источник
В моем случае, когда мне нужна 64-битная сборка, на одном из узлов PropertyGroup отсутствовал узел <PlatformTarget> x64 </PlatformTarget>, поэтому, по-видимому, по умолчанию использовалось 32-битное значение, и возникала ошибка неправильного формата изображения. Как только я добавил этот недостающий узел в группу свойств, ошибка исчезла.
Tom Regan
Попытка этого решения привела к другой проблеме для меня: app.config appSettings не загружался во время выполнения, несмотря на то, что файл конфигурации присутствовал в выходном каталоге . однако после попытки подхода zar ( Processor Architecture for AnyCPU Projects) все снова начинает работать.
Бижан
1

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

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

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

дермот кирк
источник
0

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

Дэниел Д.
источник
0

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

GregN
источник
0

В случае наличия этого сообщения в реальных тестах , но не в модульных тестах , это связано с тем, что выбранные сборки копируются на лету в $(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.

Солей - Матье Прево
источник
0

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

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

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

ВК_217
источник
0

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

ясень
источник
0

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

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

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

Логан
источник
0

Проблема в том, что все, 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каталоги, чистое решение и перестраивать.

rvnlord
источник