我还将其发布为msbuild项目的issue in github。
我在构建一些项目时遇到了问题。我发现在VS中构建我的解决方案之间存在差异(它工作正常),并通过命令行使用msbuild构建解决方案(失败)。
我设法制作了一个说明问题的小样本。 BuildError.zip
基本上我有两个解决方案SolA.sln
和SolAandB.sln
。 SolA.sln
仅包含项目A.csproj
,而SolAandB.sln
包含A.csproj
和B.csproj
。项目A.csproj
只是一个类库,而B.csproj
是一个引用项目A.csproj
的命令行项目。关于此项目的微妙特性是A.csproj
配置为不在SolAandB.sln
中构建。这样做的原因是我有很多项目(超过300个,其中一些是C#,其他项目是C ++管理和非托管),有些项目包含在多个项目中(主要是为了允许添加引用)到项目),但我只想建立一次项目。
当我在VS中构建SolAandB.sln
时(我正在使用VS2015
更新1,但不相信会更改任何内容),我可以看到对csc.exe
的调用B.csproj
如下(为了清楚起见,我在参数之间添加了换行符):
C:\Program Files (x86)\MSBuild\14.0\bin\csc.exe
/noconfig
/nowarn:1701,1702,2008
/nostdlib+
/platform:anycpu32bitpreferred
/errorreport:prompt
/warn:4
/define:DEBUG;TRACE
/errorendlocation
/preferreduilang:en-US
/highentropyva+
/reference:"F:\Visual Studio 2015\Projects\BuildError\A\bin\Debug\A.dll"
/reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\mscorlib.dll"
/reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\System.Core.dll"
/debug+
/debug:full
/filealign:512
/optimize-
/out:obj\Debug\B.exe
/ruleset:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets\MinimumRecommendedRules.ruleset"
/subsystemversion:6.00
/target:exe
/utf8output
Program.cs
Properties\AssemblyInfo.cs
"C:\Users\Fede\AppData\Local\Temp\.NETFramework,Version=v4.5.2.AssemblyAttributes.cs"
obj\Debug\\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
obj\Debug\\TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
obj\Debug\\TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
请注意/reference:"F:\Visual Studio 2015\Projects\BuildError\A\bin\Debug\A.dll"
正确指向所选构建配置的A.csproj
输出。如果我内置Release
,则引用将正确指向A.csproj
的发布版本输出。
该构建的结果取决于已经构建A.csproj
,我有。您可以在BuildSolutions.proj
中看到首先构建SolA.sln
然后SolAandB.sln
的示例构建脚本。
现在,如果我通过命令行构建SolAandB.sln
,或者由于构建BuildSolutions.proj
,我可以看到csc.exe
对B.csproj
的调用如下:
C:\Program Files (x86)\MSBuild\14.0\bin\csc.exe
/noconfig
/nowarn:1701,1702
/nostdlib+
/platform:anycpu32bitpreferred
/errorreport:prompt
/warn:4
/define:DEBUG;TRACE
/highentropyva+
/reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\mscorlib.dll"
/reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\System.Core.dll"
/debug+
/debug:full
/filealign:512
/optimize-
/out:obj\Debug\B.exe
/ruleset:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets\MinimumRecommendedRules.ruleset"
/subsystemversion:6.00
/target:exe
/utf8output
Program.cs
Properties\AssemblyInfo.cs
"C:\Users\Fede\AppData\Local\Temp\.NETFramework,Version=v4.5.2.AssemblyAttributes.cs"
正如您所看到的,除了几个明显微妙的差异之外,最大的区别在于缺少参数/reference:"F:\Visual Studio 2015\Projects\BuildError\A\bin\Debug\A.dll"
,因此项目无法使用错误error CS0246: The type or namespace name 'A' could not be found (are you missing a using directive or an assembly reference?)
进行构建。
如何构建解决方案,以及在调用csc.exe
时,调用它的方式与在Visual Studio中构建解决方案时的方式相同?