如何创建将在子目录中搜索插件的DirectoryCatalog

时间:2014-11-13 09:41:04

标签: c# plugins mef catalog

所以我的目录目录设置如下:

DirectoryCatalog directoryCatalog = new DirectoryCatalog(@".\Plugins");
var catalog = new AggregateCatalog(directoryCatalog);
var container = new CompositionContainer(catalog);
container.ComposeParts(this);

哪个会在Plugins文件夹中找到符合我导入条件的.dll文件。现在为了防止插件中的引用冲突,我想将每个插件放在一个单独的文件夹中。

e.g。

  

插件 - > Plugin1 - > plugin1.dll

      -> Plugin2 -> plugin2.dll

但我的DirectoryCatalog找不到这些插件。是否可以实现此功能,或者我的插件库必须位于指定的.\Plugins文件夹

2 个答案:

答案 0 :(得分:12)

您可以通过将DirectoryCatalogs多个AggregateCatalog.Catalogs添加到var catalog = new AggregateCatalog(); // iterate over all directories in .\Plugins dir and add all Plugin* dirs to catalogs foreach (var path in Directory.EnumerateDirectories(@".\Plugins", "Plugin*", SearchOption.TopDirectoryOnly)) { catalog.Catalogs.Add(new DirectoryCatalog(path)); } _container = new CompositionContainer(catalog); this._container.ComposeParts(this); 属性来解决您的问题:

{{1}}

答案 1 :(得分:0)

还有这个:  https://github.com/MefContrib/MefContrib/blob/master/src/MefContrib/Hosting/RecursiveDirectoryCatalog.cs

我发现我需要将_aggregateCatalog.Catalogs.Add(catalog);包含在Initialize(...)下,并使用ReflectionTypeLoadException的try / catch来阻止它在找到非插件dll时抛出。