System badimageformatexception не удалось загрузить файл или сборку

Обновлено: 06.07.2024

Проблема существует как в 64-битной (dev), так и в 32-битной (Windows) системах Windows 7 с пакетом обновления 3 (SP3).

Вот что я уже пробовал:

  • Проверенные параметры сборки, такие как Platform Target, одинаковы (x86).
  • Использовал peverify с параметром /verbose, чтобы убедиться, что двоичные файлы сборки действительны.
  • Использует fuslogvw для поиска проблем с загрузкой.
  • Использовал CheckAsm для поиска отсутствующих файлов или сборок.

Все эти проверки ничего не изменили. Я включил полный текст информации об исключении ниже, с некоторыми именами, измененными, чтобы защитить секреты моих корпоративных мастеров.

Проверенные параметры сборки, такие как Platform Target, одинаковы (x86).

Это не то, что говорит журнал сбоев:

Обратите внимание на 64 в названии, где находится 64-битная версия фреймворка. Установите настройку целевой платформы в своем проекте EXE , а не в проекте библиотеки классов. Проект XxxDevicesService EXE определяет разрядность процесса.

После того, как я перестал стучать головой по столу, думая о целой неделе, которую я потратил на решение этой проблемы, я делюсь тем, что сработало для меня. У меня Win7 64-битный, 32-битный Oracle Client, и мой проект MVC 5 настроен для работы на платформе x86 из-за битности Oracle. Я продолжал получать те же ошибки:

Не удалось загрузить файл или сборку «Oracle.DataAccess» или одну из ее зависимостей. Предпринята попытка загрузить программу с неверным Формат.

Я перезагрузил пакеты NuGet, я использовал копии библиотек DLL, которые работали для других в разных приложениях, я установил базу кода в зависимой сборке, чтобы она указывала на папку bin моего проекта, я попытался CopyLocal как true или false, я попытался все. Наконец, у меня было достаточно всего, что я хотел проверить в своем коде, и, как новый подрядчик, у меня не было настроенной Subversion. Ища способ подключить его к VS, я споткнулся о ответ. Я обнаружил, что сработал, сняв флажок «Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов» в разделе «Проекты и решения» => Раздел «Веб-проекты» в меню «Инструменты => Параметры».

То, что я нашел работающим, это проверка опции «Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов» в разделе «Проекты и решения» => Раздел «Веб-проекты» в меню «Инструменты => Параметры».

Обычно это может произойти, когда вы изменили целевую платформу .csproj и вернули ее обратно к тому, с чего начали.

Убедитесь, что 1, если supportRuntime version = "отличается от времени выполнения от цели проекта cs" в теге запуска в app.config.

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

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

У меня была та же проблема, хотя у меня была 64-битная Windows 7, и я загружал 64-битную библиотеку DLL в свойствах проекта | Сборка у меня была проверена "Предпочитать 32-битный". (Не знаю, почему это установлено по умолчанию). Как только я снял галочку, все стало хорошо

При попытке запустить отладку приложения вы получите исключение BadImageFormatException.

Удаление строки, объявляющей версию v2.0, устранит ошибку.

Фон

Мы начали это понимать сегодня, когда переключили нашу службу WCF с AnyCPU на x64 на сервере Windows 2012 R2 под управлением IIS 6.2.

Сначала мы 10 раз проверили единственную сборку, на которую ссылались, чтобы убедиться, что это не dll x86. Затем мы много раз проверяли пул приложений, чтобы убедиться, что он не поддерживает 32-разрядные приложения.

По какой-то причине я попытался переключить настройку. Оказывается, пулы приложений в IIS по умолчанию имеют значение Включить 32-разрядные приложения , равное False, но IIS по какой-то причине игнорирует его на нашем сервере и всегда запускает наш сервис в режиме x86.

Решение

  • Выберите пул приложений.
  • Выберите Установить значения по умолчанию для пула приложений . или Дополнительные параметры . .
  • Измените Включить 32-разрядные приложения на True.
  • Нажмите ОК .
  • Выберите Установить значения по умолчанию для пула приложений . или Расширенные настройки . .
  • Измените Включить 32-разрядные приложения обратно на False.
  • Нажмите ОК .

