2015-06-16 44 views
2

我正在創建一個應用程序,我想將其作爲單個exe文件發佈,或者儘可能接近。起初,我嘗試使用ILMerge捆綁所有的依賴,但發現這會導致PostSharp失敗,出現以下異常:與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與原來的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

您正在使用哪個版本的PostSharp?我在VS2013下創建了Console項目,添加了PostSharp 4.1.15,創建了抽象攔截方面和兩個派生方面,並將它們應用於靜態方法。然後我使用了在生成的EXE上提供的ILMerge(最新的ILMerge)命令。原始EXE和合並結果都執行無問題並通過peverify。你看到有什麼不同嗎?你能否相應地更新描述?謝謝! –

+0

我正在使用4.0.42,通過PostSharp Nuget包。我將調查最小的複製,以及更新到更新的版本。 –

+0

我用4.1.15創建了一個最小測試項目,它的工作很好,和Daniel Balas一樣。我將試着弄清楚如何用最小的例子重現問題。 –

回答

0

正如@stakx所建議的,我選擇了ILMerge。它現在與LibZ很好地合作。