0

我有 Visual Studio 2008 SP1,两个 C++/CLI 项目,比如说 proj1 和 proj2。proj2 依赖于 proj1,但方式很奇怪(见下文)。在项目依赖项中,我指定 proj2 依赖于 proj1。proj2 参考也包括 proj1。然后我希望 proj1 成为 proj2 的朋友,因此,正如“Friend Assemblies”上的 MSDN 页面所说,我在 proj2 的某处写了这段代码:

#使用“proj1.dll”作为_friend。

编译说 proj1.dll 已经被引用,我应该从 proj2 项目设置中删除项目引用(从而删除 /FU 标志)。

这里出现了错误(?):如果我从 proj2 中删除 proj1 引用,但仍然在解决方案 Project Dependencies 中指定 proj2 依赖于 proj1,那么在 VS2008 中一切都可以编译。但是 MSBUILD 解析项目引用,为 proj2 创建新的临时项目,添加 /FU:proj1.dll 和构建失败!

问题 1:有没有办法禁用此 MSBuild 行为?

然后,如果我删除项目依赖项中的依赖项,MSBuild 构建良好,但 Visual Studio 尝试并行编译 proj1 和 proj2,但失败,因为 proj2 小得多并且首先编译...在项目和解决方案中设置最大并行构建选项/ Build and Run 有帮助,但我必须在每台开发人员机器上都这样做,我无法在解决方案中保存此设置,这会使构建速度变慢等等......

问题2:有没有办法让“项目依赖”成为条件选项?我希望它适用于 VS2008 和 MSBuild ......

4

2 回答 2

2

正如OP已经发现的那样,这实际上是一个错误。OP 提交了一个错误并得到了微软的承认。它似乎会影响 VS2005、VS2008 和 VS2010(针对 VS2008)。

我使用的解决方法是一个虚拟中间项目来“缓冲”两个依赖项目之间的引用。

于 2010-01-25T17:13:15.847 回答
0

如果 ProjA 依赖于 ProjB 而 ProjB 依赖于 ProjA,那么我很惊讶你可以构建它!这种循环构建依赖通常会杀死干净的构建。当您构建 ProjB 和 vise-vera 时,您经常在旧 ProjA 仍然存在的开发机器上侥幸逃脱。但是在干净的机器(构建服务器)上,这种依赖经常会破坏事情。

根据依赖项是什么,将公共依赖项移动到新的程序集 ProjC 可能是最简单的,它没有自己的依赖项,但 ProjA 和 ProjB 都依赖它。这意味着您可以随后以任何顺序构建 ProjC,然后是 ProjA 和 ProjB。当您只依赖 ProjC 的接口而不是具体的类时,这种重构通常是最简单的。

不确定这是否完全回答了您的问题,但它可能会为您提供解决问题的替代方法。

科林

于 2009-04-21T08:41:53.107 回答