Для тех, кто может приехать сюда позже . У меня ничего не получалось. Все мои сборки были в порядке. У меня была конфигурация приложения в одном из моих проектов Visual Studio, которого не должно было быть. Поэтому убедитесь, что файл конфигурации вашего приложения необходим.

Я удалил дополнительную конфигурацию приложения, и она сработала.

Я исправил эту проблему, изменив веб-приложение на использование другого «пула приложений».

Определите пул приложений, используемый приложением, и установите свойство, установив для параметра Включить 32-разрядные приложения значение True. Это можно сделать с помощью предварительных настроек пула приложений.

При создании приложений для 32-разрядной или 64-разрядной платформы (мой опыт работы с Visual Studio 2010) не полагайтесь на Configuration Manager для установки правильной платформы для исполняемого файла. Даже если CM выбрал для приложения x86, проверьте свойства проекта (вкладка «Сборка»): там все равно может быть написано «Любой процессор». И если вы запустите исполняемый файл «Любой ЦП» на 64-битной платформе, он будет работать в 64-битном режиме и откажется загружать сопутствующие библиотеки DLL, созданные для платформы x86.

Для тех, кто может приехать сюда позже .
Для настольного решения я получил исключение BadImageFormatException .
Все параметры сборки проекта были в порядке (все x86 ). Но проект решения StartUp был изменен на другой проект (проект библиотеки классов).

Изменение проекта StartUp на исходный (проект приложения .exe) было решением в моем случае

Когда я столкнулся с этой проблемой, мне удалось ее решить:

Я вызывал dll OpenCV из другого exe-файла, мой dll не содержал уже необходимых dll-пакетов opencv, таких как highgui, features2d и т. д., доступных в папке моего exe-файла. Я скопировал все это в каталог моего exe-проекта, и он неожиданно сработал.

Эта ошибка «Не удалось загрузить файл или сборку« пример »или одну из ее зависимостей. Была предпринята попытка загрузить программу с неверным форматом», как правило, вызвана неправильной конфигурацией пула приложений.

  1. Убедитесь, что в AppPool, на котором сейчас работает ваш сайт, для параметра "Включить 32-разрядные приложения" установлено значение False.
  2. Убедитесь, что вы используете правильную версию для своей платформы.
  3. Если вы получаете эту ошибку на веб-сайте, убедитесь, что ваш пул приложений настроен на работу в правильном режиме (сайты 3.0 должны работать в 64-битном режиме)
  4. Также следует убедиться, что ссылка на эту сборку в Visual Studio указывает на правильный файл в папке пакетов.
  5. Убедитесь, что у вас установлена ​​правильная версия dll в GAC для сайтов 2.0.
  6. Это также может быть вызвано продвижением WSODLib с веб-проектом.

Кроме того, вы можете добавить идентификатор времени выполнения в .csproj. Если вам нужно, чтобы ваш .exe работал как x86, чтобы он мог загрузить собственную библиотеку x86, добавьте этот элемент в PropertyGroup :

Хорошее место для этого - сразу после TargetFramework или TargetFrameworks element.

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

Происходило то, что экземпляр VBCSCompiler.exe каким-то образом зависал и фактически не выпускал дескрипторы файлов, чтобы новые экземпляры могли правильно записывать новые файлы, и вызывал проблему. Это стало очевидным, когда я попытался удалить папку «bin» и пожаловался на то, что другой процесс использовал там файлы.

Закрыл VS, открыл диспетчер задач, посмотрел и остановил все экземпляры VBCSCompiler и удалил папку «bin», чтобы вернуться туда, где я был.

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

Если сборка приложения ориентирована на 64-разрядную ОС, то на 64-разрядном сервере, на котором размещены IIS, установите для параметра включения 32-разрядного приложения в пуле приложений, на котором выполняется веб-сайт /веб-приложение, значение false.

проблема существует как в Windows 7 64-разрядной (dev), так и в Windows XP SP3 32-разрядной (целевой) системный.

вот что я пробовал до сих пор:

  • проверенные настройки сборки, такие как цель платформы, одинаковы (x86).
  • используется peverify с параметром / verbose для обеспечения допустимости двоичных файлов сборки.
  • использует fuslogvw для поиска любых проблем с загрузкой.
  • используется CheckAsm для поиска отсутствующих файлов или assembiles.

все эти проверки ничего не изменится. Я включил полный текст информация об исключениях ниже, с некоторыми именами, измененными для защиты секретов моих корпоративных мастеров.

