在动态加载的程序集 dll 中找到特定的 c# class 类型
find specific c# class type in dynamically loaded assembly dll
我有一个基地class...
public abstract class PluginBase
{
...
}
... 我有一个派生的 class...
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 中找到的类型与我启动项目的解决方案中的 "same" 类型。
这是调试器中有关 "correct" 类型和已加载类型的片段:
+ 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}
如您所见,在程序集(变量 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: 'Unable to cast object of type
'...plugins.MyPlugin.Plugin' to type '...Plugin.PluginBase'.'
演员表,我认为应该有用。
我还清理了整个解决方案并重建了所有内容,因为我认为原因可能是过时的 .dll 或类似的东西 - 它没有帮助。
我错过了什么?
好的,我设法在 this post 中找到了解决方案。虽然我在问我的问题之前查看了其他帖子,但我仍然没有遇到这个问题。
不过,解决方案是使用相同的 .dll。
虽然 .dll 文件相同,但程序认为它不同,因为它们不在同一位置。
为此,我刚刚删除了派生 class 的构建目录中基础 class 的 .dll 文件。
对我来说,这两个问题都解决了。匹配类型并创建实例的那个。
我有一个基地class...
public abstract class PluginBase
{
...
}
... 我有一个派生的 class...
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 中找到的类型与我启动项目的解决方案中的 "same" 类型。
这是调试器中有关 "correct" 类型和已加载类型的片段:
+ 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}
如您所见,在程序集(变量 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: 'Unable to cast object of type '...plugins.MyPlugin.Plugin' to type '...Plugin.PluginBase'.'
演员表,我认为应该有用。
我还清理了整个解决方案并重建了所有内容,因为我认为原因可能是过时的 .dll 或类似的东西 - 它没有帮助。
我错过了什么?
好的,我设法在 this post 中找到了解决方案。虽然我在问我的问题之前查看了其他帖子,但我仍然没有遇到这个问题。
不过,解决方案是使用相同的 .dll。
虽然 .dll 文件相同,但程序认为它不同,因为它们不在同一位置。
为此,我刚刚删除了派生 class 的构建目录中基础 class 的 .dll 文件。
对我来说,这两个问题都解决了。匹配类型并创建实例的那个。