2012-01-25 4 views
83

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

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

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

  • Проверенно строят такие параметры, как целевая платформа все же (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: 
+0

Что такое xxxDevices? –

+0

Вы вообще смешиваете собственный код/​​.net? –

+1

Вы на правильном пути, что это исключение связано с различиями бит x86/x64. Я предполагаю, что это не веб-приложение? Кроме того, какой тип сборки «XxxDevicesService»? Скомпилирован ли он для конкретной платформы (например, 32 бит)? Если это так, тогда вы должны скомпилировать свою платформу до 32 бит. – Reddog

ответ

99

Проверенно строят такие параметры, как целевая платформа все же (x86).

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

Ассамблеи менеджер загружается из: C: \ Windows \ Microsoft.NET \ Framework64

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

+5

И пока вы проверяете проект EXE - проверяйте как Debug *, так и * Release. :/ – chris

11

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

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

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

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

+0

Я столкнулся с подобной проблемой, и ваш ответ был моим решением. Мой app.config имел разные поддерживаемые среды выполнения. –

5

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

+0

То же самое здесь. Это сделал трюк. Ссылка на 64-битную сборку и конфигурацию активной сборки была настроена на любой процессор, но из-за этого «предпочтительного 32-битного» параметра, предположительно, 32-бит использовался запуск приложения и вызвал проблемы. –

3

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

5

Вы также можете получить это исключение, когда цель вашего приложения .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.

2

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

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

+0

Исправлено это для меня. Мой App.config устанавливал мое приложение .NET 4.5.1 для 2.0 CLR! –

2

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

28

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

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

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

+0

Спасибо, что решил проблему с pdfium для меня! – Akinzekeel

+2

Что за жизнь! Спасибо. Для меня я должен был действительно проверить это, так как мой проект эффективно x64. Еще раз спасибо!!! – viper

+0

После всей помощи, которую я получил здесь, я очень рад, что смог заплатить за это! –

1

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

0

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

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

3

фон

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

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

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

Решение

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

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

0

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

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

0

Удалите зависимость от 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> 
0

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

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

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

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

<RuntimeIdentifier>win-x86</RuntimeIdentifier> 

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

Смежные вопросы