MEF Throws CompositionContractMismatchException

本文关键字:CompositionContractMismatchException Throws MEF | 更新日期: 2023-09-27 18:26:05

编写或使用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'类型。"。

有人猜测是什么原因造成的吗?我已经在互联网上搜索过了,当我试图将MEF与MVC控制器一起使用时,CompositionContractMismatchException是我能找到的最接近的东西,但我没有像那样的重复程序集。

MEF Throws CompositionContractMismatchException

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

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

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

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

相关文章:
  • 没有找到相关文章