【问题标题】:MEF Throws CompositionContractMismatchExceptionMEF 引发 CompositionContractMismatchException
【发布时间】:2014-10-11 17:41:04
【问题描述】:

在编写或使用 ExportProvider.GetExportedValues 方法时。抛出异常 CompositionContractMismatchException。我正在转换带有静态工厂的遗留代码,所以我只是想将返回值公开给 MEF 容器。

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 是我能找到的最接近的东西,但我没有像这种情况下那样重复的程序集。

【问题讨论】:

    标签: c# mef


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多