2009-11-05 54 views
6

我正在合併幾個使用ILMerge包括一些第三方程序集的.NET程序集。由於這樣做,我遇到了幾個錯誤,這些錯誤都歸結爲類型定義與它們定義的程序集綁定的事實。合併程序集中的.NET類型定義(ILMerge)

一個簡單的示例是我的App.config中的log4net config部分定義。它使用type =「log4net.Config.Log4NetConfigurationSectionHandler,log4net」,這將不起作用,因爲log4net程序集一旦合併到我的合併程序集中就不存在。雖然沒有什麼大不了的,但我將程序集名稱更改爲我的合併程序集,並且工作正常。

一個稍微複雜的例子是二進制序列化類型。我的系統使用二進制序列化在進程之間發送某些對象。所有可序列化的對象都是在所有其他項目引用的常見程序集中定義的。我使用的是默認的二進制序列化,但是在反序列化帶有錯誤的對象時,它開始失敗,說明它找不到序列化對象的合併程序集。再次,不是什麼大不了的,我實現了一個自定義的SerializationBinder,它在任何加載的程序集中查找類型,而不僅僅是給定的類型。

上一個示例在序列化類型引用其他可序列化類型時變得更加複雜。我一直遇到越來越多的問題,越來越難以處理。

我在這裏試圖得到的一點是,.NET類型系統和ILMerge看起來不能很好地一起玩。有沒有人有他們如何解決這個問題的經驗?是否有可能告訴.NET運行時,我不在乎它應該在什麼類型的程序集中,只需在任何地方查找它?

注意:請不要回復問我爲什麼合併程序集,這不是這個問題的要點。

+0

WAG:試過DataContractSerializer了嗎?您將無法使用NetDataContractSerializer,因爲它必須與類型綁定,但普通的舊DCS應該適合您... – Will 2009-11-05 18:22:27

回答

-2

歡迎字符串的危險和代碼(物理位置)的字符串..

所有該類型的工具也有類似的問題,他們更聰明,因爲許多開發者和運行特點的設計師,如結合和序列化並沒有真正設想它,但他們肯定會推動ILMerge成爲一個'聰明'的工具。它非常聰明,甚至不能修剪類型。

請注意版本控制也在這裏發揮作用,配置,。*和明星在他們的眼睛,以及從雷德蒙德版本獨立也沒有幫助。

你肯定會一直跟第三方比特碰到麻煩。相信我,我知道你需要合併,因爲一些可憐的少數類型可能需要很長時間才能讓MS JIT開啓大型應用程序(並且不會,我不希望NGEN或優化的3.5SP1加載比以前更慢由於System.Core或天堂禁止WPF膨脹)。

最好的選擇,恕我直言,至少在大規模,是得到一個體面的商業工具,掃描和處理(即從現有的痛苦和迷惑體驗)。從長遠來看,如果你沒有源代碼,你最終可能會使用現有的IL代碼。

[然後有一個字符串INotifyPropertyChanged的發明,其所以解決全球變暖問題 - 卡西歐 - 計算器發明人設計]

4

是的,有這個問題的解決方案:構建模塊,而不是組件!

.net的編譯器有一個選項(/ target:用於C#和VB的模塊),用於構建模塊而不是程序集。然後可以將多個模塊傳遞給編譯器並用於構建最終裝配。

當然,這一切都假設你已經獲得了第三方組件的源代碼。如果你不能得到這些,第三方程序集的.n​​et模塊版本可以從第三方購買?

如果這樣做不起作用,您仍然有最後一個選項。顯然你已經將第三方程序集拆分爲IL。從該IL文件中刪除程序集信息,並使用「ilasm/dll」來構建.net模塊,您現在應該可以像使用其他.net模塊一樣使用.net模塊!

通過使用模塊而不是程序集,您不應該有任何更多的基於程序集的問題。

確實,我們已經通過不再使用ILMerge解決了您的ILMerge問題,但這不是最好的解決方案嗎?

希望它爲你工作,這裏的一些方便的鏈接:
.netmodule instead of assembly
ILASM with .netmodules

(在這裏,我想,我的.netmodules經歷不會是有用的人!)

0

幾個在問題發生多年後,我遇到了同樣的問題並找到了解決方案。您可以將[assembly: log4net.Config.XmlConfigurator(ConfigFile = "logging.config", Watch = true)]添加到AssemblyInfo.cs文件中,這將在合併log4net程序集時起作用。

相關問題