簡體   English   中英

使用通過ILMerge創建的庫中的程序集

[英]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`
}

我確保包裝中包含的程序集AB引用的程序集相同。

我在這里想念什么嗎?

更新更多上下文

我們有一個數據模型項目,其中有很多相關項目(首先我知道這很不好,但是它的遺留代碼:-(),所以我想將所有這些程序集合並為一個,以便更多地使用該數據模型程序集在多種解決方案中輕松實現。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM