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