2016-04-21 57 views
2

我在我的溶液3个项目:MEF容器不能从共享装配组成份

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://msdn.microsoft.com/en-us/library/system.componentmodel.composition.importattribute(v=vs.110).aspx

回答

2

请尝试使用[导出(typeof运算(ISharedClass))。如果要导出除基本类型之外的类型(如接口),则使用typeof指定完整的合同类型非常重要。要匹配导出使用[导入(typeof(ISharedClass))]。请让我知道如果不工作,请提供您正在使用的DirectoryCatalog组合逻辑?

+0

单独添加[导出(typeof(ISharedClass))]不起作用。但是当我将简单的[Import]属性更改为[Import(typeof(ISharedClass))]时,它被神奇地解决了。你能描述一下如果我没有明确说明我正在使用的导入类型会发生什么?谢谢你的方式。 –

+0

我很高兴我能解决这个问题。如果您仔细查看我的回复,我确实提到您必须将导入与[导入(typeof(ISharedClass))]相匹配。这是因为你没有导出简单的类型。您的类型从ISharedClass继承,MEF需要知道正确导出类型的完整合同。 –

+0

那么我最初的意思是说,为什么MEF只是在零件的类型与出口匹配时才能找出它本身......但是我看了这篇文章后发现“如果你指定合同名称可能很重要想要导出除接口之外的基本类型以外的类型“... https://msdn.microsoft.com/en-us/library/system.componentmodel.composition.importattribute(v=vs.110).aspx –

0

生成后检查ImporterApp的bin文件夹。我愿意下注ExporterLib.dll不在文件夹中。由于ExporterLib.dll不是ImporterApp的直接依赖关系,因此MSBuild不会将其复制到构建时的ImporterApp的bin文件夹中。要解决这个问题,您有几个选择:

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

I手动将ExporterLib.dll复制到ImporterApp的bin目录中,正如你所说的那样......然而Soma的方法解决了这个问题。感谢您的关注。 –