我試圖構建一個插件體系結構,其中的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。它似乎可能適用,但我不能完全說明(我不太明白爲什麼這個答案適用於這個問題)。
什麼會處理它自己看起來像? –
https://msdn.microsoft.com/zh-cn/library/ff527268(v=vs.110).aspx – Jeff