gpt4 book ai didi

c# - 如何在应用程序运行时发现新的 MEF 部件?

转载 作者:可可西里 更新时间:2023-11-01 08:19:48 28 4
gpt4 key购买 nike

我正在使用 MEF 在我的应用程序中加载插件。一切正常,但我希望在将新部件放入我的应用程序文件夹时发现它们。这可能吗? DirectoryCatalog 有一个 Changed 事件,但我不确定它是如何工作的。

这是我现在的代码:

public sealed class RevealerFactory
{
private static readonly Lazy<RevealerFactory> lazy =
new Lazy<RevealerFactory>(() => new RevealerFactory());

public static RevealerFactory Instance { get { return lazy.Value; } }

private FileSystemWatcher watcher;

private RevealerFactory()
{
Initialize();
}

[ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)]
private IEnumerable<Lazy<IRevealer, IRevealerCapabilities>> Revealers {
get;
set;
}

public IRevealer GetRevealer(Uri uri)
{
return (from revealer in Revealers
where uri.Host.Equals(revealer.Metadata.Host,
StringComparison.OrdinalIgnoreCase)
&& revealer.Value.IsRevelable(uri)
select revealer.Value).FirstOrDefault();
}

private void Initialize()
{
var catalog = new DirectoryCatalog(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
+ "/SDownloader/Revealers");
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}

最佳答案

您可以使用 FileSystemWatcher检测在您的插件文件夹中删除的新 DLL。然后您可以通过调用 DirectoryCatalog.Refresh 来处理此类事件。或 AggregateCatalog.Catalogs.Add用新零件更新 MEF 组合。

注意事项:

  1. 您需要将 MEF 导入标记为设计用于处理重组,如 Recomposition 上的 MEF 编程指南部分所述。 .否则,MEF 会在您尝试更新它们时引发错误。

  2. FileSystemWatcher 在系统线程池线程上引发事件(除非您使用 SynchronizingObject 属性)。请注意,如果您从另一个线程调用 DirectoryCatalog.Refresh,则必须在启用 isThreadSafeFlag 的情况下构造 CompositionContainer。您还必须考虑将在组合更新时调用的属性 setter 的线程安全性。

  3. 您还可以通过将目录从 AggregateCatalog.Catalogs 集合中取出来删除目录。但是没有办法卸载关联的程序集(除非卸载整个 Appdomain)。这也意味着您仍然无法在应用程序运行时删除或覆盖程序集。

关于c# - 如何在应用程序运行时发现新的 MEF 部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6944380/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com