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

这是开放泛型支持的 .Net 4.5 MEF 实现中的一个错误。它将在 .Net 框架的下一个版本中修复。

有几种解决方法,它们都不理想。

  1. 使接口成为抽象基类
  2. 从接口中删除 InheritedExport 并使用导出属性显式标记派生类。

我希望这有帮助。

于 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 回答