【问题标题】:BadImageFormatException with .NET ILMerged DLL in Windows 7 64BadImageFormatException 与 Windows 7 64 中的 .NET ILMerged DLL
【发布时间】:2011-03-18 00:18:29
【问题描述】:

我正在使用 Visual Studio 2008 在 64 位 Windows 7 中进行开发。我有一组类库,我使用 ILMerge 将它们合并到一个 DLL 中。但是,当我尝试使用这个合并的 DLL 时,我得到了

[BadImageFormatException: 无法加载文件或程序集“MyMergedDll”或其依赖项之一。试图加载格式不正确的程序。]

我一直在寻找这方面的帮助,看起来我需要将 MyMergedDll 中每个项目中的 Build 属性设置为以 x86 为目标,所以我这样做了。我还在 Web 服务中设置了所有非 MSTest 项目,其中我将 MyMergedDll 引用为目标 x86。但是,我仍然收到此错误。

如果this blog entry 是可信的,我会因为这样做而得到这个错误:

public class SpecificClass: BaseClass: where T : class { }

也就是说,对泛型具有类约束。不过,博客条目是 2007 年的,所以我不知道这是否仍然适用。在我追踪项目中的每个泛型类以检查约束之前,我想从 StackOverflow 获得一些关于你们认为问题所在的意见。

如果重要,MyMergedDll 是强名称签名的。我正在尝试在控制台应用程序和 Web 服务中使用 MyMergedDll。我不知道每次重建 Web 服务时 IIS 是否都在更新,这是否会使事情变得复杂。使用控制台应用程序,我似乎只在以发布模式构建时获得BadImageFormatException

【问题讨论】:

  • 您能否澄清几点: 1. 您是否在运行 ILMerge 时或在应用程序执行期间收到错误?
  • 单个项目 DLL 与 ILMerge 很好地合并。使用合并的 DLL 的控制台应用程序和 Web 服务构建良好。当我 a) 运行我的控制台应用程序或 b) 访问运行 Web 服务的 Web 服务器上的 .asmx 文件时,我得到了错误。

标签: .net generics 64-bit ilmerge badimageformatexception


【解决方案1】:

我让它工作了,我认为这是因为做了两件事:

  1. MyMergedDLL 是使用我可以控制的其他几个程序集构建的,但这些程序集未设置为针对 x86。我重建了那些面向 x86 的程序集,重建了构成 MyMergedDLL 的程序集,并重新合并了这些程序集以形成 MyMergedDLL 的新副本。
  2. 使用 MyMergedDLL 的控制台应用程序在调试模式下设置为以 x86 为目标,而不是在发布模式下,因此它可以在调试模式下工作但在发布模式下提供 BadImageFormatException

第一件事可能没有必要。我想我只需要 MyMergedDLL 的使用者在发布模式下也以 x86 为目标。我永远无法弄清楚我使用的是哪个版本的 ILMerge,所以我只是用我可以在 Microsoft 网站上找到的最新 MSI 重新安装它。

【讨论】:

    【解决方案2】:

    您是否仔细检查过您使用的 ILMerge 版本?

    我问是因为一个旧的、不正确的 aspnet_merge 版本(它基本上对 dll 进行了相同的合并)导致我们遇到了与您描述的相同的问题。在为 SO 上的其他人回答 this 问题时,我进行了一些详细说明。

    可能值得快速查看一下 ILDASM 中的 dll(在尝试反编译这些坏 dll 时,Reflector 往往会翻倒 - 可能并不奇怪),看看您是否可以找出损坏点以及对应的内容您的代码,因为它可能会阐明问题。

    【讨论】:

    • 如何查看 ILMerge 版本?我试过-v-V--version-h,但没有运气。 C:\Program Files (x86)\Microsoft\ILMerge 中仅有的文档是 ILMerge License.rtf 和 ILMerge.doc,它们似乎都不包含版本。它们看起来在 2009 年进行了修改。我将在合并的 DLL 上尝试 ILDASM,谢谢。
    • 这是我第一次使用 ILDASM。它应该在某处窒息并显示一些错误消息吗?当我在其中打开合并的 DLL 时,我没有看到任何异常,只是命名空间层次结构。
    • @Sarah - 它不会自己窒息,但它生成的 IL 有错误,例如 [SIGNATURE ENDED PREMATURELY],IIRC 有关于“找不到类型”的错误。正是这些错误的存在让我们找出了它有问题的代码。事实证明,在我们的例子中,是 lambda 表达式的问题,这(最终)导致我们转向早于 .Net 3.5 的 ILMerge 版本。绝对值得确保您使用的是最新的 ILMerge,只是为了确定。
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多