C# MEF抛出CompositionContractMismatchException

C# MEF抛出CompositionContractMismatchException,c#,mef,C#,Mef,编写或使用ExportProvider.GetExportedValues方法时。引发异常CompositionContractMismatchException。我正在转换与静态工厂绑定的遗留代码,因此我只想将这些返回值公开给MEF容器 namespace fooProject { static class SomeExportFactory { [Export(typeof(IFoo))] public static FooImp Genera

编写或使用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将抛出一个隐藏的异常。异常看起来像加载了可能重复的程序集。就像一些答案所暗示的那样,但唉

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

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