在动态加载的程序集dll中查找特定的c#类类型

时间:2017-06-28 15:29:49

标签: c# dll types match .net-assembly

我有一个基类......

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或类似的东西 - 它没有帮助。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

好吧,我设法在this post找到解决方案。虽然我在询问我的问题之前检查过其他帖子,但我仍然没有遇到过这个帖子。

然而,解决方案是使用相同的.dll。

虽然.dll文件是相同的,但程序认为它不同,因为它不在同一个位置。

为此,我只删除了派生类的构建目录中基类的.dll文件。

对我来说,这解决了这两个问题。匹配类型并创建实例的那个。