MSBuild无法生成C++/CLI好友程序集

MSBuild无法生成C++/CLI好友程序集,msbuild,c++-cli,friend,Msbuild,C++ Cli,Friend,我有VisualStudio2008SP1,两个C++/CLI项目,比如说proj1和proj2。 proj2依赖于proj1,但方式很奇怪(见下文)。 在项目依赖项中,我指定proj2依赖于proj1。 proj2参考也包括proj1。 然后我想让proj1成为proj2的朋友, 所以,正如上的MSDN页面所说,我在proj2的某个地方写下了以下代码: #using "proj1.dll" as_friend. #使用“proj1.dll”作为朋友。 编译说明proj1.dll已经被引用,我应

我有VisualStudio2008SP1,两个C++/CLI项目,比如说proj1和proj2。 proj2依赖于proj1,但方式很奇怪(见下文)。 在项目依赖项中,我指定proj2依赖于proj1。 proj2参考也包括proj1。 然后我想让proj1成为proj2的朋友, 所以,正如上的MSDN页面所说,我在proj2的某个地方写下了以下代码:

#using "proj1.dll" as_friend. #使用“proj1.dll”作为朋友。 编译说明proj1.dll已经被引用,我应该从proj2项目设置中删除项目引用(从而删除/FU标志)

这是错误(?): 如果我从proj2中删除proj1引用,但仍然在解决方案项目依赖项中指定proj2依赖于proj1, 在VS2008中一切都编译正常。但是MSBUILD解析项目引用,为项目J2创建新的临时项目, 添加/FU:proj1.dll,生成失败

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

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


问题2:有没有办法使“项目依赖性”成为一个有条件的选项?我希望在VS2008和MSBuild中都能使用它…

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

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

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


科林

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

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