在DLL中实例化插件类

  • 本文关键字:插件 实例化 DLL 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#还太陌生,不想仓促行事。

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

有一些辅助库可以帮你做到这一点,尽管我觉得它们过于复杂https://msdn.microsoft.com/en-us/library/dd460648(v=vs.110).aspx

如果你想自己滚。

  • 枚举所有.dll文件的"plugins"目录
  • 做一个程序集。在每个程序集上加载
  • 枚举类型并查看是否有任何类支持IPLugin
  • 如果是,请执行activator.createinstance

祝好运

最好的方法是使用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。

如果您想走的路,可以使用Assembly.Load手动加载程序集,然后进行反射,尝试找到实现接口的类型。MEF为你做这项工作,所以我同意。

最新更新