[英]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.