MEF 的 DirectoryCatalog 是如何工作的?
Posted
技术标签:
【中文标题】MEF 的 DirectoryCatalog 是如何工作的?【英文标题】:How does MEF's DirectoryCatalog work? 【发布时间】:2012-02-26 21:20:14 【问题描述】:DirectoryCatalog
扫描目录中的程序集以确定导入/导出的类。不会加载任何没有导入/导出的程序集。
这是一个很棒的功能,但它是如何工作的?要调查程序集中类型的自定义属性,您不需要加载程序集吗?一旦加载,就无法卸载,所以不可能是这样的。
它在做某种 AppDomain 魔术吗?
【问题讨论】:
【参考方案1】:试试看。 DirectoryCatalog
只是为给定目录中的每个 .dll 文件创建一个 AssemblyCatalog
。因为AssemblyCatalog
调用AssemblyName.GetAssemblyName
,非.NET .dll 文件将不会被加载(在AssemblyCatalog
中抛出并捕获异常)。 AssemblyCatalog
在它创建的 AssemblyName
上调用 Assembly.Load
。因此,在创建 DirectoryCatalog
时会立即加载程序集。没有魔法,没有AppDomains
。但是众所周知MEF
会将程序集加载到当前的AppDomain
中。如果您想要可以卸载的程序集,请使用 MAF。
【讨论】:
不幸的是,MAF 相当过时,并且由于使用远程处理而具有大量限制。我还没有找到一个好的选择。不过,我没有意识到 MEF 会加载程序集。 “可以卸载的组件”是什么意思? 请允许我澄清一下。 .NET 使用 AppDomain 加载程序集。 AppDomain 是程序集驻留并与其他程序交互的最基本的“宇宙”。例如。静态变量仅对 AppDomain 中的实例可见。一旦程序集被加载到 AppDomain 中,您就无法删除该程序集。但是,您可以卸载完整的 AppDomain。这是一个强大的概念,最初由 ASP.NET 付诸实践。话虽如此,使用 AppDomains 实现插件架构有其挑战。【参考方案2】:这是可以帮助你的示例代码。
var directoryPath = "Dll folder path";
//Load parts from the available dlls in the specified path using the directory catalog
var directoryCatalog = new DirectoryCatalog(directoryPath, "*.dll");
//Creating an instance of aggregate catalog. It aggregates other catalogs
var aggregateCatalog = new AggregateCatalog();
aggregateCatalog.Catalogs.Add(directoryCatalog);
//Crete the composition container
var container = new CompositionContainer(aggregateCatalog);
container.ComposeParts(this);
[ImportMany]
public List<IModule> Modules get; set;
【讨论】:
这对回答我的问题有何帮助? 这是目录编目的实现。如何使用此代码获取模块, 这与我的问题有什么关系? 仅仅因为它与您的问题没有直接关系并不意味着它不是有用的信息 此回复与问题完全无关以上是关于MEF 的 DirectoryCatalog 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章