繁体   English   中英

在DLL中实例化插件类

[英]Instantiate plugin class in a DLL

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

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

现在,我试图了解如何使用他们的代码。 我编写了一个构建为dll的测试插件,并将其放入脚本正在监视的“ plugins”目录中。

我只是不确定下一步该怎么做。

由于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#还是太陌生,并且不想插手。

最好的方法是使用MEF(托管扩展框架),也称为System.ComponentModel.Composition库。

如果执行此操作,则库编写器将在其类上方放置以下行:

[Export(typeof(Plugin))]

然后,您创建一些MEF类以导入所有插件。 因为要从文件夹加载,所以从DirectoryCatalog开始:

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

然后,从您的目录中创建一个CompositionContainer (如上所示)。 现在,您可以将一个标记为ImportMany的类成员ImportMany

[ImportMany]
private List<Plugin> plugins;

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

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

使用MEF时要注意的一件事是,每个插件只有一个实例。 如果出于某种原因需要多个实例,请让用户导出工厂。

如果您想采取艰难的方法,则可以使用Assembly.Load手动加载程序集,然后使用反射来尝试查找实现接口的类型。 MEF会为您完成这项工作,因此我会同意。

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

有一些帮助程序库可以帮您完成这些任务,尽管它们对我来说太复杂了。 MEF是最著名的https://msdn.microsoft.com/en-us/library/dd460648(v=vs.110).aspx

如果您想自己动手。

  • 列举所有.dll文件的“插件”目录
  • 每个都做一个assembly.load
  • 枚举类型,并查看是否有任何类支持IPLugin
  • 如果是这样的话,那么激活器

祝好运

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM