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として定義した場合、必要になるまでこれらのタイプ/パーツのインスタンスは作成されません(これにより時間を節約できます)。