模块预计应包含一个程序集清单。

49
我有一个使用C++库和一些dll的C#项目。当我运行它时,它运行得很好。
这个库是Awesomium,包含了C++库和C#包装器。
当我从我的ASP.NET MVC 4项目中引用这个项目时,我遇到了以下错误:
异常详情:System.BadImageFormatException: 无法加载文件或程序集'file:///D:\Projects\Development\ProGamers\GamingSite\bin\avcodec-52.dll'或其依赖项之一。该模块应包含一个程序集清单。
我尝试过的方法:
  1. 复制dll文件,但仍然无法工作(文件已存在)。

  2. 在GAC中注册,但仍然出现相同的错误。

  3. 确保使用的是.NET Framework 4.0(而不是客户端配置文件)。

  4. 两个具有相同dll/exe名称的文件导致冲突 - 我没有这个文件。

  5. 更改解决方案的平台为AnyCPU/Mixed Platforms。

堆栈跟踪:

[BadImageFormatException: Could not load file or assembly 'file:///D:\Projects\Development\ProGamers\GamingSite\bin\avcodec-52.dll' or one of its dependencies. The module was expected to contain an assembly manifest.]
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
   System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +34
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +152
   System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark) +102
   System.Reflection.Assembly.LoadFrom(String assemblyFile) +34
   WebActivator.ActivationManager.Run() +190

[InvalidOperationException: The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load file or assembly 'file:///D:\Projects\Development\ProGamers\GamingSite\bin\avcodec-52.dll' or one of its dependencies. The module was expected to contain an assembly manifest..]
   System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures) +550
   System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +132
   System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath) +90
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +135
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +516

[HttpException (0x80004005): The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load file or assembly 'file:///D:\Projects\Development\ProGamers\GamingSite\bin\avcodec-52.dll' or one of its dependencies. The module was expected to contain an assembly manifest..]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9850940
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101
   System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +456

你能通过程序集绑定日志查看器从绑定获取日志吗?请确保先将设置设置为记录所有绑定。 - rene
Assembly.LoadFrom() 无法在像 avcodec-52.dll 这样的 DLL 上工作,因为它不是 .NET 程序集。如果您不发布代码片段,为什么您的代码尝试以这种方式加载它完全不清楚。 - Hans Passant
Hans,我没有手动使用汇编语言,在控制台应用程序中它运行得很好。只有当我从我的ASP.NET应用程序引用它时才会出现问题。而我唯一的使用就是引用Awesomium dlls。 http://awesomium.com - Aviran Cohen
1
你能选择一个答案吗?是什么解决了你的问题?你的问题解决了吗? - tgabb
9个回答

43

我发现,我使用的InstallUtil与目标.NET Framework不同。我正在构建一个.NET Framework 4.5,如果我使用.NET Framework 2.0版本则会出现错误。使用正确的InstallUtil解决了这个问题!


15

BadImageFormatException,根据我的经验,几乎总是与x86和x64编译的程序集有关。听起来你的C++程序集是为x86编译的,而你正在运行一个x64进程。是这样吗?

与其使用AnyCPU/Mixed作为平台,请尝试手动将其设置为x86,看看是否会在此之后运行。


2
我的机器是x86架构的,C++汇编语言也很可能是x86架构的。我尝试手动将这两个项目都设置为x86架构,但是没有成功。 - Aviran Cohen
这解决了我的问题。显然我的程序集是为x86编译的,它不喜欢在x64项目中编译。 - h0r53
你真的解释了我的整个情况。谢谢!哇。 - WLFree

6

首先尝试使用类似ILSpy的反编译工具打开文件,您的dll可能已经损坏。我在一个在线网站上遇到了这个错误,当我下载dll并尝试打开它时,它已经损坏了,可能是通过ftp上传时发生了一些错误。


我没想到这会是我的情况。但事实就是如此。我的DLL是空的。我没有从错误信息中预料到这一点。 - Rainer

3
我在以下情况下遇到了错误:
  1. 一个.NET EXE文件(#1)引用了另一个.NET EXE文件(#2)
  2. 我试图使用Themida混淆EXE #2
  3. 运行EXE #1时,出现错误"The module was expected to contain an assembly manifest"
我简单地避免了混淆,错误就消失了。虽然不是真正的解决方案,但至少我知道是什么原因导致了这个错误...

对我来说,我正在使用 Reactor 对主应用程序和更新程序进行混淆。当在 x86 文件存根 / Native EXE 选项上同时使用时,几乎立即会出现这种情况,其中一个是 AnyCPU。在我的情况下,我的更新程序必须“优先选择 32 位”。 - WLFree

3

2

检查清单文件是否是有效的xml文件。我曾经遇到了同样的问题,通过在构建结束时执行DOS复制命令,结果发现由于某些我无法理解的原因,“copy”在清单文件末尾添加了一个奇怪的字符(->)。通过添加"/b"开关来强制进行二进制复制解决了这个问题。


0
我发现了另一个奇怪的原因,我认为可能是另一位开发人员和我一样感到困惑。我运行了install.bat来在VS2010的开发人员命令提示符下安装我的服务,但我的服务是在VS2012中生成的。这导致了错误并让我陷入疯狂,但我尝试了VS2012的开发人员命令提示符工具,一切都恢复正常了。我不知道为什么,但我的问题得到了解决。所以你可以测试一下,如果有人知道原因,请与我们分享。谢谢。

0

删除 .InstallState 文件并重新安装服务解决了我的问题。


0
在我的情况下,是因为代码试图为一个不是C#程序集的DLL创建AssemblyCatalog。 很容易捕获BadImageFormatException并忽略任何此类DLL。 不幸的是,Visual Studio(至少2017版)无法在BadImageFormatException上中断。(它在Debug -> Windows -> Exception Settings -> Common Language Runtime Exceptions -> System.BadImageFormatException中假装允许这样做,但实际上并不起作用。)所以我花了相当长的时间来追踪这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接