проверенные параметры сборки, такие как цель платформы, одинаковы (x86).

это не то, что говорит журнал сбоев:

Примечание 64 в названии, это дом 64-разрядной версии фреймворка. Установите настройку целевой платформы на свой exe-файла проект, а не проект библиотеки классов. Этот Проект EXE XxxDevicesService определяет битность процесса.

после того, как я перестал стучать головой о стол, думая о всей неделе, которую я провел, разбирая эту проблему, я делюсь тем, что сработало для меня. У меня есть 64-разрядный клиент Win7, 32-разрядный клиент Oracle и мой проект MVC 5 для запуска на платформе x86 из-за битности Oracle. Я продолжал получать те же ошибки:

не удалось загрузить файл или сборку " Oracle.DataAccess' или один из его зависимости. Была сделана попытка загрузить программу, имеющую неверный формат.

я перезагрузил пакеты NuGet, я использовал копии DLL, которые работали для других в разных приложениях, я установил кодовую базу в зависимой сборке, чтобы указать на папку bin моего проекта, я попробовал CopyLocal как true или false, я попробовал все. Наконец, я сделал достаточно, чтобы проверить свой код,и как новый подрядчик я не имел subversion. Ища способ подключить его к VS, я споткнулся об ответ. Что я нашел работал был снят флажок" Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов " в разделе Проекты и решения => веб-проекты в меню Сервис=>Параметры.

то, что я нашел, работало, проверяя опцию "Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов" в разделе "Проекты и решения => веб-проекты "в меню" Инструменты=>Параметры".

обычно это может произойти, когда вы изменили целевую структуру .csproj и вернул его обратно к тому, с чего вы начали.

убедитесь, что 1, если supportedRuntime version= "другая среда выполнения от CS project target" под тегом запуска в приложении.конфиг.

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

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

У меня была та же проблема, хотя у меня 64-разрядная Windows 7, и я загружал 64-битную DLL b/c в свойствах проекта | сборке, я "предпочитал 32-бит". (Не знаю, почему это установлено по умолчанию). Как только я снял этот флажок, все прошло нормально

при попытке запустить отладку приложения вы получите BadImageFormatException.

удаление строки, объявляющей v2.Версия 0 очистит ошибку.

фон

мы начали получать это сегодня, когда мы переключили нашу службу WCF с AnyCPU на x64 на сервере Windows 2012 R2 под управлением IIS 6.2.

Сначала мы проверили единственную ссылочную сборку 10 раз, чтобы убедиться, что на самом деле это не dll x86. Затем мы проверили пул приложений много раз, чтобы убедиться, что он не включает 32-битные приложения.

по прихоти я попытался переключить настройку. Оказывается, пулы приложений в IIS были по умолчанию Включить 32-Разрядные Приложения значение False, но IIS почему-то игнорировал его на нашем сервере и всегда запускал нашу службу в режиме x86.

решение

  • выберите пул приложений.
  • выбрать Установить Пул Приложений По Умолчанию. или Дополнительные Параметры. .
  • изменить Включить 32-Разрядные Приложения в true.
  • клик OK.
  • выбрать Установить Пул Приложений По Умолчанию. или Дополнительные Параметры. снова.
  • изменить Включить 32-Разрядные Приложения вернуться к False.
  • клик OK.

я исправил эту проблему, изменив веб-приложение для использования другого "пула приложений".

для всех, кто может прибыть сюда в более позднее время. У меня ничего не получалось. Все мои собрания были прекрасны. У меня была конфигурация приложения в одном из моих проектов Visual Studio, которой не должно было быть. Поэтому убедитесь, что файл конфигурации приложения необходим.

Я удалил дополнительную конфигурацию приложения, и это сработало.

определите пул приложений, используемый приложением, и установите свойство, установив для 32-разрядных приложений значение True. Это можно сделать с помощью предварительных настроек пула приложений.

при создании приложений для 32-разрядной или 64-разрядной платформы (мой опыт работы с Visual Studio 2010) Не полагайтесь на Configuration Manager для установки правильной платформы для исполняемого файла. Даже если CM выбрал x86 для приложения, проверьте свойства проекта (вкладка "сборка"): он все равно может сказать" любой процессор". И если вы запустите исполняемый файл "Any CPU" на 64-разрядной платформе, он будет работать в 64-разрядном режиме и откажется загружать сопровождающие вас библиотеки DLL, созданные для x86 платформа.

