如何创建一个目录目录,该目录将在子目录中搜索插件

本文关键字:子目录 插件 搜索 何创建 创建 一个 | 更新日期: 2023-09-27 18:30:16

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

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

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

例如

插件 -> 插件 1 -> 插件 1.dll

      -> Plugin2 -> plugin2.dll

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

如何创建一个目录目录,该目录将在子目录中搜索插件

您可以通过

向属性添加多个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);

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

我发现我需要用 try/catch 将_aggregateCatalog.Catalogs.Add(catalog);包裹在Initialize(...)下,以便ReflectionTypeLoadException在发现非插件 dll 时阻止它抛出。