有無論如何都有可以加載/卸載的ClassLibrary插件。我發現的唯一方法是使用AppDomain,但由於插件無法使用主機API,因此失敗了。C#加載/卸載插件
3
A
回答
3
是的我用1.1 2.0和3.5做了這個。另外MS現在有MEF,這可能是你想要的。
1
當你說「插件無法使用主機API,」你的意思是你需要你的插件來訪問他們的主機的代碼?如果是這樣,那聽起來就像是想要一個循環依賴,這是不允許的,不管你的代碼是否可動態加載/不加載。如果插件需要訪問主機的API,你應該提取接口的是API,並把它放在一個共享庫,這兩個插件和主機應用程序可以訪問:
Plugin -> PluginLib <- Host
然後主機可以注入其API對象插入到插件的屬性/構造函數中,以便插件可以調用API方法。理想情況下,你的插件庫不應該依賴主機庫。解決依賴問題後,使用AppDomain進行動態加載/卸載應該沒問題。
1
CLR只能卸載整個AppDomain,而不是程序集。但是,在多個應用程序域中加載相同的程序集沒有問題。
這意味着您可以將程序集A中的類型實例注入到裝入程序集B的新AppDomain中.B然後可以使用程序集A中的實例與主AppDomain進行交談。只要你不從組件B'通過邊界'傳遞任何類型,你就可以卸載appdomain並從內存中移除組件B.
看看在MarshalByRefObject約傳球情況下對應用程序域邊界
更多信息相關問題
- 1. MEF加載和卸載特定插件?
- 2. 卸載VSTO插件
- 3. C#卸載事件
- 4. 如何卸載IE插件
- 5. 如何卸載redmine插件?
- 6. 如何卸載Rails插件?
- 7. 卸載Eclipse插件錯誤
- 8. 卸載eclipse插件 - linux
- 9. 如何卸載sysdeo插件
- 10. 卸載Apache Geronimo Eclipse插件?
- 11. 如何卸載FireBreath插件
- 12. jQuery加載/卸載?
- 13. 如何加載/卸載瓦塊快(C#)
- 14. 卸載主應用程序時卸載插件
- 15. 當「卸載...」按鈕被禁用時,卸載Eclipse插件
- 16. 腳本仍在加載卸載的插件?
- 17. MEF插件在程序執行期間加載和卸載
- 18. 如何動態地加載和卸載TinyMCE插件
- 19. MEF - 通知何時加載/卸載插件
- 20. golang:如何卸載已經加載的「go插件」1.8
- 21. 卸載加載Headjs的JS文件
- 22. 防止卸載控件動態加載
- 23. 加載和卸載組件AppDomain.Load(字節)
- 24. Crystal Reports加載卸載處理事件
- 25. 動態加載/卸載Javascript
- 26. 加載/卸載onClick Javascript
- 27. 卸載加載的Javascript
- 28. 卸載類加載器
- 29. 加載和卸載圖像
- 30. 卸載MS Word加載項
你能解釋一下你所說的「插件無法使用主機API。」是什麼意思? – Jacob 2011-05-16 20:28:41
如果插件引用了主機,那麼當您將其加載到另一個AppDomain中時,我假設它再次在該AppDomain中加載主機,因爲沒有設置任何內容。 – Will 2011-05-16 20:34:58