[英]Use assembly from a library which has been created through ILMerge
我已經使用工具ILMerge創建了一個程序包。
有一個程序集(稱為A
)是該打包的程序集的一部分,該程序集將由另一個程序集使用,而該程序集不包含在該程序包中(稱為B
)。
現在我要做的是創建一個引用打包的程序集和B
。 現在,我想這樣做:
public void Foo()
{
var obj = new Bar(); // Bar is part of `A`
var someFactory = new Factory(); // is part of `B`
someFactory.DoSomething(obj);
// compiler error here, which says I need to reference the assembly which contains `Bar`
}
我確保包裝中包含的程序集A
和B
引用的程序集相同。
我在這里想念什么嗎?
更新更多上下文
我們有一個數據模型項目,其中有很多相關項目(首先我知道這很不好,但是它的遺留代碼:-(),所以我想將所有這些程序集合並為一個,以便更多地使用該數據模型程序集在多種解決方案中輕松實現。
B
引用A
,而不是您構想的任何怪異的,笨拙的合並程序集。 它可能包含A
所有類型,但不是 A
-程序集標識很重要。 MyMergedPackage.Bar
不是A.Bar
,即使他們使用與名稱空間完全相同的類型名稱。
有多種可能的解決方案。
首先也是最明顯的是,您也可以簡單地合並B
在典型的ILMerge方案中,您將所有程序集(包括主可執行文件)合並到一個光榮的奇點中,因此不會出現此問題。 我假設您有充分的理由不這樣做。
您可以簡單地將合並的程序集稱為A
,即使它是A
加更多功能。 如果A
具有強名,則需要為合並的程序集使用相同的名稱(版本和全部)。 這樣可以使B
滿意,這也許就足夠了,但是如果您開始添加想要整體的一部分的多個程序集,那么它將不起作用(您不能簡單地以不同的名稱來復制A
,因為類型不會被識別為相同的名稱)。
如果您的.NET版本足夠新,則可以創建一個新程序集A
,該程序集僅包含將Bar
轉發給新程序集的類型。 這個A
只會是原始內容的占位符,並且只會分發給B
和其他朋友以使他們開心。 如果您使用這種方式有很多類型,那么這很尷尬,您需要自動幫助。 我還沒有立即知道。 在大多數情況下,它還是會破壞合並點,因為無論如何您最終都會再次遇到多個程序集。
在編譯時,只需使用單獨的程序集。 部署時,將它們全部替換為合並的部件。 使用AppDomain.AssemblyResolve
處理程序在代碼中進行分類,以在運行時修復實際的類型加載(只需將所有未知數重定向到合並的程序集)。 這可能需要謹慎修改,以確保事件在運行時需要查找任何引用的程序集之前觸發(靜態構造函數可能會在這里破壞您的樂趣)。
免責聲明:我沒有測試過這些解決方案中的任何一個; 如果不起作用,請及時通知我,以便我解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.