2014-10-09 38 views
1

在撰写或使用ExportProvider.GetExportedValues方法时。抛出异常CompositionContractMismatchException。例如,我转换遗留的代码与静态工厂,所以我只是想公开那里返回值到MEF容器。MEF抛出CompositionContractMismatchException

namespace fooProject 
{ 
    static class SomeExportFactory 
    { 
     [Export(typeof(IFoo))] 
     public static FooImp Generate() 
     { 
      return new FooImp(); 
     } 
    } 
} 

所以,这个简单的例子将抛出异常与此消息“不能投类型的内在导出值‘fooProject.SomeExportFactory.Generate(ContractName =‘的IFoo’)’输入‘的IFoo’”。键入“IFoo”。]。

任何猜测什么可能导致这种情况?我已经搜索了互联网,CompositionContractMismatchException when trying to use MEF with MVC controller是我可以找到的关闭的东西,但我没有像那样的情况下重复的程序集。

回答

2

好的,我找到了答案。不要从静态函数中导出!!!希望这可以帮助其他人在这种情况下。

如果您尝试从静态函数中导出,MEF将抛出一个模糊的异常。异常看起来像一个潜在的重复程序集加载。就像一些答案提示的那样,但唉。

对于对更多细节感兴趣的人可以阅读(提供了当前MEF实现的链接)。代码在ContractServices.cs处刹车。你会在那里找到一个公共静态函数“TryCast”。它为MEF提供了一个机制来提供装箱到指定类型的对象的实例。但它只检查2个条件。首先,传入的对象已经是所需的类型。其次,通过ExportedDelegate提供对象(可能的成员函数Export的工作原理)。如果您的导出不符合其中的任何一个,则返回false,并立即引发CompositionContractMismatchException(请参阅ExportServices.cs T CastExportedValue(ICompositionElement元素,object exportedValue)函数)。

我希望他们会在这种情况下抛出DummyDontUseStaticException:p