次のような 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<>))] と同じであると考えていました。
ありがとう、スティーブ