有没有简单的方法使Visual Studio 2015使用特定的ToolsVersion?

使用特定版本的msbuild构build项目或解决scheme时,可以使用/toolsversion/tv开关select较早的.net工具链:

 "C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln 

这只适用于所有版本的msbuild ,并正确selectcsc.exe等版本基于上述:

 > "C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:4.0 amazing.sln ... CoreCompile: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe ... ... > "C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln ... CoreCompile: C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe ... ... 

如果我指定/tv ,那么取决于我使用的是哪个版本的msbuild以及一些环境variables,我可能会得到以下任何一个:

  • 在项目文件的顶层元素中指定的ToolsVersion
  • ToolsVersion对应于我正在使用的msbuild.exe版本
  • 来自msbuild.exe.config的值
  • 来自registry的值

(请参阅MSDN上“ 覆盖ToolsVersion设置”页面的不同版本 )。

因此,为了在构build服务器和本地计算机上具有一致的结果,我在运行msbuild.exe时使用/tv (实际上,这是在psake脚本中执行的,这也确保它使用相应的版本的msbuild.exe )。

但是,使用Visual Studio构build时,我无法使用/tv开关。 相反,Visual Studio 2013及以上版本将使用该版本的Visual Studio附带的.net工具链, 除非

  • 环境variablesMSBUILDLEGACYDEFAULTTOOLSVERSION设置
  • …所有的项目文件都将ToolsVersion属性设置为我想要使用的版本。

这是巴洛克式的,我不能相信有人在做这件事。 我的问题是这样的:

  • 有人在做MSBUILDLEGACYDEFAULTTOOLSVERSION事吗?
  • 如果没有,还有另一种方法可以使Visual Studio使用特定的ToolsVersion,而不使用ToolsVersion附带的Visual Studio版本? 可以存储在版本控制中的东西(所以在一个项目或其他设置文件中)将是理想的。

最后:

  • 我应该关心吗? 鉴于每个C#编译器的后续版本都应该能够处理以前版本的input,并且可以在项目文件中设置目标.net框架和C#语言级别,这足以确保可重复构build?

(我的偏见是我应该关心,因为:

  • 我想build立在IDE和构build服务器是相同的(当然)
  • 我希望能够使用VS2015(和将来的版本),因为它是比以前版本更好的IDE,但是我不希望被迫使用新的工具链,直到我决定。

也许我想太多…)

有关该问题的具体示例,请参阅我在github上的msbuild-vs-vs2015-toolsversion存储库。


一些背景:我这样问是因为当我的一个同事提交的C#6.0代码在Visual Studio 2015的副本上与Roslyn一起编译时,我们最近有一个CI编译错误,但在CI中失败了,因为使用了以前版本的.net工具链(他们使用了一个没有setter的自动属性,在Roslyn中没有问题,但是在早期版本中没有)。 我们将更新CI构build到Roslyn,但我想看看我们是否可以防止这种事情发生在未来。

我通过编写一个Visual Studio扩展来解决这个问题,该扩展在构build期间临时设置环境variablesMSBUILDDEFAULTTOOLSVERSION ; 要使用的值是从与.sln文件相同的目录中的.toolsversion文件中读取的。 psake脚本读取相同的.toolsversion文件并将值传递给/tv开关。

扩展的代码可以在这里find: https : //github.com/guyboltonking/set-toolsversion-extension 。 可悲的是,我现在没有用C ++或Visual Studio,所以我不能提供任何支持(但我可以告诉你,我用了几个月没有问题)。

感谢@efaruk提醒我有关MSBUILDDEFAULTTOOLSVERSION的存在。

编辑:感谢@ mbadawi23,现在可以使用扩展与VS2015和VS2017。

要在Visual Studio 2015中强制使用特定的C#版本,可以进入项目属性 – >生成 – >高级 – >语言版本。

如果将其设置为5,编译器将会抱怨C#6特性:特性“…”在C#5中不可用。请使用语言版本6或更高版本。

另外ReSharper也有一些工具。

注意:您始终可以创build一个msbuild文件来使用它来构build项目,或者自行更改项目,并且可以有条件地决定您的工具版本( https://msdn.microsoft.com/zh-cn/library/7z253716.aspx )(. csproj也是一个具有不同扩展名的结构化的msbuild脚本,它也将与VS兼容)。

问候…

编辑:

https://msdn.microsoft.com/en-us/library/bb383985.aspx

通过在解决scheme中设置项目的$(ProjectToolsVersion)属性。 这使您可以在工具集版本与其他项目不同的解决scheme中构build项目。

所以,我想你已经得到了你的答案;)

你在Visual Studio中看到的东西(工具等)以及它们后面的代码并不是编译数据中包含的东西,它们只是一个可视化/可读的表示,当把它们编译成VS的早期版本时,版。

请记住,如果编译为以前的.NET版本,您可能会失去function,如asynchronousfunction。