6

私は2つのアセンブリを持っています:

アセンブリ1:

interface IWeapon {
    int Might { get; }
}

[Export("sword")]
public class Sword : IWeapon {

    public int Might {
        get { return 10; }
    }
}

アセンブリ2:

interface IWeapon {
    int Might { get; }
}

var catalog = new AssemblyCatalog(typeof(Ninja.Sword).Assembly);
var container = new CompositionContainer(catalog);
// not allowed to use the IWeapon def in assembly 2 
var sword = container.GetExportedValue<IWeapon>("sword");

私はこれを機能させる方法を知っています。MEF(Managed Extensibility Framework)にオブジェクトを要求するか、オブジェクトを名前だけでなく、正しいIWeaponをエクスポートするように取得することができます。

すべてのインターフェイスポイントが実装されている場合、MEFは「ダック」タイピングを実行してプロキシオブジェクトを返すことができますか?

4

2 に答える 2

5

MEFの初期のバージョン(クラスのILを動的に発行して返すことにより)に存在していたと思いますが、現在は削除されています。それは本当に意味がありません。結局のところ、クラスは、特定のインターフェイスを介してそのアドイン機能を実装するように設計する必要があります。それらに属性などを追加できればExport、クラスにもインターフェースを完全に実装できるはずです。

于 2009-07-17T00:36:54.803 に答える
1

両方のIWeaponクラスに同じCOMGUIDがある場合は、.NET 4での型の同等性を使用して、ダックタイピングに近づくことができます。MEFを使用したプラグインのバージョン管理とアップグレードのサポート、つまり、プラグインをロードできるv2コントラクトがあると非常に便利です。コントラクトのv1のみを実装します。これはこのテーマに関する良い記事です。

http://blogs.msdn.com/b/delay/archive/2011/03/09/mef-addict-combining-net-4-s-type-embedding-and-mef-to-enable-a-smooth- upgrade-story-for-applications-and-their-extensions.aspx

于 2012-04-14T20:20:03.953 に答える