2

私は MEF を初めて使用し、それを使用してプラグイン システムを構築しようとしていますが、ステップ 1 で行き詰っています。

Andrew Whitechapelの記事をフォローしています。彼のサンプル コードをダウンロードしたところ、正常に実行されました ("エクスポート" アセンブリの 1 つを削除すると、それらは彼のサンプルでは相互に排他的であり、MEF アセンブリを参照します)。

このサンプルは、単一のパーツのインポートを示しています。複数のパーツをインポートしたい (すべて同じインターフェースに基づく)。そこで、サンプルコードを次のように変更します。

[Import]
// OLD - public Interface.ICalculate Calculate { get; set; }
public IEnumerable<Interface.ICalculate> Calculators { get; set; }

// OLD - Console.WriteLine(
// OLD -     String.Format("{0}", Calculate.Circumference(4)));
foreach (Interface.ICalculate calculator in Calculators)
{
    Console.WriteLine(
    String.Format("{0}", calculator.Circumference(4)));
}

IEnumerable の System.Collections.Generic もインポートしました。

重要な変更は最初のものです。私が理解しているように、これにより、複数のアセンブリからパーツをインポートできるようになります。ただし、次のエラーが表示されます。

No valid exports were found that match the constraint

この時点では、複数の「プラグイン」アセンブリを追加していません。まだ持っているだけです。

完全を期すために、「プラグイン」クラス ライブラリ内の彼のエクスポート定義 (私は触れていません) を次に示します。

[Export(typeof(Interface.ICalculate))]
public class Calculate : Interface.ICalculate

何か案は?ここで頭をかいてます。私は SO と MEF フォーラムを検索しましたが、私を啓発するものを見つけることができました。

VS 2008 SP1 (2010 ベータ版はインストールされていません) と最新の System.ComponentModel.Composition アセンブリ (2009.26.8.0) を使用しています。

4

1 に答える 1

5

MEF プレビュー リリース 5 ではこれが変更されました。ImportAttribute の代わりに ImportManyAttribute を使用する必要があります。

[ImportMany]
public IEnumerable<Intertface.ICalculate> Calculators { get; set; }

詳しくはPR5のお知らせをご覧ください。

于 2009-09-18T15:35:32.483 に答える