2011-05-16 222 views
3

有無論如何都有可以加載/卸載的ClassLibrary插件。我發現的唯一方法是使用AppDomain,但由於插件無法使用主機API,因此失敗了。C#加載/卸載插件

+2

你能解釋一下你所說的「插件無法使用主機API。」是什麼意思? – Jacob 2011-05-16 20:28:41

+0

如果插件引用了主機,那麼當您將其加載到另一個AppDomain中時,我假設它再次在該AppDomain中加載主機,因爲沒有設置任何內容。 – Will 2011-05-16 20:34:58

回答

1

當你說「插件無法使用主機API,」你的意思是你需要你的插件來訪問他們的主機的代碼?如果是這樣,那聽起來就像是想要一個循環依賴,這是不允許的,不管你的代碼是否可動態加載/不加載。如果插件需要訪問主機的API,你應該提取接口的是API,並把它放在一個共享庫,這兩個插件和主機應用程序可以訪問:

Plugin -> PluginLib <- Host 

然後主機可以注入其API對象插入到插件的屬性/構造函數中,以便插件可以調用API方法。理想情況下,你的插件庫不應該依賴主機庫。解決依賴問題後,使用AppDomain進行動態加載/卸載應該沒問題。

1

CLR只能卸載整個AppDomain,而不是程序集。但是,在多個應用程序域中加載相同的程序集沒有問題。

這意味着您可以將程序集A中的類型實例注入到裝入程序集B的新AppDomain中.B然後可以使用程序集A中的實例與主AppDomain進行交談。只要你不從組件B'通過邊界'傳遞任何類型,你就可以卸載appdomain並從內存中移除組件B.

看看在MarshalByRefObject約傳球情況下對應用程序域邊界

更多信息