我怎样才能通过 MEF 加载特定的插件?
How can i load just specific Plugins by MEF?
我正在为我的公司开发一个可以普遍使用的简单 GUI 框架。我希望 GUI 框架在启动时读取一个配置文件,它定义了应该加载哪些插件,它们的 GUI 元素应该安排在哪里,等等。但是配置文件的读取以及一些写入应该通过插件进行。所以这就是为什么,这个插件应该首先加载,因为在加载其他插件之前,它需要读出配置文件来识别它们。
我发现,我可以像这样加载定义的 dll:
var dirCatalog = new DirectoryCatalog(@"..\..\Extensions\","ProgramConfigManager*");
但我不想依赖文件名。我的意图是首先使用接口 ISAProgramConfigManagerContent
:
加载 MEF 插件
[Import(typeof(ISAProgramConfigManagerContent))]
SAProgramConfigManagerContent PCM;
在此之后,其他插件,但应该只加载配置文件中的插件:
[ImportMany(typeof(IPlugin))]
List<IPlugin> Plugins;
有没有办法,首先只加载处理配置文件的特殊插件,通过过滤合同,然后只编写 ISAProgramConfigManagerContent
类型的插件?
提前致谢。
从其他程序集导入时,您必须告诉 MEF 要查看文件中的哪些文件。这可以是一个目录,通过文件通配符或任何其他自定义方式。否则 MEF 没有办法去哪里寻找出口。
话虽如此,您可以先设置一个目录来加载插件管理器。然后,在此基础上,使用您要加载的条目设置另一个目录,并从中以编程方式导入插件。您还可以使用一个 AggregateCatalog 来合并多个 DirectoryCatalog
。
类似于:
var container = new CompositionContainer(aggregateCatalog);
IEnumerable<IPlugin> plugins = container.GetExports<IPlugin>();
我正在为我的公司开发一个可以普遍使用的简单 GUI 框架。我希望 GUI 框架在启动时读取一个配置文件,它定义了应该加载哪些插件,它们的 GUI 元素应该安排在哪里,等等。但是配置文件的读取以及一些写入应该通过插件进行。所以这就是为什么,这个插件应该首先加载,因为在加载其他插件之前,它需要读出配置文件来识别它们。
我发现,我可以像这样加载定义的 dll:
var dirCatalog = new DirectoryCatalog(@"..\..\Extensions\","ProgramConfigManager*");
但我不想依赖文件名。我的意图是首先使用接口 ISAProgramConfigManagerContent
:
[Import(typeof(ISAProgramConfigManagerContent))]
SAProgramConfigManagerContent PCM;
在此之后,其他插件,但应该只加载配置文件中的插件:
[ImportMany(typeof(IPlugin))]
List<IPlugin> Plugins;
有没有办法,首先只加载处理配置文件的特殊插件,通过过滤合同,然后只编写 ISAProgramConfigManagerContent
类型的插件?
提前致谢。
从其他程序集导入时,您必须告诉 MEF 要查看文件中的哪些文件。这可以是一个目录,通过文件通配符或任何其他自定义方式。否则 MEF 没有办法去哪里寻找出口。
话虽如此,您可以先设置一个目录来加载插件管理器。然后,在此基础上,使用您要加载的条目设置另一个目录,并从中以编程方式导入插件。您还可以使用一个 AggregateCatalog 来合并多个 DirectoryCatalog
。
类似于:
var container = new CompositionContainer(aggregateCatalog);
IEnumerable<IPlugin> plugins = container.GetExports<IPlugin>();