2016-07-30 30 views
0

我試圖構建一個插件體系結構,其中的dll包含在zip文件中,解壓縮,存儲,然後加載,以便特定類型可以被構建和使用。理論上,這聽起來可行。但是我遇到了問題。我不斷收到如何使用C#加載程序集並獲取其中的所有類型(不包含ReflectionTypeLoadException)

ReflectionTypeLoadException。

這裏就是我有一個不工作:

 var dlls = pluginFiles.Where(p => p.Value.FileInfo.Extension.ToLower() == ".dll").ToList(); 
     int num = 0; 
     foreach(var dll in dlls){ 
      var assembly = Assembly.LoadFile (dll.Value.FileInfo.FullName); 
      var pluginTypes = assembly.GetTypes().Where (p => p.IsSubclassOf (typeof (Plugin))); 
      foreach(var pluginType in pluginTypes){ 
       var ctor = pluginType.GetConstructors().FirstOrDefault(); 
       if (ctor == null) continue; 
       var plugin = (Plugin)ctor.Invoke (new object [] { }); 
       if (plugin == null) continue; 
       num++; 
       _mgr.RegisterNew (plugin); 
      }      
     } 

正如我在調試步進通過這個,異常發生在那裏我運行assembly.GetTypes()行。

我在這裏做錯了什麼?我應該做一些新的AppDomain嗎?

更多信息:我正在加載的程序集是一個測試程序集。它確實提到了FakeItEasy。它有一個班級,這是我正在尋找的班級。那個特定的類是另一個類的子類,它在我的調用類引用的程序集中...看起來很混亂。讓我這樣解釋:

裝配1:核心,裝配2:Dummy_assembly,裝配3:測試。

  • 測試和dummy_assembly參考核心。
  • Dummy_assembly是我壓縮並試圖解壓,加載,然後搜索的dll。
  • 測試是我調用上面顯示的方法的程序集。
  • 上面顯示的代碼位於Core中。

我看了看this。它似乎可能適用,但我不能完全說明(我不太明白爲什麼這個答案適用於這個問題)。

回答

0

如果程序集包含無法加載的類型,則會拋出(通常是因爲在無法解析的程序集引用上)......對此無能爲力。

但是你可以捕捉異常並檢查Types屬性並獲取可以成功加載的類型。

https://msdn.microsoft.com/en-us/library/system.reflection.reflectiontypeloadexception.types(v=vs.110).aspx

如果您在另一個目錄中引用的DLL,你也可以處理AppDomain.AssemblyResolve事件和自己處理。

+0

什麼會處理它自己看起來像? –

+0

https://msdn.microsoft.com/zh-cn/library/ff527268(v=vs.110).aspx – Jeff

0

圍繞gettypes代碼添加try/catch塊。確保在某處無法加載程序集以進行調試。

相關問題