DirectoryCatalog和AssemblyCatalog之间的区别

时间:2012-04-10 17:56:37

标签: c# wcf mef

我有一个MEF应用程序,在不同的dll中有相当多的组件。程序启动时,我创建了一个AggregateCatalog,然后将所有程序集加载到其中。由于组件数量众多,这可能需要一些时间并导致加载应用程序的延迟。我想延迟一些组件加载直到稍后,但我遇到了一个问题。当我使用

加载组件时
this.AggregateCatalog.Catalogs.Add(new DirectoryCatalog("."));

我在目录中获得了大约125个组件,一切运行正常。当我使用AssemblyCatalog单独加载每个dll和exe时,我只得到大约77个组件,并且由于缺少组件,应用程序无法运行。我甚至创建了一个目录列表并通过它循环,这样我就不会错过任何文件并得出相同的结果。我的问题是,DirectoryCatalog还做了什么让一切正常工作,如何在不加载目录中的所有内容的情况下模拟它?

1 个答案:

答案 0 :(得分:2)

AssemblyCatalog和DirectoryCatalog之间的区别

我从CodePlex(link)下载了MEF源代码。通过查看DirectoryCatalog.cs,它创建了一个字典Dictionary<对于AssemblyCatalogs的字符串,AssemblyCatalog>(),它找到的每个程序集都有一个。

    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,它只是加载一个Assembly,然后得到它的所有类型。

效果问题

  

我想延迟一些组件加载,直到稍后

如果仅通过创建目录来解决速度问题,则以下位将无济于事。否则,如果在编写零件时发生性能问题,而不是使用AssemblyCatalog来处理自己,请使用MEF Lazy Imports/ExportsAnother link)。当MEF通常组成零件时,它将创建所有Imports和所有子进口的实例。如果您将它们定义为Lazy MEF,则在需要之前不会创建这些类型/部件的实例(这样可以节省时间)。