MEF程序集从缓存加载?

时间:2012-10-31 07:06:45

标签: .net plugins mef

我有一个通过MEF加载插件的应用程序。

应用程序在终端服务器上的多个实例中运行。

当我需要在生产环境中测试新插件时,我将MEF重定向到另一个文件夹。 问题是,即使重定向后,有时也会从原始文件夹加载程序集。 它不会每次都发生,我无法在我的机器上重现它。我怀疑它是某种缓存问题。

MEF加载代码如下所示:

using (var catalog = new AggregateCatalog()) {

    Console.WriteLine("Loading components from {0}", folder);

    catalog.Catalogs.Add(new DirectoryCatalog(folder, "*.dll"));

    using (var container = new CompositionContainer(catalog)) {
        try {
            container.ComposeParts(this);
        }
        catch (ReflectionTypeLoadException ex) {
            foreach (var loaderException in ex.LoaderExceptions) {
               // log loading error
    }
}

foreach (var assembly in _allComponents.GroupBy(x => x.GetType().Assembly)) {
    Console.WriteLine("Loaded from {0}", assembly.Key.CodeBase);
}

上面代码的结果看起来像

Loading components from C:\NewPlugins
Loaded from C:\OldPlugins

1 个答案:

答案 0 :(得分:0)

根据你的评论,你在两个具有相同身份的目录程序集中都有,上面代码的输出是正常的。这不是DirectoryCatalog的问题。它会加载尝试从特定目录加载程序集,但如果已在当前AppDomain中加载了具有相同标识的程序集,则CLR将不加载它。装配的位置无关紧要,重要的是身份。

解决方案是使程序集强大命名,并在每次创建插件更新时增加版本。这样, NewPlugins 目录中的程序集将具有与已从 OldPlugins 目录加载的程序集不同的标识。

如果您有兴趣了解如何加载装配体,请查看装配装载时的Suzanne Cook's blog条目。