在VS和msbuild中构建VS解决方案时的差异

时间:2016-01-04 19:04:12

标签: visual-studio msbuild csc

我还将其发布为msbuild项目的issue in github

我在构建一些项目时遇到了问题。我发现在VS中构建我的解决方案之间存在差异(它工作正常),并通过命令行使用msbuild构建解决方案(失败)。

我设法制作了一个说明问题的小样本。 BuildError.zip

基本上我有两个解决方案SolA.slnSolAandB.slnSolA.sln仅包含项目A.csproj,而SolAandB.sln包含A.csprojB.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.exeB.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中构建解决方案时的方式相同?

0 个答案:

没有答案