在DLL中实例化插件类

时间:2017-02-09 01:30:45

标签: c#

我正在学习C#,正在研究如何让人们为我写的应用程序编写插件。

首先,我发布了一个他们的代码必须遵守的API(带接口的dll)。

现在,我试图了解如何使用他们的代码。我已经为dll编写了一个测试插件,并将其放入一个插件中。我的脚本正在观看的目录。

我不知道下一步该做什么。

由于API接口是共享的,我的应用程序知道会发生什么。例如,它们应该有一个连接Plugin接口的主类。

// Example api interface:
public interface Plugin {
    void Initialize();
}

// Example of their code:
public class TestPlugin : Plugin {
    public void Initialize() {
      // ... do stuff
    }
}

我的问题是,如何实例化他们的 TestPlugin ,以便我可以正确调用Initialize和其他任何方法?

我有一些想法,但对C#来说还是太新了,不想跳枪。

2 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是使用MEF(托管扩展性框架),也称为System.ComponentModel.Composition库。

如果你这样做,那么图书馆作家会将以下一行放在他们的班级上面:

[Export(typeof(Plugin))]

然后创建一些MEF类来导入任何插件。从您从文件夹加载时开始DirectoryCatalog

DirectoryCatalog pluginDir = new DirectoryCatalog("Plugins");
CompositionContainer mefContainer = new CompositionContainer(pluginDir);

然后从您的目录中创建CompositionContainer(如上所示)。现在你可以让一个标有ImportMany的班级成员像这样:

[ImportMany]
private List<Plugin> plugins;

并在容器上调用ComposeParts,这将使用找到的任何导出类自动填充列表。或者,您可以直接要求输出给定类型:

IEnumerable<Plugin> plugins = mefContainer.GetExportedValues<Plugin>();

使用MEF时需要注意的一点是,每个插件只能获得一个实例。如果由于某种原因需要多个实例,请让您的用户导出Factory。

如果您想使用 hard 方式,可以使用Assembly.Load手动加载程序集,然后使用反射来尝试查找实现接口的类型。 MEF为你做这项工作,所以我会坚持下去。

答案 1 :(得分:0)

你需要找到程序集,加载它们并寻找实现IPlugin的类(请使用Ixxx作为接口)

虽然他们觉得对我来说过于复杂,但有助手库会为你做这件事。 MEF是最着名的https://msdn.microsoft.com/en-us/library/dd460648(v=vs.110).aspx

如果你想自己动手。

  • 枚举所有.dll文件的'plugins'目录
  • 对每个
  • 执行assembly.load
  • 枚举类型并查看是否有任何类支持IPLugin
  • 如果是,则执行activator.createinstance
祝你好运