MEF抛出CompositionContractMismatchException

时间:2014-10-09 11:59:30

标签: c# mef

撰写或使用ExportProvider.GetExportedValues方法时。引发异常CompositionContractMismatchException。我正在转换使用静态工厂的遗留代码,因此我只想在MEF容器中公开返回值,例如。

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

因此,这个简单的插图会抛出此消息的异常"无法强制转换类型&f; fooProject.SomeExportFactory.Generate的基础导出值(ContractName =" IFoo")&# 39;键入' IFoo'。"输入" IFoo"。]。

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

1 个答案:

答案 0 :(得分:2)

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

如果您尝试从静态函数导出,MEF会抛出一个神秘的异常。该异常看起来像是加载了可能重复的程序集。像一些答案所表明的那样,但唉。

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

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