我有4节课; A
,B
,C
和D
我希望根据某些标准动态加载这些类
这些类在他们自己的C#类库(dll)项目中。这些类使用Helix3D Toolkit。
如何设计一个插件系统,读取插件文件夹中的所有.dll文件,并允许在需要时以某种方式标记或编号(可以是静态值吗?)?
如果在A
类位于主项目中时我在dll中引用A
类,那么plugins文件夹中的dll会自动找到A
类插件是一个类子类,当dinamically加载到主应用程序?
答案 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
的代码。您的客户端代码不了解具体类A
,B
,C
,D
。
从你拥有的dll加载你想要的类,并将它们注入IPlugin
回答问题2
只要具有相同类名的类,只要它们位于不同的名称空间中,就不能在同一名称空间中具有相同名称的类。在你的情况下,他们应该在不同的名称空间中,所以你没事。