![](/img/trans.png)
[英]C# set accessor accessible to all types in assembly, and get assessor only to derivated types. How to?
[英]How to load an assembly and get all types in it with C# (without ReflectionTypeLoadException)
我正在嘗試構建一個插件架構,在其中將dll包含在zip文件中,然后將其解壓縮,存儲然后加載,以便可以構造和使用特定類型。 從理論上講,這聽起來是可行的。 但我對此有疑問。 我不斷得到
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:虛擬組裝,組裝3:測試。
我看這個 。 看來這可能適用,但我無法完全說出具體方法(而且我不太理解為什么該答案適用於該問題)。
如果程序集包含無法加載的類型,則它將拋出(通常是因為在無法解析的程序集引用上)...對此無能為力。
但是您可以捕獲異常並檢查Types屬性,並獲取可以成功加載的類型。
如果您在另一個目錄中引用了dll,則還可以處理AppDomain.AssemblyResolve事件並自己處理。
在gettypes代碼周圍添加一個try / catch塊。 確保將日志記錄到無法出於調試目的而加載程序集的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.