5

フォルダーからいくつかのアセンブリをロードする MEF (Microsoft Extension Framework) アプリケーションがあります。アプリケーションのエクスポートを生成したアセンブリを列挙する必要があります。

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

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

4

4 に答える 4

6

これはその方法の 1 つで、Caliburn.Micro で使用されています。

var aggregateCatalog = new AggregateCatalog(...);
var assemblies = aggregateCatalog.Parts
    .Select(part => ReflectionModelServices.GetPartType(part).Value.Assembly)
    .Distinct()
    .ToList();
于 2014-06-10T18:14:55.490 に答える
2

うまく機能する私の現在のソリューションは次のとおりです。

  1. DirectoryCatalog を使用せず、アセンブリを直接読み込み、それらから AssemblyCatalog を作成します。
  2. AssemblyCatalog.Parts を使用して、どのアセンブリにエクスポートがあるかを調べ、ユーザーに許可させます。
  3. 許可された AssemblyCatalog のみを AggregateCatalog に追加します。これはコンポジションに含まれています。
于 2010-10-15T20:25:16.247 に答える
2

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

アセンブリのリストを取得する必要があるのはなぜですか? ディレクトリ カタログを使用しない方がよい場合があります。代わりに、ディレクトリ内のアセンブリを自分でスキャンしてロードし、アセンブリごとに AssemblyCatalog を作成して AggregateCatalog に追加します。

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

于 2009-05-13T18:51:47.147 に答える
0

これらのアセンブリのソースにアクセスできる場合は、アセンブリを 1 つずつ追加する代替ソリューションがあります。IModule というインターフェイスを作成し、すべてのアセンブリでそれをエクスポートする必要があるようにすることができます。次に、それらをすべてブートストラップに ImportAll できます。

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

このリストには、アセンブリにアクセスできるすべての Module クラスのリストが含まれます。

var module1 = Logic.Instance.Modules[0];
var fullename = module1.GetType().Assembly.FullName;
于 2013-10-31T17:59:38.960 に答える