如何通过MEF加载特定的插件?

时间:2017-11-06 17:49:05

标签: c# .net mef

对于我的公司,我正在开发一个可以普遍使用的简单GUI框架。我希望GUI Framework在启动时读取配置文件,它定义了应该加载哪些插件,应该在哪里安排GUI元素,等等。但是配置文件的读取以及一些写入应该通过插件来实现。所以这就是为什么这个插件应该先加载,因为在加载其他插件之前,它需要读出配置文件来识别它们。

我发现,我可以像这样加载一个已定义的dll: var dirCatalog = new DirectoryCatalog(@"..\..\Extensions\","ProgramConfigManager*");

但我不想依赖文件名。我的目的是首先使用接口ISAProgramConfigManagerContent

加载MEF插件
[Import(typeof(ISAProgramConfigManagerContent))]
SAProgramConfigManagerContent PCM;

在此之后,其他插件,但只是配置文件中的插件应加载到此:

[ImportMany(typeof(IPlugin))]
List<IPlugin> Plugins;

有没有办法,首先加载处理配置文件的特殊插件,通过过滤合同然后组成ISAProgramConfigManagerContent类型的那个?

提前致谢。

1 个答案:

答案 0 :(得分:0)

从其他程序集导入时,必须告诉MEF文件中的哪些内容。这可以是目录,文件通配或任何其他自定义方式。否则MEF无法在哪里寻找出口。

话虽如此,您可以先设置目录来加载插件管理器。然后,基于此,设置另一个目录,其中包含您要加载的条目,并以编程方式从中导入插件。您还可以使用AggregateCatalog统一多个DirectoryCatalog

类似的东西:

var container = new CompositionContainer(aggregateCatalog);
IEnumerable<IPlugin> plugins = container.GetExports<IPlugin>();