簡體   English   中英

如何使用C#加載程序集並在其中獲取所有類型(無ReflectionTypeLoadException)

[英]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:測試。

  • 測試和dummy_assembly都引用Core。
  • Dummy_assembly是我壓縮過的dll,正在嘗試解壓縮,加載然后搜索。
  • 測試是從中調用上面顯示的方法的程序集。
  • 上面顯示的代碼位於Core中。

我看這個 看來這可能適用,但我無法完全說出具體方法(而且我不太理解為什么該答案適用於該問題)。

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

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

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

如果您在另一個目錄中引用了dll,則還可以處理AppDomain.AssemblyResolve事件並自己處理。

在gettypes代碼周圍添加一個try / catch塊。 確保將日志記錄到無法出於調試目的而加載程序集的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM