我正在使用 MEF 在我的应用程序中加载插件。一切正常,但我希望在将新部件放入我的应用程序文件夹时发现它们。这可能吗? DirectoryCatalog 有一个 Changed 事件,但我不确定它是如何工作的。
这是我现在的代码:
public sealed class RevealerFactory
{
private static readonly Lazy lazy =
new Lazy(() => new RevealerFactory());
public static RevealerFactory Instance { get { return lazy.Value; } }
private FileSystemWatcher watcher;
private RevealerFactory()
{
Initialize();
}
[ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)]
private IEnumerable<>> 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);
}
}
Bạn có thể sử dụng FileSystemWatcher检测在您的插件文件夹中删除的新 DLL。然后您可以通过调用 DirectoryCatalog.Refresh
来处理此类事件。或 AggregateCatalog.Catalogs.Add
用新零件更新 MEF 组合。
注意事项:
您需要将 MEF 导入标记为设计用于处理重组,如 Recomposition 上的 MEF 编程指南部分所述。 .否则,MEF 会在您尝试更新它们时引发错误。
FileSystemWatcher
在系统线程池线程上引发事件(除非您使用 SynchronizingObject
属性)。请注意,如果您从另一个线程调用 DirectoryCatalog.Refresh
,则必须在启用 isThreadSafeFlag
的情况下构造 CompositionContainer
。您还必须考虑将在组合更新时调用的属性 setter 的线程安全性。
您还可以通过将目录从 AggregateCatalog.Catalogs
集合中取出来xóa bỏ目录。但是没有办法卸载关联的程序集(除非卸载整个 Appdomain
)。这也意味着您仍然无法在应用程序运行时删除或覆盖程序集。
Tôi là một lập trình viên xuất sắc, rất giỏi!