在插件dll中子类化对象模板的最佳方法?

时间:2014-04-03 11:57:24

标签: c# dll subclassing

我有4节课; ABCD

我希望根据某些标准动态加载这些类

这些类在他们自己的C#类库(dll)项目中。这些类使用Helix3D Toolkit。

  1. 如何设计一个插件系统,读取插件文件夹中的所有.dll文件,并允许在需要时以某种方式标记或编号(可以是静态值吗?)?

  2. 如果在A类位于主项目中时我在dll中引用A类,那么plugins文件夹中的dll会自动找到A类插件是一个类子类,当dinamically加载到主应用程序?

1 个答案:

答案 0 :(得分:1)

我编辑了你的问题,因为它太长而且冗长(3000个字符)。

回答问题1

要动态加载dll,请查看this answer。它使用反射来迭代程序集中的每个类型,并使用Activator.CreateInstance()来实例化类。

对于你的插件系统,我会创建类似的东西:

在.exe中:

public interface IPlugin
{
    void DoSomething();
}

public class A : IPlugin
{
    public virtual void DoSomething() {}
}

public class B : IPlugin
{
    public virtual void DoSomething() {}
}

public class C : IPlugin
{
    public virtual void DoSomething() {}
}

public class D : IPlugin
{
    public virtual void DoSomething() {}
}

在Dll中:

public class NewA : A
{
    public override void DoSomething() { base.DoSomething() }
}

public class NewB : B
{
    public override void DoSomething() { base.DoSomething() }
}

public class NewC : C
{
    public override void DoSomething() { base.DoSomething() }
}

public class NewD : D
{
    public override void DoSomething() { base.DoSomething() }
}

在您的客户端代码中,针对IPlugin的代码。您的客户端代码不了解具体类ABCD

从你拥有的dll加载你想要的类,并将它们注入IPlugin

回答问题2

只要具有相同类名的类,只要它们位于不同的名称空间中,就不能在同一名称空间中具有相同名称的类。在你的情况下,他们应该在不同的名称空间中,所以你没事。