有没有简单的方法使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工具链, 除非 :
- 环境variables
MSBUILDLEGACYDEFAULTTOOLSVERSION
设置和 … - …所有的项目文件都将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。