我有一个基类......
public abstract class PluginBase
{
...
}
......我有一个派生类......
public class Plugin : PluginBase
{
...
}
...内置于MyDll.dll
。
我的目标是从PluginBase
中的实现创建MyDll.dll
类型的实例。
这是我的代码。
我加载.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}
如您所见,程序集中的类型(变量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或类似的东西 - 它没有帮助。
我错过了什么?
答案 0 :(得分:0)
好吧,我设法在this post找到解决方案。虽然我在询问我的问题之前检查过其他帖子,但我仍然没有遇到过这个帖子。
然而,解决方案是使用相同的.dll。
虽然.dll文件是相同的,但程序认为它不同,因为它不在同一个位置。
为此,我只删除了派生类的构建目录中基类的.dll文件。
对我来说,这解决了这两个问题。匹配类型并创建实例的那个。