【问题标题】:BadImageFormatException during .Net assembly load issue.Net 程序集加载问题期间出现 BadImageFormatException
【发布时间】:2011-04-05 10:31:45
【问题描述】:

当我尝试在 IIS 7.0(在 Windows Server 2008 上使用 VSTS 2010 + .Net 4.0 开发)访问网站中的页面 (default.aspx) 时,我遇到了以下错误消息。有什么想法有什么问题吗?什么意思 BadImageFormatException?

顺便说一句:我正在运行 Windows Server 2008 64 位(不是 R2)并且尚未激活 Windows Server 2008,这可能是根本原因吗?

[BadImageFormatException:无法加载文件或程序集“test.foo”或其依赖项之一。尝试加载格式错误的程序。 ] 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,证据 assemblySecurity,StackCrawlMark 和 stackMark,Boolean for Introspection,Boolean suppressSecurityChecks)+567 System.Reflection.RuntimeAssembly.InternalLoad(字符串 assemblyString,证据 assemblySecurity,StackCrawlMark 和 stackMark,Boolean forIntrospection)+192 System.Reflection.Assembly.Load(String assemblyString) +35 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +118 [ConfigurationErrorsException:无法加载文件或程序集“test.foo”或其依赖项之一。尝试加载格式错误的程序。 ] 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,异常 appDomainCreationException)+1087 [HttpException(0x80004005):无法加载文件或程序集“test.foo”或其依赖项之一。尝试加载格式错误的程序。 ] System.Web.HttpRuntime.FirstRequestInit(HttpContext 上下文)+11524352 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext 上下文)+141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest WR,HttpContext 上下文)+4782309

【问题讨论】:

  • 我认为您的程序集名称缺少“.dll”。请提供代码sn-p。
  • 64 位/32 位不匹配?您是否为特定平台编译了程序集?
  • @George2:它确实不在您的代码中,程序集加载器引发了此异常(您可以拥有自己的程序集加载器,但这里似乎并非如此)。关于 32/64 不匹配:在 64 位上运行时指定 32 位(为什么请参阅我的答案)。
  • @George2 - 通常你不应该指定平台类型。您应该使用“任何 CPU”,并让主机\框架在运行时选择平台。当前选择的平台类型显示在 VS 菜单栏中的一个框中。如果没有显示,可以从tools->Customize->commands->Add command->Build->Solution Platforms添加
  • PS:升级到R2可能是件好事。微软已经修复了大量的问题,其中不少是与 .NET 相关的。因此,如果上述修复没有帮助或不适用,请确保将所有内容升级到最新版本 (!)。

标签: c# asp.net .net visual-studio-2010 iis


【解决方案1】:

您的网站是否使用 DefaultAppPool? 如果是这样,请尝试将您网站的应用程序池设置为 ASP .Net v4.0, 或者,如果您使用的是自定义应用程序池,请确认它正在运行 .net framework 4.0

【讨论】:

  • 我正在使用一个新的应用程序池。我已经将其设置为使用 .Net 4.0 Framework 并使用集成模式。有什么想法吗?
  • 这个问题可能是因为我的 Windows Server 2008 没有激活(我还没有输入许可证号)造成的吗?
  • 您使用哪个平台构建解决方案?有CPU吗? x86?我不认为这是一个激活问题。您是否使用任何第三方?
  • 我没有使用第 3 方。如果我引用我自己开发的另一个DLL,它是第3方吗?
  • 这个 Dll 是用哪个平台构建的?
【解决方案2】:

BadImageFormatException 在可以找到程序集文件但不是正确的程序集或已损坏时引发。例如,如果您将文件 FTP 到服务器并且传输被中断,则 DLL 文件可能只传输了一部分,从而导致发生此错误。

在 64 位与 32 位上:当您使用 P/Invoke 或 COM 互操作时,some blogger reports 切换到特定目标编译可能会对您的情况有所帮助。这意味着:如果您使用 32 位 dll 进行接口,请确保为 x86 编译,强制它在 WoW32 下运行,否则您将收到此异常。此修复程序是 confirmed here 和 here。

或者,您可以通过运行以下命令将整个系统设置为默认 32 位:

Ldr64.exe setwow

来自Framework64 目录。

一种常见的解决方案是重新构建文件,或者至少重新发布它。

【讨论】:

  • 您的意思是 test.foo.dll 本身已损坏或其他一些系统 DLL?
  • @George2:我的意思是 test.foo.dll 已损坏,但请参阅我关于 32 位与 64 位的新笔记,这似乎违反直觉。
  • 感谢您的更新@Abel,您的意思是我应该将解决方案重建为 64 位平台(因为我的 Windows Server 2008 是 64 位)?
  • @George2:这取决于。如果您不使用 COM Interop 或 P/Invoke 到 32 位 COM 或本机 DLL,您可以坚持使用 Any,问题出在其他地方。如果您确实使用 P/Invoke 或 COM 互操作:更改为 32 位 并测试它是否有效。注意:在 64 位上运行时,.NET 引导程序将选择 64 位并按此方式编译,但如果您 需要 32 位,则必须专门针对该平台进行编译(即使您 在 64 位上运行)。
  • @George2:正确。 (我错过了你关于非激活的问题:别担心,Windows 功能齐全,它不会阻止你自制的代码,而且绝对不会出现 BadImageFormatException ......)。
【解决方案3】:

我刚刚在运行 IIS 7 的 64 位服务器上部署 32 位 DLL 时得到了这个。

要修复它,我必须在应用程序池的高级设置中将“启用 32 位应用程序”设置为 True。

【讨论】:

  • 谢谢!这可能节省了我尝试为 64 位重新编译旧版应用程序的几个小时。
【解决方案4】:

这发生在我的 VM 中,我需要在 App-Pool 中启用 32 位应用程序,并且能够使用 powershell 做到这一点:

Import-Module WebAdministration
Set-ItemProperty IIS:\AppPools\DefaultAppPool\ -Name enable32BitAppOnWin64 -Value $true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多