0

.NET 4で拡張可能な「ユーティリティ」コンソールアプリケーションを作成しようとしていますが、MEFを使用してこれを行うと、柔軟性と拡張性の点で最高の結果が得られると考えました。

そこで、MEFインターフェイスの設定を開始しました。

public interface IUtility
{
    string Title { get; }
    string Version { get; }

    void Execute(UtilContext context);
}

次に、ほぼ同一の2つのテストプラグインを作成しました。これがどのように機能するかを確認するためです。

MEFプラグイン:

[Export(typeof(IUtility))]
public class Utility1 : IUtility
{
    public string Title
    {
        get { return "Utility 1"; }
    }

    public string Version
    {
        get { return "1.0.0.0"; }
    }

    public void Execute(UtilContext context)
    {
    }
}

MEFプラグインの「ホスト」として機能するコンソールアプリは、次のようになります。

[ImportMany]
public IEnumerable<IUtility> _utilities { get; set; }

public void SetupMEF()
{ 
   string directory = ConfigurationManager.AppSettings["Path"];

   AggregateCatalog catalog = new AggregateCatalog();
   catalog.Catalogs.Add(new DirectoryCatalog(directory));

   CompositionContainer container = new CompositionContainer(catalog);
   container.ComposeParts(this);
}

私はチェックしました-ディレクトリはapp.config正しく読み取られており、ソリューションが構築された後、プラグインモジュール(* .dllファイル)がそこに存在します。この例外が発生するまでは、すべて問題ないようです。

System.Reflection.ReflectionTypeLoadExceptionが処理さ
れませんでしたメッセージ=1つ以上の要求されたタイプをロードできません。詳細については、LoaderExceptionsプロパティを取得してください。

LoaderException:
アセンブリ'Utility1、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null'のタイプ'Utility.Utility1'のメソッド'get_Version'には実装がありません

うーん....MEFはここで私に何を伝えようとしているのですか?そして、どうすればこの問題を解決できますか?何か考え、アイデア、指針はありますか?

Version私は自分のプロパティを持っていることでいくつかの慣習を破りましたか?それはMEFによって予約されたものですか?

4

1 に答える 1

2

申し訳ありませんが、悪いです。Get「plugin」ディレクトリに非常に古い *.dll が残っていましたが、実際にはそのプロパティのメソッドの実装がありませんでした。

そのプレアルファを一掃する;-) *.dllは私の問題を解決しました。実際にプラグインをロードできるようになり、問題なくVersionプロパティを呼び出すことができます。

于 2012-06-03T12:39:55.060 に答える