2

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

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

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

如果可以相信此博客条目,我会因为执行以下操作而收到此错误:

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

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

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

4

2 回答 2

2

我让它工作,我认为这是通过做两件事:

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

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

于 2010-07-19T19:03:33.720 回答
0

您是否仔细检查了您正在使用的 ILMerge 版本?

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

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

于 2010-07-19T16:45:57.337 回答