1

次のような MEF Contrib オープン ジェネリック サポートを使用していました。

[InheritedExport]
interface ITest2<T>
{
    void Execute();
}

class TestClass2<T> : ITest2<T>
{
    public void Execute()
    {
        Console.WriteLine();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var catalog = new AssemblyCatalog(typeof(Program).Assembly);
        var container = new CompositionContainer(catalog);
        var test2 = container.GetExportedValues<ITest2<string>>();
    }
}

ただし、.NET Framework 4.5 のインストール以降、このコードは機能しなくなりました。.NET 4.5 または .NET 4.0 に対してビルドした後に機能しなくなるだけでなく、既存のコンパイル済みアプリケーションも破損します。

TestClass2 で明示的な [Export(typeof(ITest2<>))] 属性を使用するか、定義を変更する必要があるようです。

[InheritedExport(typeof(ITest2<>))]
interface ITest2<T>
{
    void Execute();
}

なぜこれが変わったのか誰か知っていますか?不思議なことに、MEF のオープン ジェネリック サポート (4.5) も、オープン ジェネリック インターフェイスの型指定されていない [InheritedExport] 属性で失敗します。

オープン ジェネリック インターフェイスでの [InheritedExport] の既定の動作は、[InheritedExport(typeof(ITest2<>))] と同じであると考えていました。

ありがとう、スティーブ

4

2 に答える 2

5

これは、Open Generics サポートの .Net 4.5 MEF 実装のバグです。これは、.Net フレームワークの次のリリースで修正される予定です。

いくつかの回避策がありますが、どれも理想的ではありません。

  1. インターフェイスを抽象基本クラスにする
  2. インターフェイスから InheritedExport を削除し、派生クラスを Export 属性で明示的にマークします。

これが役立つことを願っています。

于 2012-08-29T20:24:56.580 に答える
-1

これは、オープン ジェネリックの .NET 4.5 実装を InheritedExport と共に使用する場合のバグのように見えます。MEF チームが調査中です。

[InheritedExport(typeof(ITest2<>))]あなたは、あなたのために修正された問題を追加することによって主張しITest2<T>ますが、これを再現しようとしてもうまくいきませんでした。Export(typeof(ITest2<>))に直接明示的に追加することによってのみ機能するようになりましたTest2Class

受信しているエラーについて、さらに詳細を教えていただけますか? また、MEF contrib をまだ使用していますか、それともこのプロジェクトで使用をやめましたか?

于 2012-08-23T02:47:36.200 に答える