【问题标题】:MEF Container cannot compose parts from Shared AssemblyMEF 容器无法从共享装配中组合零件
【发布时间】:2016-08-14 23:42:22
【问题描述】:

我的解决方案中有 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!

我该怎么办?

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

提前致谢。


总结:

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

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

【问题讨论】:

    标签: c# import export mef


    【解决方案1】:

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

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

    【讨论】:

    • 我正在手动将 ExporterLib.dll 复制到 ImporterApp 的 bin 目录中,正如您已经说过的那样......但是 Soma 的方法解决了这个问题。感谢您的关注。
    【解决方案2】:

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

    【讨论】:

    • 单独添加 [Export(typeof(ISharedClass))] 不起作用。但是当我将简单的 [Import] 属性更改为 [Import(typeof(ISharedClass))] 时,它神奇地解决了。如果我没有明确说明我正在使用的 Import 类型,你能描述一下会发生什么吗?顺便谢谢。
    • 我很高兴我能够解决这个问题。如果您仔细查看我的回复,我确实提到您必须将 Import 与 [Import(typeof(ISharedClass))] 匹配。这是因为您没有导出简单类型。您的类型继承自 ISharedClass,MEF 需要了解正确导出类型的完整合同。
    • 好吧,我最初的意思是,当零件的类型与导出匹配时,为什么 MEF 不能自己弄清楚......但我看了这篇文章,我发现“指定如果您想导出基本类型以外的类型,例如接口,则合同名称可能很重要" ... msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多