我正在合併幾個使用ILMerge包括一些第三方程序集的.NET程序集。由於這樣做,我遇到了幾個錯誤,這些錯誤都歸結爲類型定義與它們定義的程序集綁定的事實。合併程序集中的.NET類型定義(ILMerge)
一個簡單的示例是我的App.config中的log4net config部分定義。它使用type =「log4net.Config.Log4NetConfigurationSectionHandler,log4net」,這將不起作用,因爲log4net程序集一旦合併到我的合併程序集中就不存在。雖然沒有什麼大不了的,但我將程序集名稱更改爲我的合併程序集,並且工作正常。
一個稍微複雜的例子是二進制序列化類型。我的系統使用二進制序列化在進程之間發送某些對象。所有可序列化的對象都是在所有其他項目引用的常見程序集中定義的。我使用的是默認的二進制序列化,但是在反序列化帶有錯誤的對象時,它開始失敗,說明它找不到序列化對象的合併程序集。再次,不是什麼大不了的,我實現了一個自定義的SerializationBinder,它在任何加載的程序集中查找類型,而不僅僅是給定的類型。
上一個示例在序列化類型引用其他可序列化類型時變得更加複雜。我一直遇到越來越多的問題,越來越難以處理。
我在這裏試圖得到的一點是,.NET類型系統和ILMerge看起來不能很好地一起玩。有沒有人有他們如何解決這個問題的經驗?是否有可能告訴.NET運行時,我不在乎它應該在什麼類型的程序集中,只需在任何地方查找它?
注意:請不要回復問我爲什麼合併程序集,這不是這個問題的要點。
WAG:試過DataContractSerializer了嗎?您將無法使用NetDataContractSerializer,因爲它必須與類型綁定,但普通的舊DCS應該適合您... – Will 2009-11-05 18:22:27