MEF 容器无法从共享程序集中组合零件

MEF Container cannot compose parts from Shared Assembly

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

1- ExporterLib(Class 库)

2- ImporterApp(WPF 应用程序)

3- SharedLib(Class 库)

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

在 "ImporterApp" 我有一个 class 叫做 ClassA:

public class ClassA
{
    [Import] private ISharedClass part;
}

在 "ExporterLib" 里面我有一个 class 叫做 SharedClassExport:

[Export(ISharedClass)]
public class SharedClassExport : ISharedClass
{
    //....
}

在 ImporterApp 中,我使用引用 ExporterLib.dll 文件和容器的 DirectoryCatalog。但是当我尝试使用容器编写 ClassA 实例的部分时,我收到一个异常消息:

1) 未找到符合约束条件的导出: 合同名称 SharedLib.ISharedClass RequiredTypeIdentity SharedLib.ISharedClass

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

我该怎么办?

P.S。 : 我想使用 MEF,我不想将这些项目中的任何一个合并在一起。

提前致谢。


摘要:

//指定合同类型可能很重要,如果 您想导出基本类型以外的类型, 比如接口。

https://msdn.microsoft.com/en-us/library/system.componentmodel.composition.importattribute(v=vs.110).aspx

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

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

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