【问题标题】:The module was expected to contain an assembly manifest该模块应包含程序集清单
【发布时间】:2012-08-26 22:34:15
【问题描述】:

我有一个使用 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. 2 files with the same dll/exe name causing conflict - 我没有。

  5. Change the platform of the solution 到 AnyCPU/混合平台。

堆栈跟踪:

[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

【问题讨论】:

  • 您能从与Assembly Binding log viewer 的绑定中获取日志吗?确保首先将设置设置为记录所有绑定。
  • Assembly.LoadFrom() 不能在 avcodec-52.dll 之类的 DLL 上工作,它不是 .NET 程序集。如果您不发布 sn-p,为什么您的代码会尝试像这样加载它是完全不清楚的。
  • Hans 我没有手动使用 Assembly,它在控制台应用程序中运行良好。只有当我从我的 ASP.NET 应用程序中引用它时才会出现问题。我做的唯一用途是引用 Awesomium dll。 awesomium.com
  • 你能选择一个答案吗?什么解决了你的问题。您的问题解决了吗?

标签: c# badimageformatexception


【解决方案1】:

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

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

希望这会有所帮助。

【讨论】:

  • 我的机器是 x86,c++ 程序集也可能是 x86。我尝试将这两个项目手动设置为 x86,但它不起作用..
  • 这解决了我的问题。显然我的程序集是为 x86 编译的,它不喜欢在 x64 项目中编译。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          我在以下情况下遇到错误:

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

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

          【讨论】:

            【解决方案7】:

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

            更多信息在这里Exe installation throwing error The module was expected to contain an assembly manifest .Net Core

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多