Устранение неполадок BadImageFormatException

У меня есть служба Windows, написанная на С#, с использованием Visual Studio 2010 и таргетинг на всю .NET Framework 4. Когда я запускаю из сборки Debug, служба работает, как ожидалось. Однако, когда я запускаю его из сборки Release, я получаю System.BadImageFormatException(подробности ниже). Я искал в Интернете решение, но до сих пор все, что я нашел, не помогло мне найти решение.

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

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

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

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

System.BadImageFormatException was unhandled
  Message=Could not load file or assembly 'XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
  Source=XxxDevicesService
  FileName=XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
  FusionLog=Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  c:\Dev\TeamE\bin\Release\XxxDevicesService.vshost.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = XXX
LOG: DisplayName = XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///c:/Dev/TeamE/bin/Release/
LOG: Initial PrivatePath = NULL
Calling assembly : XxxDevicesService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: c:\TeamE\bin\Release\XxxDevicesService.vshost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///c:/TeamE/bin/Release/XxxDevices.DLL.
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.

  StackTrace:
       at XxxDevicesService.Program.Main(String[] args)
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

Ответ 1

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

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

Менеджер сборки загружен из: C:\Windows\Microsoft.NET\Framework64

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

Вы также можете получить это исключение, когда ваше приложение нацелено на .NET Framework 4.5 (например), и у вас есть следующий файл app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>

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

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

У меня была эта проблема недавно, когда я попытался изменить целевую платформу из старого .NET 2.0 проекта на .NET 4.5.

Ответ 7

Фон

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

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

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

Решение

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

Удалите свою зависимость от System.Runtime в вашем Web.Config, это сработало для меня:

<dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
</dependentAssembly>

Ответ 15

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

  • Убедитесь, что в AppPool, на котором запущен ваш сайт, включена опция "Включить 32-разрядные приложения" для параметра "Ложь".
  • Убедитесь, что вы используете правильную версию для своей платформы.
  • Если вы получаете эту ошибку на веб-сайте, убедитесь, что ваш пул приложений настроен на запуск в правильном режиме (3.0 сайты должны работать в режиме 64 бит)
  • Вы также должны убедиться, что ссылка на эту сборку в visual studio указывает на правильный файл в папке пакетов.
  • Убедитесь, что у вас установлена ​​правильная версия dll, установленная на сайтах GAC для 2.0.
  • Это также может быть вызвано тем, что WSODLibs продвигается с помощью веб-проекта.

Ответ 16

Для .NET Core существует ошибка Visual Studio 2017, которая может привести к тому, что на странице свойств проекта будет отображаться неверная целевая платформа. Как только вы обнаружите, что проблема в том, что обходные пути довольно просты. Вы можете изменить цель на другое значение и затем изменить ее.

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

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

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

Ответ 17

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

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

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

Ссылка: https://developercommunity.visualstudio.com/content/problem/117596/vbcscompilerexe-process-stays-runing-after-exiting.html