簡體   English   中英

在動態加載的程序集dll中找到特定的c#類類型

[英]find specific c# class type in dynamically loaded assembly dll

我有一個基礎課...

public abstract class PluginBase
{
    ...
}

...我有一個派生類...

public class Plugin : PluginBase
{
    ...
}

...內置到MyDll.dll


我的目標是從MyDll.dll的實現創建PluginBase類型的實例。

這是我的代碼。

我加載.dll並遍歷每種類型。 我標記了應該進行類型檢查的地方。

Assembly a = Assembly.LoadFrom("pathto\MyDll.dll");
foreach (Type t in a.GetTypes())
{
    Boolean isAssignableFrom = /* TODO INSERT TYPE CHECK */
    if (isAssignableFrom)
    {
        PluginBase plugin = (PluginBase) Activator.CreateInstance(t);
        plugin.Initialize();
    }
}

問題是我無法從啟動項目的解決方案中將加載的.dll中的類型與“相同”類型進行匹配。

這是調試器中有關“正確”類型和已加載類型的摘要:

+ t {Name = "Plugin" FullName = "...plugins.MyPlugin.Plugin"}   System.Type {System.RuntimeType}
+ t.BaseType    {Name = "PluginBase" FullName = "...Plugin.PluginBase"} System.Type {System.RuntimeType}
+ typeof(PluginBase)    {Name = "PluginBase" FullName = "...Plugin.PluginBase"} System.Type {System.RuntimeType}

如您所見,在程序PluginBase找到的類型(變量t )具有PluginBase作為.BaseType

我嘗試了以下相等檢查,所有檢查均返回false

+ t is PluginBase
+ t == typeof(PluginBase)
+ typeof(PluginBase).IsAssignableFrom(t)
+ t.BaseType is PluginBase
+ t.BaseType == typeof(PluginBase)
+ typeof(PluginBase).IsAssignableFrom(t.BaseType)

如果我忽略該檢查並嘗試創建一個實例,則在嘗試對其進行強制轉換時出現后續錯誤,異常消息如下:

System.InvalidCastException:'無法將類型為'... plugins.MyPlugin.Plugin'的對象轉換為類型為'... Plugin.PluginBase'的對象。

我認為應該可以的演員表。

我還清理了整個解決方案並重建了所有內容,因為我認為原因可能是過時的.dll或類似的東西-它沒有幫助。

我想念什么?

好吧,我設法在這篇文章中找到了解決方案。 盡管我在問我的問題之前檢查了其他帖子,但仍然沒有碰到過這個帖子。

但是,解決方案是使用相同的.dll。

盡管.dll文件是相同的,但程序認為它是不同的,因為它不在同一位置。

為此,我只是在派生類的build目錄中刪除了基類的.dll文件。

對我來說,這解決了兩個問題。 一個具有匹配類型並創建實例的對象。

暫無
暫無

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

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