将 PostSharp 与 ILMerge 一起使用时出现问题

本文关键字:问题 PostSharp ILMerge 一起 | 更新日期: 2023-09-27 17:56:22

我正在创建一个应用程序,我想将其作为单个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 年发现了这篇关于将 PostSharp 与 ILMerge 一起使用的问题的博客文章,但它们似乎围绕着一个用例,该用例有多个使用 PostSharp 的库与主 exe 合并。我的情况要简单得多:

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

重现该问题的最小方法是仅对单个 exe 进行 ILMerge 并将其余依赖项保留为单独的 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:我有一个实现 MethodInterceptionAaspect 的抽象属性类,然后是两个扩展它的具体类。

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

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

将 PostSharp 与 ILMerge 一起使用时出现问题

正如@stakx所建议的,我选择了 ILMerge 的替代方案。它现在与 LibZ 配合得很好。