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 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

C#可扩展编程之MEF:MEF高级进阶

C#可扩展编程之MEF:MEF简介及简单的Demo

C#可扩展编程之MEF学习笔记:MEF简介及简单的Demo(转)

什么是 MEF?

MEF依赖注入实例

C#可扩展编程之MEF学习笔记:MEF的导出(Export)和导入(Import)