2013-06-04 43 views
1

我的應用程序包含一個插件體系結構,其中放置在衆所周知的目錄的子目錄中的符合特定條件的DLL將根據需要加載到應用程序中。共享庫的插件程序集

插件組件並不總是自包含的。某些庫DLL有時是必需的。這些放置在每個插件組件的旁邊。它們不符合插件標準,因此它們不會被加載爲作爲插件,但它們會通過插件加載插件。

有時,多個插件使用同一個庫的完全相同版本。然後在多個插件目錄中有關聯DLL的副本。

這一切都正常工作,直到有人決定他們不需要某個插件並刪除其子目錄。應用程序檢測到這一點很好,所以它不會再嘗試使用該插件。但是,如果該插件具有另一個插件也使用的庫DLL的副本,則可能會遇到異常。

我相信會發生這種情況,因爲.Net只會在應用程序的每次運行中加載該特定版本的庫。而它從中加載的特定文件恰好是首先使用哪個插件的那個文件。如果該插件恰好是被刪除的插件,那麼使用相同庫的任何其他插件都將炸燬,因爲他們嘗試使用現在刪除的DLL。

使用Assembly.LoadFrom(path)加載插件程序集。我不認爲我可以使用LoadFile(路徑),因爲它不能處理對其他DLL的引用。而且我不能使用Load(typename),因爲我擁有的是路徑,而不是類型名稱。

重新啓動應用程序可以解決問題,但目前只發生「手動」,在發生故障後。

有沒有人有任何的建議: -

  • 從問題中恢復,例如通過說服.NET來改變它會查找DLL
  • 說服含插件的Web應用程序在這種情況下
  • 重新架構,以避免問題的自動重新啓動(但是這是一個成熟的在使用的應用程序,所以我的選擇是有限的)
+2

檢查MEF文檔 - 作爲這個具體事情的框架,他們可能有解決方案。 –

回答

0

易華y是用xml標識插件,通用引用及其依賴關係。常見參考部分將包含所有其他插件依賴的dll,並放置在單獨的文件夾中。像下面的東西應該爲你工作:

<CommonReferences> 
    <Dll id="" path="" version=""/> 
    <Dll id="" path="" version=""/> 
</CommonReferences> 
<Plugins> 
    <Plugin id="" path="" version=""> 
    <Dependencies> 
     <DependencyDll id="" path="" version=""/> 
     <DependencyDll id="" path="" version=""/> 
     <DependencyDll id="" path="" version=""/> 
    </Dependencies> 
    </Plugin> 
</Plugins>