我有Visual Studio 2008 SP1,两个C ++ / CLI项目,让我们说proj1和proj2。 proj2依赖于proj1,但是以一种奇怪的方式(见下文)。 在Project Dependencies中,我指定proj2依赖于proj1。 proj2引用也包括proj1。 然后我想让proj1成为proj2的朋友, 所以,正如"Friend Assemblies"上的MSDN页面所说,我在proj2中的某处写了这段代码:
#using "proj1.dll" as_friend.
编译说proj1.dll已经引用了,我应该从proj2项目设置中删除项目引用(从而删除/ FU标志)。
这是错误(?): 如果我从proj2中删除proj1引用,但仍然在解决方案Project Dependencies中指定proj2依赖于proj1, 一切都在VS2008中编译好了。但MSBUILD解析项目引用,为proj2创建新的临时项目, ADDS /FU:proj1.dll和BUILD FAILS!
问题1:有没有办法禁用此MSBuild行为?
然后,如果我删除Project Dependencies中的依赖项,MSBuild构建正常,但Visual Studio尝试并行编译proj1和proj2,并失败, 因为proj2要小得多并且首先编译...在Project和Solutions / Build and Run中设置max parallel builds选项有帮助, 但是我必须在每台开发者机器上都这样做,我无法在解决方案中保存此设置,这会使构建变得更慢......
问题2:有没有办法让“项目依赖”成为条件选项?我希望它适用于VS2008和MSBuild ...
答案 0 :(得分:2)
正如OP已经发现的,这实际上是一个错误。 OP提交了bug并得到了微软的承认。它似乎会影响VS2005,VS2008和VS2010(针对VS2008)。
我使用的解决方法是一个虚拟中间项目,用于“缓冲”2个相关项目之间的引用。
答案 1 :(得分:0)
如果ProjA依赖于ProjB而ProjB依赖于ProjA,那么我很惊讶你可以构建它!这种循环构建依赖通常会杀死干净的构建。在构建ProjB和vise-vera时,你经常会在开发机器上侥幸逃脱它。但是在干净的机器(构建服务器)上,这种依赖性经常会破坏事物。
根据依赖关系,将公共依赖项移动到新的程序集ProjC可能是最简单的,它没有自己的依赖项,但ProjA和ProjB都依赖它。这意味着您可以随后以任何顺序构建ProjC,然后构建ProjA和ProjB。当你只依赖于ProjC的接口而不是具体的类时,这种重构通常是最简单的。
不确定这完全回答了您的问题,但它可能会为您提供另一种解决方法。
科林