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



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

1- 导出器库(类库)

2-导入器应用程序(WPF应用程序)

3- 共享库(类库)

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

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

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

在"ExporterLib"中,我有一个名为SharedClassExport的类:

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

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

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

当我使用调试器查看目录中的部件时,我看到正确的共享类导出部件,但它没有引用 ISharedClass!

我该怎么办?

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

提前谢谢。


总结:

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

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

請嘗試使用 [Export(typeof(ISharedClass))] 。如果要导出基类型以外的类型(如接口),则使用 typeof 指定完整的协定类型非常重要。为了匹配导出,请使用 [Import(typeof(ISharedClass))]。请让我知道这是否有效,如果没有,请提供您正在使用的目录目录组合逻辑?

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

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

最新更新