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

时间:2009-05-13 17:55:20

标签: c# mef

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

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

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

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

编辑:MEF无法获得在合成中“使用”的所有导出列表。您可以编写自己的目录,该目录将返回围绕默认零件定义的零件定义,并跟踪哪些零件已在其上调用GetExportedObject。您可以使用ReflectionModelServices中的API来确定哪个类型对应于默认目录中的给定零件定义。请注意,编写此类目录可能不是一项简单的任务。

答案 2 :(得分:2)

这是我当前的解决方案,效果很好:

  1. 不要使用DirectoryCatalog,直接加载程序集并从中创建AssemblyCatalog。
  2. 使用AssemblyCatalog.Parts找出哪些程序集具有导出,让用户授权它们。
  3. 仅将授权的AssemblyCatalog添加到AggregateCatalog中,该目录位于合成中。

答案 3 :(得分:0)

如果您可以访问这些程序集的源代码,那么我可以选择逐个添加程序集。您可以创建一个名为IModule的接口,并将其作为导出它的所有程序集的要求。然后你可以将它们导入你的bootstraper:

[ImportMany]
public List<IModule> Modules { get; set; }

此列表将包含可通过其访问程序集的所有Module类的列表:

var module1 = Logic.Instance.Modules[0];
var fullename = module1.GetType().Assembly.FullName;