簡體   English   中英

如何在應用程序運行時發現新的MEF部件?

[英]How to discover new MEF parts while the application is running?

我正在使用MEF在我的應用程序中加載插件。 一切正常,但我希望在將它們放入我的app文件夾時發現新的部分。 這可能嗎? 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.RefreshAggregateCatalog.Catalogs.Add來處理此類事件,以使用新部件更新MEF組合。

有些事情要注意:

  1. 您需要標記您的MEF進口為被專門用來對付重排,如在MEF節目指南部分中說明的重構 否則MEF會在您嘗試更新時引發錯誤。

  2. FileSystemWatcher在系統線程池線程上引發事件(除非您使用SynchronizingObject屬性)。 請注意,如果從另一個線程調用DirectoryCatalog.Refresh ,則必須構造具有isThreadSafeFlagCompositionContainer 您還必須考慮在更新合成時將調用的屬性設置器的線程安全性。

  3. 您還可以通過從AggregateCatalog.Catalogs集合中取出目錄來刪除目錄。 但是沒有辦法卸載關聯的程序集(除非卸載整個Appdomain )。 這也意味着您仍然無法在應用程序運行時刪除或覆蓋程序集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM