我正在使用Prism和MEF Extensions,并且在导入界面时遇到了一些项目设置问题。问题是接口与具体实现不在同一个程序集中(因为在其他项目中还有其他具体实现,使用相同的接口)。
因为我只使用接口引用了项目,并且具体实现从未在我的主应用程序中直接引用,它永远不会包含在bin目录中。因此,在运行时MEF组合失败,因为它试图注入一个没有包含实现的程序集的类。
这样做的正确方法是什么?我总是可以将它复制到bin目录,但这很糟糕......或者我可以将它复制到插件目录,但这也很糟糕,因为其他具体实现必须存在于同一个插件目录中。
要么我完全错过了某些东西,要么这对MEF不是很好用,或者......?
答案 0 :(得分:1)
MEF实现模块通常不会被主项目引用 - MEF的重点是能够在运行时加载不同的东西。
我在VS的主项目中创建一个后构建操作,将MEF模块复制到主要项目期望找到MEF模块的任何内容 - bin或bin的子目录。
您可以改为在每个MEF模块项目中更改构建输出目录,以将模块二进制文件输出到主项目bin目录或bin的子目录。
我不熟悉Prism,但是对于使用.NET 4.0的普通旧MEF,我构建了MEF模块文件路径的MEF目录,通常来自主项目配置文件中的信息。 (加载目录中找到的所有dll是一个麻烦的邀请)
即使主项目没有引用MEF模块,在构建主项目时,仍然可以通过将MEF模块添加到主项目的项目依赖项来获得VS来构建MEF模块。确保所有MEF模块项目都包含在与主项目相同的解决方案中。右键单击Solution Explorer中的主项目,选择Project Dependencies,并在所有MEF模块旁边放置一个复选标记。当MEF模块发生变化时,这也会导致主项目被重新编译,这不是严格必要的,但如果您在某处更改接口,仍然是一个好主意。