如何将msbuild升级到C#6?


106

我想在我的项目中使用C#6(零传播,其他功能)。

我已经在PC上安装了VS 2015,它的运行非常出色,并且可以像

var user = new SingleUserModel(); //all model fields are null
var test = user.User?.Avatar?["blah"];

但是,当我将项目推送到仓库并且CI开始构建它时,由于不受支持,构建失败?

我也已经在CI服务器上安装了VS2015,但是看起来它没有使用它。我能做什么?

CI-CruiseControl .NET使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe


3
对于从下面提供的链接下载MS Build Tools 2015的任何人,它们均适用于具有错误的旧版本(更新前)...我在这里找到了指向2015 Update 3 的链接
。– bdrajer

Answers:


164

确保您致电:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe

这是Visual Studio 2015附带的MsBuild版本,并调用了解这一​​点的C#编译器。通过安装任何版本的Visual Studio 2015或安装独立的Microsoft Build Tools 2015,都可以在系统上获得此版本的MsBuild 。

添加对以下NuGet包的引用也将强制使用新的编译器:

Install-Package Microsoft.Net.Compilers

请注意,Install-Package将选择最新的可用版本,而该版本可能不是您想要的版本。在安装之前,请检查发行说明和相关性以解决所处理版本的根本问题,在这种情况下,该问题更特定于VS 2015。

因此,对于Visual Studio 2015:

Install-Package Microsoft.Net.Compilers -Version 1.0.0

2
自RyuJIT以来,是否存在引起错误的任何担心?
马斯洛

3
请注意,如果要更新PATH env变量,请确保删除旧位置(例如:C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319),因为在执行“ msbuild”时仍可能会调用该位置“来自cmd
TheWebGuy,2016年

2
我还必须安装nuget软件包Microsoft.Net.Compilers:请参阅stackoverflow.com/a/36774876/584714
DrGriff

2
是否有解决方案,而不必在每个项目中都安装nuget包?我有100多个项目将需要此项目,这对我来说似乎是不必要的。似乎是某个地方的错误。
Cole W

2
有人对@ColeW问题有答案吗?
Zinov

61

您也可以在构建服务器上安装“ Microsoft Build Tools 2015”而不是VS2015。

https://www.microsoft.com/zh-cn/download/details.aspx?id=48159

它将MSBuild安装到相同的路径:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe

恕我直言,这是有原因的,为什么这个问题与那个环境有关。最好对此问题发表评论。
jogo 2015年

24
由于stackoverflow不允许我对问题发表评论,因此我以系统允许的唯一方式发布了它。如果您发现它没有用,请忽略它。对我而言,在构建服务器上搜索解决方案时,这是必须走的路,而不是安装VS2015
MuhKuh 2015年

一旦安装了“ Microsoft Build Tools 2015”(或“ Microsoft Build Tools 2017”),您还可以控制要用于生成解决方案的Visual Studio版本:MSBuild.exe / t:Build YourSolution.sln / p :VisualStudioVersion = 14.0 [对于VS2010设置为10.0,对于VS2015设置为14.0,对于VS2017设置为15.0]
AlexSanséau17

要下载并安装Microsoft Build Tools 2015 Update 3,请访问旧版VS下载并转到Redistributables and Build Tools部分。
RBT

12

您可能已经在进行此工作,但是将来可能会对其他人有所帮助。我最近遇到了这个问题,它使我朝着正确的方向前进,并最终找到了解决方案。

对此的另一种可能的解决方案是手动更新项目文件,以定位要用来构建项目的MSBuild版本。

我最近经历了TeamCity构建服务器更新,并且已经在其上安装了Microsoft Build Tools 2015。我以为我在构建服务器上拥有了所有东西,有针对C#6.0的解决方案,而且有针对.net 4.6.1的每个项目。像您一样,所有具有C#6.0特定代码的东西都可以在我的本地环境中很好地构建,但是TeamCity构建服务器不喜欢其中的任何一个。

正如其他人提到的,我尝试使用Microsoft.Net.Compilers NuGet包。它的最新版本允许该构建在我的构建服务器上运行,但不允许我在本地发布我的代码(这是我的要求)。该NuGet程序包的早期版本可以让我发布,但是该构建无法正常工作。

我发现我要做的是最终修改解决方案中的每个项目文件,以专门针对可以处理C#6.0代码的MSBuild版本。在每个项目文件中,我都找到与以下行相似的行:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

该行的关键部分是其中的ToolsVersion部分。我只是将项目文件上的这一行更改为以下内容:

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

此处的区别是我针对的是版本14,而不是4。版本14.0与Build Tools 2015相对应。通过更改此版本,我的TeamCity生成服务器使用了正确的MSBuild版本,并能够生成我的C#6.0代码。

我还必须手动更新它的TargetFrameworkVersion xml节点以使用4.6.1,因为VS2015的操作不正确并弄乱了我的本地版本,但这与这里无关。

请,如果我错了,请有人纠正我,但仅供参考,我认为版本号如下所示:

4.0 = VS2012

12.0 = VS2013

14.0 = VS2015

15.0 = VS2017

我相信,如果您想使用.net 4.7,则必须安装Build Tools 2017,并且将项目定位为15.0而不是14.0,但我尚未对此进行验证。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.