46

我在 c# 中有一个使用 c++ 库和一些 dll 的项目。当我运行它时,它工作得很好。

该库是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. 2 个具有相同 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
4

8 回答 8

41

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

于 2013-01-22T10:46:34.200 回答
13

BadImageFormatException,以我的经验,几乎总是与 x86 与 x64 编译程序集有关。听起来您的 C++ 程序集是为 x86 编译的,并且您在 x64 进程上运行。那是对的吗?

而不是AnyCPU/Mixed用作平台。尝试手动将其设置为,x86然后查看它是否会运行。

于 2012-09-01T10:49:45.487 回答
3

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

于 2017-07-02T00:56:02.127 回答
2

就我而言,我使用InstallUtil.exe的是导致错误的。要安装 . 在窗口中服务使用命令Net Core的最佳方式。sc

此处提供更多信息Exe 安装引发错误该模块应包含程序集清单 .Net Core

于 2020-06-08T06:49:18.790 回答
1

我发现了另一个奇怪的原因,我想可能是另一个开发者跟我一样困惑。我确实运行了 install.bat,它创建了在VS2010 的开发人员命令提示符中安装我的服务,但我的服务在 VS2012 中生成。它会出现这个错误并让我发疯,但我尝试了 VS2012 开发人员命令提示符工具,一切都好起来了。我不知道为什么,但我的问题已经解决了。所以你可以测试它,如果有人知道原因,请与我们分享。谢谢。

于 2014-03-26T18:14:18.417 回答
1

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

于 2016-08-25T09:41:48.173 回答
1

在以下情况下我得到了错误:

  1. 一个 .NET EXE 文件 (#1) 引用了另一个 .NET EXE 文件 (#2)
  2. 我试图用Themida混淆 EXE #2
  3. 运行 EXE #1 时出现错误“该模块应包含程序集清单”而崩溃

我只是避免了混淆,错误就消失了。不是一个真正的解决方案,但至少我知道是什么原因造成的......

于 2019-06-16T14:59:15.067 回答
0

删除 .InstallState 文件并重新安装服务为我修复了它。

于 2021-05-26T22:31:24.837 回答