关于c#:是否有一种简单的方法可以使Visual Studio 2015使用特定的ToolsVersion?

Is there a simple way to make Visual Studio 2015 use a specific ToolsVersion?

使用msbuild的特定版本构建项目或解决方案时,可以使用/toolsversion/tv开关选择早期的.net工具链:

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

根据以上所述,这对于msbuild的所有版本以及csc.exe等的版本均适用。

1
2
3
4
5
6
7
8
9
10
11
>"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版本和许多环境变量,我可能会得到以下任何一项:

  • 在项目文件的顶级元素中指定的ToolsVersion
  • 与我使用的msbuild.exe版本相对应的ToolsVersion
  • msbuild.exe.config中的值
  • 注册表中的值

(请参阅MSDN上的"覆盖工具版本设置"页面的不同版本)。

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

但是,在使用Visual Studio构建时,不能使用/tv开关。而是,Visual Studio 2013及更高版本将使用该版本的Visual Studio附带的.net工具链,除非:

  • 设置环境变量MSBUILDLEGACYDEFAULTTOOLSVERSION并...
  • ...所有项目文件的ToolsVersion属性都设置为我要使用的版本。

这是如此巴洛克,以至于我无法相信任何人实际上正在这样做。因此,我的问题是:

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

最后:

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

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

  • 我希望在IDE和构建服务器上的构建相同(当然)
  • 我希望能够使用VS2015(及以后的版本),因为它比以前的版本更好,但我不想在我决定使用之前使用新的工具链。

也许我想要太多...)

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

一些背景:我问这个问题是因为最近我的一位同事提交了C#6.0代码,该代码可以用Roslyn在Visual Studio 2015的副本上很好地编译,但是在CI中失败,因为我们使用的是以前版本的C#构建错误。 .net工具链(他们使用了没有设置器的自动属性,在Roslyn中很好,但在较早的版本中没有)。我们将把CI版本更新为Roslyn,但我想看看我们是否可以防止将来发生这种情况。


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

扩展的代码可以在这里找到: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也为此提供了一些工具。


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

问候...

编辑:

https://msdn.microsoft.com/zh-CN/library/bb383985.aspx

by setting the $(ProjectToolsVersion) property on a project within a solution. This lets you build a project in a solution with a Toolset version that differs from that of the other projects.

所以,我认为您已经得到了答案;)


您在Visual Studio中看到的内容(工具等)及其背后的代码不是已包含在已编译数据中的内容,它们只是视觉/可读的表示形式,当将它们编译为VS的早期版本时,您将使其成为可执行文件。版。

请记住,如果编译为以前的.NET版本,则可能会丢失诸如异步功能之类的功能。