2010-07-19 48 views
2

我正在使用Visual Studio 2008在Windows 7 64位中开发。我有一个使用ILMerge合并到单个DLL中的类库集合。当我尝试使用此合并DLL,但是,我得到BadImageFormatException和.NET在Windows 7中ILMerged DLL 64

[BadImageFormatException:未能加载文件或程序集“MyMergedDll”或它的一个依赖。试图加载程序格式不正确。]

我一直在寻找周围帮助,这和它看起来像我需要设置生成属性在每个项目中MyMergedDll目标86,所以我做到了。我还在Web服务中设置了所有非MSTest项目,其中我将MyMergedDll引用为x86目标。但是,我仍然收到这个错误。

如果this blog entry是可以相信的,我能得到这个错误因为这样做的结果是:

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

也就是说,具有一个通用类约束。虽然这篇博客是从2007年开始的,但我不知道这是否仍然适用。我希望从StackOverflow获得一些输入,以了解你们认为问题出在我追踪我的项目中的每个泛型类以检查约束之前。

重要的是,MyMergedDll是强名字签名的。我试图在控制台应用程序和Web服务中使用MyMergedDll。我不知道是否每次重建Web服务时IIS是否更新都可能使事情变得复杂。使用控制台应用程序时,我似乎在构建发行模式时获得BadImageFormatException

+0

您能否澄清一些观点: 1.运行ILMerge时或执行应用程序时是否出现错误? – 2010-07-19 16:36:12

+0

单个项目DLL与ILMerge很好地融合在一起。控制台应用程序和使用合并DLL的Web服务可以正常工作。当我或者a)运行我的控制台应用程序或b)访问运行Web服务的Web服务器上的.asmx文件时,出现错误。 – 2010-07-19 16:44:49

回答

2

我得到它的工作,我认为它是从做两件事情:

  1. MyMergedDLL用一对夫妇的其他组件我有控制权而建,但这些组件中,没有设置目标86。我重建了那些针对x86的程序集,重新构建了组成MyMergedDLL的程序集,并重新合并了这些程序集以形成MyMergedDLL的新副本。
  2. 使用MyMergedDLL的控制台应用程序被设置为以调试模式而不是发布模式为目标x86,因此为什么它可以在调试模式下工作,但在发布模式下使用BadImageFormatException

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

0

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

我问,因为一个旧的,不正确的版本的aspnet_merge(基本上做了相同的dll合并其他事情)导致我们有同样的问题,你正在描述。当我回答this问题时,我进入了一些细节。

这可能是值得快速查看ILDASM中的dll(试图反编译这些坏dll时反射器倾向于 - 也许不明显),并看看你是否可以弄清楚腐败点和相应的在您的代码中,因为它可能会解决问题。

+0

如何检查ILMerge版本?我试过'-v','-V','--version','-h',但没有运气。 C:\ Program Files(x86)\ Microsoft \ ILMerge中的唯一文档是ILMerge License.rtf和ILMerge.doc,它们都不包含版本。他们看起来在2009年被修改过了。我将在我的合并DLL上尝试ILDASM,谢谢。 – 2010-07-19 16:53:39

+0

这是我第一次使用ILDASM。它是否应该在某处窒息并显示一些错误消息?我没有看到任何错误,当我打开我的合并DLL,只是命名空间层次结构。 – 2010-07-19 16:55:26

+0

@Sarah - 它不会自己窒息,但它生成的IL有错误,例如[SIGNATURE ENDED PREMATURELY]和IIRC有关“找不到类型”的错误。这些错误的存在让我们能够确定它遇到的问题是哪一部分代码。事实证明,在我们的例子中,这是lambda表达式的问题,它最终导致我们朝向.Net 3.5版本的ILMerge。绝对值得确保你使用最新的ILMerge我会说,只是为了确保。 – 2010-07-19 18:58:58