使用PostSharp与ILMerge的问题

时间:2015-06-16 09:24:27

标签: c# postsharp ilmerge

我正在创建一个应用程序,我希望将其作为单个exe发布,或尽可能接近。最初我尝试使用ILMerge捆绑所有依赖项,但是发现这会导致PostSharp失败并出现以下异常:

System.TypeInitializationException: The type initializer for 'TestClass`1' threw an exception.
 ---> System.TypeInitializationException: The type initializer for 'PostSharp.ImplementationDetails_5c83534c.<>z__a_1a' threw an exception.
 ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
    at PostSharp.ImplementationDetails_5c83534c.<>z__a_1a..cctor()
    --- End of inner exception stack trace ---
    at PostSharp.ImplementationDetails_5c83534c.<>z__a_1a.Initialize()
    at TestClass`1..cctor() in :line 0

我从2008年发现this blog post有关使用PostSharp和ILMerge的问题,但它们似乎以一个用例为中心,该用例有多个库使用PostSharp与主exe合并。我的情况要简单得多:

我有一个使用PostSharp的exe,以及一些不使用PostSharp的第三方库。生成的exe与原始exe具有相同的名称,因此我相信PostSharp应该能够找到这些类。

重现问题的最小方法是ILMerge单个exe并将其余的依赖项留作单独的dll文件。在这个玩具版本中,ILMerge毫无意义 - 我只是在一个exe上运行它。但是,这足以重现问题。

如果不是运行ILMerge而是仅仅保留原始exe,则不会抛出异常。很明显,ILMerge以某种方式干扰了PostSharp。这是我的构建过程正在使用的命令行:

 ilmerge /out:Releases/Prowl-a6/Prowl.exe "/lib:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5" "/targetplatform:v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5" D:\Dropbox\Code\C#\Prowl\Prowl.exe

我在一个地方使用PostSharp:我有一个实现MethodInterceptionAspect的抽象属性类,然后是两个扩展它的具体类。

关于我能做些什么才能使这项工作的想法?

编辑:经过一些调查,我发现只有在实例化包含MethodInterceptionAspects之一的泛型类时才会出现错误。非通用的很好。 Here是演示错误的最小解决方案。

1 个答案:

答案 0 :(得分:0)

根据@stakx的建议,我选择了ILMerge。它现在与LibZ很好地配合。