для тех, кто может прибыть сюда позже.
Для настольного решения я получил BadImageFormatException исключения.
Все параметры сборки проекта были прекрасны (all x86 ). Но проект запуска решения был изменен на какой-то другой проект(проект библиотеки классов).

изменение начального проекта на исходный(.exe application project) было решением в моем случае

когда я столкнулся с этой проблемой, следующее решило ее для меня:

Я вызывал dll OpenCV изнутри другого exe, моя dll не содержала уже необходимые библиотеки OpenCV, такие как highgui, features2d и т. д., доступные в папке моего exe-файла. Я скопировал все это в каталог моего exe-проекта, и он внезапно сработал.

удалите зависимость от системы.Время выполнения в вашем интернете.Config, это сработало для меня:

эта ошибка "не удалось загрузить файл или сборку "пример" или одну из ее зависимостей. Попытка загрузки программы с неправильным форматом " обычно вызвана неправильной конфигурацией пула приложений.

  1. убедитесь, что в AppPool, на котором работает ваш сайт, установлено значение "включить 32-разрядные приложения" False.
  2. убедитесь, что вы используете правильную версию для вашей платформы.
  3. Если вы получаете эту ошибку на сайте, убедитесь, что пул приложений запущен в правильном режиме (сайты 3.0 должны работать в 64-разрядном режиме)
  4. вы также должны убедиться, что ссылка на эту сборку в visual studio указывает на правильный файл в папке packages.
  5. убедитесь, что у вас есть правильная версия dll, установленная в GAC для сайтов 2.0.
  6. Это также может быть вызвано продвижением WSODLibs с помощью веб-проекта.

кроме того, вы можете добавить идентификатор среды выполнения для .csproj файл. Если понадобится .exe для запуска как x86, чтобы он мог загрузить собственную DLL x86, добавьте этот элемент в PropertyGroup :

хорошее место, чтобы положить это сразу после TargetFramework или TargetFrameworks элемент.

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

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

Обратите внимание, что наиболее распространенной причиной этого исключения в наши дни является попытка загрузить 32-разрядную ( /platform:x86 ) DLL в процесс, который является 64-разрядным, или наоборот (а именно, загрузить 64-разрядную ( /platform:x64 ) DLL в процесс, который является 32 бит). Если ваш platform is non-specific ( /platform:AnyCpu ), этого не произойдет (при условии, что никакие ссылочные зависимости не имеют неправильную разрядность).

Другими словами, бег:

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

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

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

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

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

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

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

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

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

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

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

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

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

Обновление - для VS2019:

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

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

Я использую Visual Studio 2010 Express. Я написал тестовый сервис, который на самом деле ничего не делал. Позже это была просто практика для настоящего дела.

Я написал сервис, попытался установить с помощью installutil.exe и получил следующую ошибку:

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

Пока то же, что и первоначальный автор.

Вышеупомянутое замечание Рубена о 32-битном выводе Visual Studio 2010 было здесь спасением.

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

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

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

Обратите внимание, что наиболее распространенной причиной этого исключения в наши дни является попытка загрузить 32-битный ( /platform:x86 ) DLL в процесс, который является 64-битным или наоборот (то есть загрузить 64-битный ( /platform:x64 ) DLL в 32-битный процесс). Если ваша platform неспецифична ( /platform:AnyCpu ), это не произойдет (при условии, что никакие ссылочные зависимости не имеют неправильную разрядность).

Другими словами, работает:

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

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

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

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

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

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

Я использую Visual Studio 2010 Express. Я написал тестовый сервис, который ничего не делал. Позже это была просто практика для настоящего.

Я написал сервис и попытался установить его с помощью installutil.exe и получил следующую ошибку:

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

Пока что так же, как и у оригинального автора.

Наблюдение Рубена выше о 32-разрядном выводе Visual Studio 2010 был спасителем здесь.

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

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

Попробовав все упомянутые решения, я обнаружил, что PlatformTarget каким-то образом добавлен в конфигурацию AnyCPU в моем проекте .csproj.

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

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

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

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

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

enter image description here

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

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

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

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

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

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

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

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

enter image description here

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

Читайте также: