MEF 容器无法从共享程序集中组合零件
MEF Container cannot compose parts from Shared Assembly
我的解决方案中有 3 个项目:
1- ExporterLib(Class 库)
2- ImporterApp(WPF 应用程序)
3- SharedLib(Class 库)
前两个项目引用 "SharedLib",其中包含一个名为 ISharedClass
的接口。
在 "ImporterApp" 我有一个 class 叫做 ClassA:
public class ClassA
{
[Import] private ISharedClass part;
}
在 "ExporterLib" 里面我有一个 class 叫做 SharedClassExport:
[Export(ISharedClass)]
public class SharedClassExport : ISharedClass
{
//....
}
在 ImporterApp 中,我使用引用 ExporterLib.dll 文件和容器的 DirectoryCatalog。但是当我尝试使用容器编写 ClassA 实例的部分时,我收到一个异常消息:
1) 未找到符合约束条件的导出:
合同名称 SharedLib.ISharedClass
RequiredTypeIdentity SharedLib.ISharedClass
当我使用调试器查看目录中的部分时,我看到了正确的 SharedClassExport 部分,但它没有引用 ISharedClass !
我该怎么办?
P.S。 : 我想使用 MEF,我不想将这些项目中的任何一个合并在一起。
提前致谢。
摘要:
//指定合同类型可能很重要,如果
您想导出基本类型以外的类型,
比如接口。
请尝试使用 [Export(typeof(ISharedClass))] 。如果要导出基类型以外的类型,例如接口,使用 typeof 指定完整的契约类型很重要。要匹配导出,请使用 [Import(typeof(ISharedClass))]。请让我知道这是否有效,如果无效,请提供您正在使用的 DirectoryCatalog 组合逻辑?
构建完成后检查 ImporterApp 的 bin 文件夹。我敢打赌 ExporterLib.dll 不在文件夹中。由于 ExporterLib.dll 不是 ImporterApp 的直接依赖项,因此 MSBuild 不会在构建时将其复制到 ImporterApp 的 bin 文件夹中。要解决此问题,您有几种选择:
- 您可以在 ImporterApp 项目中添加对 ExporterLib 的引用。
- 如果您不想添加引用,也可以在 ImporterApp 上执行 post 构建步骤,将 ExporterLib.dll 复制到 ImporterApp 的 bin 目录。
- 您还可以将每个项目设置为构建到解决方案结构中的相同目录。
我的解决方案中有 3 个项目:
1- ExporterLib(Class 库)
2- ImporterApp(WPF 应用程序)
3- SharedLib(Class 库)
前两个项目引用 "SharedLib",其中包含一个名为 ISharedClass
的接口。
在 "ImporterApp" 我有一个 class 叫做 ClassA:
public class ClassA
{
[Import] private ISharedClass part;
}
在 "ExporterLib" 里面我有一个 class 叫做 SharedClassExport:
[Export(ISharedClass)]
public class SharedClassExport : ISharedClass
{
//....
}
在 ImporterApp 中,我使用引用 ExporterLib.dll 文件和容器的 DirectoryCatalog。但是当我尝试使用容器编写 ClassA 实例的部分时,我收到一个异常消息:
1) 未找到符合约束条件的导出: 合同名称 SharedLib.ISharedClass RequiredTypeIdentity SharedLib.ISharedClass
当我使用调试器查看目录中的部分时,我看到了正确的 SharedClassExport 部分,但它没有引用 ISharedClass !
我该怎么办?
P.S。 : 我想使用 MEF,我不想将这些项目中的任何一个合并在一起。
提前致谢。
摘要:
//指定合同类型可能很重要,如果 您想导出基本类型以外的类型, 比如接口。
请尝试使用 [Export(typeof(ISharedClass))] 。如果要导出基类型以外的类型,例如接口,使用 typeof 指定完整的契约类型很重要。要匹配导出,请使用 [Import(typeof(ISharedClass))]。请让我知道这是否有效,如果无效,请提供您正在使用的 DirectoryCatalog 组合逻辑?
构建完成后检查 ImporterApp 的 bin 文件夹。我敢打赌 ExporterLib.dll 不在文件夹中。由于 ExporterLib.dll 不是 ImporterApp 的直接依赖项,因此 MSBuild 不会在构建时将其复制到 ImporterApp 的 bin 文件夹中。要解决此问题,您有几种选择:
- 您可以在 ImporterApp 项目中添加对 ExporterLib 的引用。
- 如果您不想添加引用,也可以在 ImporterApp 上执行 post 构建步骤,将 ExporterLib.dll 复制到 ImporterApp 的 bin 目录。
- 您还可以将每个项目设置为构建到解决方案结构中的相同目录。