将 PostSharp 与 ILMerge 结合使用时出现问题

Problems using PostSharp with 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

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

我有一个使用 PostSharp 的 exe,还有一些不使用 PostSharp 的第三方库。生成的 exe 与原始文件同名,因此我相信 PostSharp 应该能够找到 classes.

重现该问题的最小方法是仅 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 的抽象属性 class,然后是两个扩展它的具体 classes。

关于我可以做些什么来完成这项工作有什么想法吗?

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

根据@stakx 的建议,我选择了 ILMerge 的替代方案。它现在与 LibZ.

配合得很好