如何在MEF中的AggregateCatalog或DirectoryCatalog中枚举程序集?

Ser*_*hov 5 c# mef

我有一个MEF(Microsoft扩展框架)应用程序,它从文件夹加载一些程序集.我需要枚举为我的应用程序生成任何导出的程序集.

一种方法是枚举导入调用GetExportedObject().GetType().Assembly.但如果没有实例化进口,这样做会更干净.有没有办法从目录或其他任何东西获取加载的程序集?

我需要程序集来获取他们的属性,如版权,版本,名称等.我的文件夹可以包含带导出和没有导出的程序集,但我只需要满足应用程序中任何导入的程序集.

luk*_*ler 6

这是一种方法,用于Caliburn.Micro:

var aggregateCatalog = new AggregateCatalog(...);
var assemblies = aggregateCatalog.Parts
    .Select(part => ReflectionModelServices.GetPartType(part).Value.Assembly)
    .Distinct()
    .ToList();
Run Code Online (Sandbox Code Playgroud)


Dan*_*ted 2

AssemblyCatalog 有一个 Assembly 属性。AggregateCatalog 无法直接获取此信息 - 无法保证内部目录甚至从装配中加载其零件。DirectoryCatalog 没有此功能,但如果有充分的理由,可以添加它。

为什么要获取程序集列表?您可能最好不要使用目录目录,而是自己扫描并加载目录中的程序集,为每个程序集创建一个 AssemblyCatalog 并将其添加到 AggregateCatalog 中。

编辑:MEF 无法获取组合中“使用”的所有导出的列表。您可能可以编写自己的目录,该目录将返回部件定义,这些定义是默认部件定义周围的外壳,并跟踪哪些部件调用了 GetExportedObject。您可以使用 ReflectionModelServices 中的 API 来确定哪种类型对应于默认目录中的给定零件定义。请注意,编写这样的目录可能不是一件简单的事情。