2014-09-23 32 views
2

對於我正在構建的應用程序,我們使用MEF創建插件系統。每個插件都是用它自己的依賴關係(引用)構建的,並最終被複制到應用程序知道關閉的指定文件夾中並查找插件。複製是使用後構建腳本btw完成的。MEF - 插件及其引用的程序集

問題是我們有單獨的插件可能會引用不同版本的相同程序集。爲此,我們有了一個想法,我們應該讓每個插件都在插件文件夾中創建它自己的文件夾,以防止程序集相互覆蓋。但後來我們得到異常,因爲AppDomain不知道要查找插件所需的引用。我們確實發現我們可以提供探索的途徑。但是這意味着必須在app.config中註冊每個插件。我們希望以更通用的方式來做到這一點。

該應用程序不是一個Web應用程序。這是一個控制檯應用程序,將作爲服務器,我們稱之爲外殼。組件對於shell而言是未知的,但僅對於shell的插件。這些插件對於shell而言並不是已知的,而是由MEF發現的。將外殼和插件粘在一起的唯一東西就是界面。

我真的被困在這個項目上,並希望我能得到任何幫助。這是一個.Net框架問題,而不是MEF的問題,但我想我會畫出一個情況。

+0

查看'BuildManager.AddReferencedAssembly'方法和'PreApplicationStartMethodAttribute'。在它的幫助下,您可以在生命週期的早期將程序集添加到應用程序的引用程序集。我不確定他們是否可以幫助您使用引用不同版本的相同程序集的不同插件。 – 2014-09-23 11:09:04

+0

感謝Ilija的回覆。該應用程序不是一個Web應用程序。這是一個控制檯應用程序,將作爲服務器,我們稱之爲外殼。組件對於shell而言是未知的,但僅對於shell的插件。這些插件對於shell而言並不是已知的,而是由MEF發現的。將外殼和插件粘在一起的唯一東西就是界面。 – Bosken85 2014-09-23 13:53:27

回答

1

使用探測路徑的替代方法是使用AppDomain.AssemblyResolve event。每當.NET無法加載程序集時,它將引發此事件,這將允許您自己查找和加載程序集。它可能並不是最乾淨的解決方案,但它確實給了您將程序集放入適合您的任何結構的靈活性。

+0

謝謝您的回覆!我會研究這一點,並在測試後更新答案。 – Bosken85 2014-09-29 14:07:44

相關問題