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

本文关键字:最佳 方法 对象 插件 dll 子类 | 更新日期: 2023-09-27 17:56:19

我有4个类; ABCD

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

这些类位于其自己的 C# 类库 (dll) 项目中。这些类使用Helix3D工具包。

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

  2. 如果我在 dll 中引用 A 类,而A类在主项目中,插件文件夹中的 dll 在动态加载到主应用程序中时会自动找到插件的类子类A类吗?

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

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

对问题1的回答

要动态加载 dll,请查看此答案。它使用反射循环访问程序集中的每个类型,并使用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的回答

只要类位于不同的命名空间中,

就可以具有相同的类名,而不能在同一命名空间中具有相同名称的类。在您的情况下,它们应该位于不同的命名空间中,因此您可以。