我有一个MEF(Microsoft扩展框架)应用程序,它从文件夹中加载一些程序集。我需要枚举为我的应用程序生成任何导出的程序集。
一种方法是枚举调用GetExportedObject().GetType().Assembly
的导入。但如果没有实例化进口,这样做会更干净。有没有办法从目录或其他任何东西获取加载的程序集?
我需要程序集来获取其属性,如版权,版本,名称等。我的文件夹可以包含带导出的程序集和没有导出的程序集,但我只需要满足应用程序中任何导入的程序集。
答案 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)
这是我当前的解决方案,效果很好:
答案 3 :(得分:0)
如果您可以访问这些程序集的源代码,那么我可以选择逐个添加程序集。您可以创建一个名为IModule的接口,并将其作为导出它的所有程序集的要求。然后你可以将它们导入你的bootstraper:
[ImportMany]
public List<IModule> Modules { get; set; }
此列表将包含可通过其访问程序集的所有Module类的列表:
var module1 = Logic.Instance.Modules[0];
var fullename = module1.GetType().Assembly.FullName;