【问题标题】:MEF open generic problems with 4.5MEF 打开 4.5 的一般问题
【发布时间】:2012-08-30 04:33:06
【问题描述】:

我们像这样使用 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))] 相同。

谢谢, 史蒂夫

【问题讨论】:

  • 您可能知道,此错误已在 2013 年 5 月的 .NET4.5 更新 (KB2805221) 中修复。为了帮助遇到同样问题的其他人,您可以回答自己的问题。 (support.microsoft.com/kb/2805221)

标签: .net mef .net-4.5


【解决方案1】:

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

有几种变通方法,但都不是理想的。

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

我希望这会有所帮助。

【讨论】:

  • 我正在尝试使用 .NET 4.5.1 让开放泛型工作。在我问一个问题(正确地)之前,我只想知道开放泛型是否开箱即用? OP 正在使用 MEFContrib,它现在已经很老了。从导出部件的元数据中,我可以看到 MEF 已确认导出的通用属性。谢谢
【解决方案2】:

在使用开放泛型的 .NET 4.5 实现和 InheritedExport 时,这看起来像是一个错误。 MEF 团队正在调查。

您声称通过在 ITest2&lt;T&gt; 上添加 [InheritedExport(typeof(ITest2&lt;&gt;))] 为您解决了问题,但是在我尝试重现此问题时,它也不起作用。我只是通过直接在Test2Class 上添加明确的Export(typeof(ITest2&lt;&gt;)) 来让它工作。

您能否提供有关您收到的错误的更多详细信息?另外,您还在使用 MEF contrib 的东西,还是在这个项目中停止使用它?

【讨论】:

  • 嗨,韦斯,感谢您提供的信息。可以在此处找到有关完整调用堆栈的更多详细信息:social.msdn.microsoft.com/Forums/en-US/MEFramework/thread/…。没错,当我第一次尝试这个时, InheritedExport(Type) 不起作用。也许我在那里弄错了。我会再调查一下。
  • @Steve 如果您需要立即修复此问题,请联系 Microsoft dot com 的 netfx45compat。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多