3

私は現在MEFと協力していて、いくつかの問題に直面しています

私が欲しいのは、ディレクトリからdllをロードすることです。

まず、ディレクトリをスキャンして、2つのものを辞書に保存します

それぞれのDLLからの名前プロパティ(文字列として)

およびモジュール名(文字列として)

これがScanDirectory()コードです

private void ScanPluginDirectory()
{
    catalog = new AggregateCatalog();

    catalog.Catalogs.Add(new DirectoryCatalog(@"..\..\plugin"));            
    container = new CompositionContainer(catalog);

    batch = new CompositionBatch();
    batch.AddPart(this);        

    container.Compose(batch);    

    pluginDictionary = new Dictionary<String, String>();
    foreach (IFilter filter in filters)
    {
        Type t = filter.GetType();
        pluginDictionary.Add(filter.Name, t.Module.Name);
    }
}

チェックボックスリストに名前を表示します。チェックボックスからdllを選択すると。

私は次のようにインポートステートメントを持っています

[Import]
public IEnumerable<IFilter> filters { get; set; }

現在、私のプログラムは正常に実行されています。チェックボックスリストからプラグインをチェックしたときです。それを「loaded」ディレクトリに移動し、QueryPlugin()メソッドが「loaded」ディレクトリを調べてプラグインを検索します。

チェックボックスリストからプラグインのチェックを外すと。「ロードされた」ディレクトリから移動します...

私が欲しいのは、batch.RemovePart()メソッドを使用して、あるディレクトリから別のディレクトリへのdllのこの急速な移動を取り除くことです。

注:プラグインを手動でバッチに追加していません

batch.AddPart(new DemoFilter1());

これの代わりに、DirectoryCatalog();;を使用しました。

4

1 に答える 1

3

DirectoryCatalog を使用する代わりに、AggregateCatalog を使用して、ディレクトリ内の各アセンブリの AssemblyCatalog を集約カタログに追加します。次に、プラグインがオンまたはオフのときに、対応する AssemblyCatalog を AggregateCatalog に追加または削除できます。

特定のアセンブリに複数のプラグインがある場合、このアプローチでは問題が発生する可能性があることに注意してください。より堅牢なアプローチは、フィルター処理されたカタログを使用して個々のパーツ定義をフィルター処理することです。

于 2009-05-18T17:09:19.077 に答える