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会抛出一个神秘的异常。该异常看起来像是加载了可能重复的程序集。就像一些答案所暗示的那样,但唉。
对于那些对更多细节感兴趣的人,请继续阅读(提供了到当前MEF实现的链接)。代码在ContractServices.cs上停止。你会在那里找到一个公共静态函数"TryCast"。它为MEF提供了一种机制,用于提供装箱到指定类型的对象的实例。但它只检查两种情况。首先,传入的对象已经是所需的类型。其次,对象是通过ExportedDelegate提供的(可能是成员函数Export的工作方式)。如果导出不符合其中任何一个,则返回false,并立即引发CompositionContractMismatchException(请参阅ExportServices.cs T CastExportedValue(ICompositionElement元素,object exportedValue)函数)。
我希望他们在这种情况下会抛出DummyDontUseStaticException:p