Исключение BadImageFormatException во время загрузки сборки .Net
Когда я пытаюсь получить доступ к странице (default.aspx) на веб-сайте в IIS 7.0 (разработанном с использованием VSTS 2010 +.Net 4.0 в Windows Server 2008), я встретил следующее сообщение об ошибке. Какие-нибудь идеи, что не так? Что значит
BadImageFormatException?
BTW: Я запускаю 64-разрядную версию Windows Server 2008 (не R2) и еще не активировал Windows Server 2008, может ли это быть основной причиной?
[BadImageFormatException: Could not load file or assembly 'test.foo' or one of its dependencies. Try to load bad formatted program. ]
System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) +567
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +192
System.Reflection.Assembly.Load(String assemblyString) +35
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +118
[ConfigurationErrorsException: Could not load file or assembly 'test.foo' or one of its dependencies. Try to load bad formatted program. ]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +11392147
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +484
System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() +127
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +334
System.Web.Compilation.BuildManager.CallPreStartInitMethods() +280
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +1087
[HttpException (0x80004005): Could not load file or assembly 'test.foo' or one of its dependencies. Try to load bad formatted program. ]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11524352
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4782309
Ответы
Ответ 1
BadImageFormatException
возникает, когда файл сборки может быть найден, но не является надлежащей сборкой или поврежден. Например, если вы FTP'или файлы на сервер и передача была прервана, DLL файл мог быть передан только частично, что вызвало эту ошибку.
В 64-битном сравнении с 32-битным: когда вы используете P/Invoke или COM Interop, некоторые отчеты блогера, что переход на конкретную целевую компиляцию может помогите вашей ситуации. Это означает: если вы взаимодействуете с 32-разрядной dll, убедитесь, что вы компилируете для x86
, заставляя его запускаться под WoW32, иначе вы получите это исключение. Это исправление подтверждено здесь и здесь.
В качестве альтернативы вы можете настроить всю систему по умолчанию на 32-разрядную, выполнив команду:
Ldr64.exe setwow
из каталога Framework64
.
Общим решением является пересоздание файла или, по крайней мере, его повторная публикация.
Ответ 2
Я просто получил это при развертывании 32-битных DLL на 64-битный сервер с IIS 7.
Чтобы исправить это, мне пришлось установить "Включить 32-разрядные приложения" в "Истина" в "Расширенных настройках" моего пула приложений.
Ответ 3
Использует ли ваш веб-сайт DefaultAppPool?
Если да, попробуйте настроить пул приложений вашего веб-сайта на ASP.Net v4.0,
Или, если вы используете настраиваемый пул приложений, убедитесь, что он запущен .net framework 4.0
Ответ 4
Это произошло со мной на виртуальной машине, где мне нужно было включить 32-битные приложения в пуле приложений и я мог сделать это с помощью powershell:
Import-Module WebAdministration
Set-ItemProperty IIS:\AppPools\DefaultAppPool\ -Name enable32BitAppOnWin64 -Value $true