AssemblyCatalog 和 DirectoryCatalog 之间的区别
我已经从 CodePlex (链接) 下载了 MEF 源代码。通过查看 DirectoryCatalog.cs,它创建了一个字典 Dictionary < string, AssemblyCatalog >() of AssemblyCatalogs,它对应于它找到的每个程序集。
this._assemblyCatalogs = new Dictionary<string, AssemblyCatalog>();
this._catalogCollection = new ComposablePartCatalogCollection(null, null, null);
this._loadedFiles = GetFiles().ToReadOnlyCollection();
foreach (string file in this._loadedFiles)
{
AssemblyCatalog assemblyCatalog = null;
assemblyCatalog = CreateAssemblyCatalogGuarded(file);
if (assemblyCatalog != null)
{
this._assemblyCatalogs.Add(file, assemblyCatalog);
this._catalogCollection.Add(assemblyCatalog);
}
}
正如您在此处看到的,它使用 GetFiles() 从指定目录获取所有程序集(如果未定义可选搜索模式,则获取所有文件)。然后它为每个这些程序集创建一个新的程序集目录。
CreateAssemblyCatalogGuarded 为异常添加保护。
据我所知,使用 DirectoryCatalog(这将是我的首选方式)和使用单独的 AssemblyCatalog 加载所述目录中的所有程序集之间应该没有任何区别,因为这正是 DirectoryCatalog 无论如何.
您的代码中是否有可能为每个 Assembly 创建一个新的 AssemblyCatalog 错误?
我还查看了AssemblyCatalog,它只加载一个Assembly,然后获取它的所有类型。
性能问题
我想将一些组件加载延迟到以后
如果您的速度问题只是通过创建目录而发生,那么以下内容将无济于事。否则,如果您在编写零件时出现性能问题,请使用MEF Lazy Imports/Exports(另一个链接),而不是使用 AssemblyCatalogs。当 MEF 正常组合部件时,它会创建所有 Imports 和所有子导入的实例。如果您将它们定义为 Lazy MEF,则在需要它们之前不会创建这些类型/部分的实例(这样可以节省时间)。