【发布时间】: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)