MEF Container无法从Shared Assembly组成零件

时间:2016-04-21 16:15:46

标签: 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的类:

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

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

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

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

我该怎么办?

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

提前致谢。

内容:

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

https://capnproto.org/

2 个答案:

答案 0 :(得分:2)

请尝试使用[导出(typeof(ISharedClass))]。如果要导出基本类型以外的类型(例如接口),则使用typeof指定完整的合同类型很重要。要匹配导出使用[导入(typeof(ISharedClass))]。如果没有,请告诉我,如果没有,请提供您正在使用的DirectoryCatalog组合逻辑?

答案 1 :(得分:0)

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

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