【问题标题】:The best way to subclass object template in plugin dll?在插件 dll 中子类化对象模板的最佳方法?
【发布时间】:2014-04-03 11:57:24
【问题描述】:

我有 4 节课; ABCD

我想加载这些类基于一些标准动态

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

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

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

【问题讨论】:

  • 感谢 Sam 的编辑,但您有点错过了我的问题的重点。我有类模板 A、B、C 和 D,我想在我的插件中进行子类化。而且这些类不在它们自己的 dll 项目中,而是在主 exe 项目中,因为如果移动到单独的项目中它们会中断(helixes static Overlay.SetCoordinate3D 有一个错误)。
  • 如果您将它们移动到自己的程序集,它们不应该中断,您是否引用了将它们移动到的程序集中的 helix dll?另外,定义中断。
  • 对,对不起。 Overlay.SetCooridnates3D(Vector3f position) 设置画布子相对于底层 Helix3DViewport 的坐标 - 我认为是 WPF3D 视口的子类。我不知道这个魔法是如何做到的,但如果课程在主项目中,它就可以正常工作。一旦移动到一个单独的项目并被引用,同一个类将画布坐标设置为 0,0,无论 Vector3 输入如何。是的,两个项目都引用了 Helix3Dtoolkit。我猜这与对 Helix3DViewport 的访问有关,但这只是一个猜测。
  • 在这里添加信息,如果基类在主项目中并且在单独的项目中被子类化,覆盖仍然有效。只有当基类被移动时,Overlay 才会起作用。

标签: c# dll subclassing


【解决方案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 的答案

您可以拥有具有相同类名的类,只要它们位于不同的命名空间中即可,您不能在同一个命名空间中拥有具有相同名称的类。在您的情况下,它们应该位于不同的命名空间中,这样您就可以了。

【讨论】:

  • 我明白了,废弃当前的主应用内模板并用 IPlugin 替换它们。但是 A、B、C 和 D 类非常庞大,每个都引用了几个库。计划了几百个,它的大小将是巨大的(相对)。有没有办法只继承和扩展插件中的方法?编辑:没关系,我误读了你的答案。
猜你喜欢
  • 2020-03-09
  • 2010-10-11
  • 1970-01-01
  • 2015-07-16
  • 2010-09-29
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多