MEF 容器无法从共享程序集组合零件
本文关键字:零件 组合 共享程序集 MEF | 更新日期: 2024-11-05 15:09:54
我的解决方案中有 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 目录也可以。
- 还可以将每个项目设置为生成到解决方案结构中的同一目录。