4

さまざまなdllにかなりの数のコンポーネントがあるMEFアプリケーションがあります。プログラムが起動したら、AggregateCatalogを作成し、すべてのアセンブリをその中にロードします。コンポーネントの数が多いため、これには時間がかかり、アプリの読み込みに遅延が発生する可能性があります。コンポーネントのロードの一部を後でまで遅らせたいのですが、問題が発生しました。を使用してコンポーネントをロードするとき

this.AggregateCatalog.Catalogs.Add(new DirectoryCatalog("."));

カタログには約125個のコンポーネントがあり、すべて正常に動作しています。AssemblyCatalogを使用して各dllとexeを個別にロードすると、約77個のコンポーネントしか取得できず、コンポーネントが不足しているためにアプリを実行できません。ディレクトリリストを作成してループし、ファイルを見逃さずに同じ結果が得られるようにしました。私の質問は、すべてが正しく機能するようにするDirectoryCatalogの他に何をしているのか、そしてディレクトリにすべてを一度にロードせずにそれをエミュレートするにはどうすればよいのかということです。

4

1 に答える 1

3

AssemblyCatalogとDirectoryCatalogの違い

CodePlexからMEFソースコードをダウンロードしました(リンク)。DirectoryCatalog.csを調べることにより、検出したアセンブリごとに1つずつ、AssemblyCatalogsの辞書Dictionary <string、AssemblyCatalog>()を作成します。

    this._assemblyCatalogs = new Dictionary<string, AssemblyCatalog>();
    this._catalogCollection = new ComposablePartCatalogCollection(null, null, null);

    this._loadedFiles = GetFiles().ToReadOnlyCollection();

    foreach (string file in this._loadedFiles)
    {
        AssemblyCatalog assemblyCatalog = null;
        assemblyCatalog = CreateAssemblyCatalogGuarded(file);

        if (assemblyCatalog != null)
        {
            this._assemblyCatalogs.Add(file, assemblyCatalog);
            this._catalogCollection.Add(assemblyCatalog);
        }
    }

ここに表示されているように、GetFiles()を使用して指定されたディレクトリからすべてのアセンブリを取得します(オプションの検索パターンが定義されていない場合は、すべてのファイルを取得します)。次に、それらのアセンブリごとに新しいアセンブリカタログを作成します。

CreateAssemblyCatalogGuardedは、例外のガードを追加します。

私が知る限り、DirectoryCatalogを使用すること(これは私の好ましい方法です)と、ディレクトリ内のすべてのアセンブリを別々のAssemblyCatalogでロードすることの間に違いはないはずです。これは、DirectoryCatalogがとにかく行うこととまったく同じです。 。

アセンブリごとに新しいAssemblyCatalogを作成するコードにエラーがある可能性はありますか?

また、アセンブリをロードして、そのタイプをすべて取得するAssemblyCatalogも確認しました。

パフォーマンスの問題

コンポーネントのロードの一部を後でまで遅らせたい

カタログを作成するだけで速度の問題が発生する場合は、次のビットは役に立ちません。それ以外の場合、パーツの作成中にパフォーマンスの問題が発生した場合は、AssemblyCatalogsを使用する代わりに、MEF Lazy Imports / Exports別のリンク)を使用してください。MEFが通常パーツを作成する場合、すべてのインポートとすべての子インポートのインスタンスが作成されます。それらをLazyMEFとして定義した場合、必要になるまでこれらのタイプ/パーツのインスタンスは作成されません(これにより時間を節約できます)。

于 2012-04-10T20:42:33.543 に答える