我有一个通过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
答案 0 :(得分:0)
根据你的评论,你在两个具有相同身份的目录程序集中都有,上面代码的输出是正常的。这不是DirectoryCatalog
的问题。它会加载尝试从特定目录加载程序集,但如果已在当前AppDomain
中加载了具有相同标识的程序集,则CLR将不加载它。装配的位置无关紧要,重要的是身份。
解决方案是使程序集强大命名,并在每次创建插件更新时增加版本。这样, NewPlugins 目录中的程序集将具有与已从 OldPlugins 目录加载的程序集不同的标识。
如果您有兴趣了解如何加载装配体,请查看装配装载时的Suzanne Cook's blog条目。