0

我有一个通过 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
4

1 回答 1

0

因为根据您的评论,您在两个目录中都有具有相同标识的程序集,所以上面代码的输出是正常的。这不是问题DirectoryCatalog。它确实会加载尝试从特定目录加载程序集,但如果当前AppDomain. 从哪里加载程序集并不重要,重要的是身份。

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

如果您有兴趣了解如何加载程序集,请查看Suzanne Cook 的关于程序集加载的博客条目。

于 2013-03-11T07:53:18.223 回答