C# MEF容器无法从共享部件组成零件

C# MEF容器无法从共享部件组成零件,c#,import,export,mef,C#,Import,Export,Mef,我的解决方案中有3个项目: 1-ExporterLib(类库) 2-ImporterApp(WPF应用) 3-SharedLib(类库) 前两个项目引用了“SharedLib”,其中包含一个名为ISharedClass的接口 在“ImporterApp”中,我有一个名为ClassA的类: public class ClassA { [Import] private ISharedClass part; } 在“ExporterLib”中,我有一个名为SharedClassExport的

我的解决方案中有3个项目:

1-ExporterLib(类库)

2-ImporterApp(WPF应用)

3-SharedLib(类库)

前两个项目引用了“SharedLib”,其中包含一个名为
ISharedClass
的接口

在“ImporterApp”中,我有一个名为ClassA的类:

public class ClassA
{
    [Import] private ISharedClass part;
}
在“ExporterLib”中,我有一个名为SharedClassExport的类:

[Export(ISharedClass)]
public class SharedClassExport : ISharedClass
{
    //....
}
在ImporterApp中,我使用引用ExporterLib.dll文件和容器的目录目录。但是,当我尝试使用容器组合ClassA实例的各个部分时,我收到一个异常,它说:

1)未找到与约束匹配的导出: ContractName SharedLib.ISharedClass RequiredTypeIdentity SharedLib.ISharedClass

当我使用调试器查看目录中的部分时,我看到了正确的SharedClass导出部分,但它没有引用ISharedClass

我该怎么办

注:我想使用MEF,我不想将这些项目合并在一起

提前谢谢


总结:

//在以下情况下,指定合同类型可能很重要: 要导出除基类型之外的其他类型, 例如接口


请尝试使用[Export(typeof(ISharedClass))]。如果导出的是基类型以外的类型,如interface,则必须使用typeof指定完整的合同类型。要匹配导出,请使用[Import(typeof(ISharedClass))]。请让我知道这是否有效。如果无效,请提供您正在使用的DirectoryCatalog组合逻辑

在生成后检查ImporterApp的bin文件夹。我敢打赌ExporterLib.dll不在该文件夹中。由于ExporterLib.dll不是ImporterApp的直接依赖项,因此MSBuild不会在生成时将其复制到ImporterApp的bin文件夹。要解决此问题,您有几个选择:

  • 您可以在ImporterApp项目中添加对ExporterLib的引用
  • 如果您不想添加引用,那么在ImporterApp上执行生成后步骤将ExporterLib.dll复制到ImporterApp的bin目录也可以
  • 您还可以将每个项目设置为生成到解决方案结构中的同一目录中

单独添加[Export(typeof(ISharedClass))]不起作用。但是当我将简单的[Import]属性改为[Import(typeof(ISharedClass))]时,它就神奇地解决了。您能描述一下,如果我没有明确说明我正在使用的导入类型,会发生什么情况吗?顺便说一句,谢谢。我很高兴我能解决这个问题。如果您仔细看我的回答,我确实提到您必须将导入与[Import(typeof(ISharedClass))]匹配。这是因为您没有导出简单类型。您的类型是从ISharedClass继承的,MEF需要知道正确导出类型的完整约定。我最初的意思是,为什么MEF不能在部件的类型与导出匹配时自行确定它。。。但我看了这篇文章,发现“如果您想导出一个类型而不是像接口这样的基本类型,那么指定合同名称可能很重要”。。。我正在手动将ExporterLib.dll复制到ImporterApp的bin目录,正如您所说的那样。。。然而,索马的方法解决了这个问题。谢谢你的关注。