- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 MEF 应用程序,在不同的 dll 中有相当多的组件。当程序启动时,我创建一个 AggregateCatalog,然后将所有程序集加载到其中。由于组件数量众多,这可能需要一些时间并导致加载应用程序延迟。我想推迟一些组件的加载,但我遇到了问题。当我使用
加载组件时this.AggregateCatalog.Catalogs.Add(new DirectoryCatalog("."));
我在目录中获得了大约 125 个组件,并且一切正常。当我使用 AssemblyCatalog 单独加载每个 dll 和 exe 时,我只得到大约 77 个组件,并且应用程序由于缺少组件而无法运行。我什至创建了一个目录列表并遍历它,这样我就不会错过任何文件并得出相同的结果。我的问题是,DirectoryCatalog 还做了什么让一切正常工作,我如何在不立即加载目录中的所有内容的情况下模拟它?
最佳答案
AssemblyCatalog 和 DirectoryCatalog 的区别
我已经从 CodePlex ( link ) 下载了 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 确实如此。
您的代码中是否可能存在为每个程序集创建新的 AssemblyCatalog 的错误?
我还查看了 AssemblyCatalog,它只加载一个程序集,然后获取它的所有类型。
性能问题
I'd like to delay some of the component loading until later
如果您的速度问题仅仅是因为创建目录而发生的,那么以下内容将无济于事。否则,如果您在组合零件时出现性能问题,请使用 MEF Lazy Imports/Exports,而不是使用 AssemblyCatalogs 摆弄自己。 (Another link)。当 MEF 正常组合部件时,它会创建所有导入和所有子导入的实例。如果您将它们定义为 Lazy MEF,则在需要它们之前不会创建这些类型/部件的实例(这样可以节省时间)。
关于c# - DirectoryCatalog 和 AssemblyCatalog 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10093914/
所以我的目录目录设置如下所示: DirectoryCatalog directoryCatalog = new DirectoryCatalog(@".\Plugins"); var catalog
如果目录不存在,有没有办法安全地使用 DirectoryCatalog 来处理? 这里是我的容器如何设置的代码示例: //Create an assembly catalog of the a
使用 MEF ,在将新插件( DLLs 包含 parts )添加到插件文件夹后,在 DirectoryCatalog 上调用刷新将更新容器(如果允许重组)并且新添加的插件变得可访问。 我的问题是如果我
我有一个 MEF 应用程序,在不同的 dll 中有相当多的组件。当程序启动时,我创建一个 AggregateCatalog,然后将所有程序集加载到其中。由于组件数量众多,这可能需要一些时间并导致加载应
DirectoryCatalog 扫描目录中的程序集以确定导入/导出的类。不加载任何没有导入/导出的程序集。 这是一个很棒的功能,但它是如何工作的呢?要研究程序集中类型的自定义属性,您不需要加载程序集
我有一个包含以下步骤的应用程序: 启动应用程序和 ConfigureAggregateCatalog 登录用户到应用 将 DLL MEF 模块下载到名为“Modules”的目录 刷新目录目录 -- 有
我有一个 MEF(Microsoft 扩展框架)应用程序,它从一个文件夹加载一些程序集。我需要枚举为我的应用程序生成任何导出的程序集。 一种方法是枚举调用 GetExportedObject().Ge
我有大约 20 个 dll,导出、导入部分。每个 dll 中都有一个类,具有导入和导出属性。但是在编写 MEF 时会扫描 dll 中可用的所有类型。 下面的结果仅取自一个 dll 的输出。 因此,co
我正在试验 MEF并创建了一个测试程序来调用实现某些给定接口(interface)的“插件”,如下所示: using System; using System.Collections.Generic;
我是一名优秀的程序员,十分优秀!