2009-05-13 15 views
5

私は、フォルダからアセンブリを読み込むMEF(Microsoft Extension Framework)アプリケーションを持っています。私は自分のアプリケーションのために輸出したアセンブリを列挙する必要があります。MEFのAggregateCatalogまたはDirectoryCatalog内でアセンブリを列挙する方法は?

これを行う1つの方法は、GetExportedObject().GetType().Assemblyを呼び出すインポートを列挙することです。しかし、輸入の具体化をせずにこれを行う方がより清潔になるでしょう。カタログなどからロードされたアセンブリを取得する方法はありますか?

著作権、バージョン、名前などの属性を取得するアセンブリが必要です。私のフォルダには、エクスポートされたアセンブリと含まれていないアセンブリの両方を含めることができますが、アプリケーションのインポートを満たすアセンブリのみが必要です。

答えて

2

AssemblyCatalogにはAssemblyプロパティがあります。 AggregateCatalogにはこの情報を直接取得する方法がありません。内部カタログがアセンブリから部品をロードすることさえ保証されません。 DirectoryCatalogにはこの機能はありませんが、正当な理由があった場合に追加することは可能です。

なぜアセンブリのリストを取得しますか?ディレクトリcatalagを使用しない方が良いかもしれません。代わりに、自分自身でディレクトリ内のアセンブリをスキャンして読み込み、それぞれに対してAssemblyCatalogを作成し、AggregateCatalogに追加してください。

EDIT:MEFには、合成で「使用された」すべてのエクスポートのリストを取得する方法がありません。おそらく、デフォルトパーツ定義の周りのシェルであるパー​​ツ定義を返し、GetExportedObjectが呼び出されたパーツを追跡した独自のカタログを書くことができます。 ReflectionModelServicesでAPIを使用して、デフォルトカタログの特定のパーツ定義に対応するタイプを特定することができます。このようなカタログを書くことは、おそらく単純な作業ではないことに注意してください。ここで

+0

私はアセンブリがなぜ必要かに関する質問を更新しました。実際には、リストに_my_ importsとは関係のないMEF dllが含まれている可能性があるため、DirectoryCatalogでアセンブリを返すだけでも目標は解決しません。 GetExportedObjectを呼び出さずにアセンブリからアセンブリを取得することができます。または、アセンブリを満足するようにアセンブリを組み立てることができます。 –

+0

これと同じ種類の機能が必要です。私はBuildManagerを使用する別のシステムと統合しており、MEFで使用しているアセンブリをBuildManagerに追加したいと考えています。 –

2

はうまく動作します私の現在のソリューションです:

  1. は直接、負荷アセンブリをDirectoryCatalogを使用し、それらからAssemblyCatalogを作成しないでください。
  2. AssemblyCatalog.Partsを使用して、どのアセンブリにエクスポートがあるかを調べ、ユーザーがそれらを承認できるようにします。
  3. 許可されたAssemblyCatalogのみを、コンポジション内のAggregateCatalogに追加します。
0

これらのアセンブリのソースにアクセスできる場合は、アセンブリを1つずつ追加する代わりの方法があります。 IModuleというインターフェイスを作成し、すべてのアセンブリがエクスポートするための要件にすることができます。次に、あなたのbootstraperにそれらをImportAllことができます。

[ImportMany] 
public List<IModule> Modules { get; set; } 

このリストには、アセンブリにアクセスするためのすべてのモジュールクラスのリストが含まれます:これはそれを行うための一つの方法です

var module1 = Logic.Instance.Modules[0]; 
var fullename = module1.GetType().Assembly.FullName; 
5

をし、 Caliburnで使用されています。マイクロ:

var aggregateCatalog = new AggregateCatalog(...); 
var assemblies = aggregateCatalog.Parts 
    .Select(part => ReflectionModelServices.GetPartType(part).Value.Assembly) 
    .Distinct() 
    .ToList(); 
+0

ベストセラー! このようにして、私はDirectoryCatalogを使い続け、MEFを介してロードされたすべてのアセンブリ(パーツ)のリストを取得することができます。 上記のコードでは、AggregateCatalogをDirectoryCatalogに変更しました。 – juFo

+0

ありがとうございました!これは私に多くの分裂を救った。私はその貧弱な「部品」リストからより多くの情報を得るための方法が必要であることを知っていました。 –

関連する問題