如何将 msbuild 升级到 C# 6?

Posted

技术标签:

【中文标题】如何将 msbuild 升级到 C# 6?【英文标题】:How to upgrade msbuild to C# 6? 【发布时间】:2015-11-07 13:55:50 【问题描述】:

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

我已经在我的 PC 上安装了 VS 2015,它运行良好,可以构建类似的测试代码

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

但是当我将我的项目推送到 repo 并且 CI 开始构建它时,构建失败,因为 ? 不受支持。

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

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

【问题讨论】:

对于从下面给出的链接下载 MS Build Tools 2015 的任何人,它们适用于有错误的旧(更新前)版本...我找到了一个链接 here 到 2015 Update 3。 【参考方案1】:

请务必致电:

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

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

添加对following NuGet package 的引用也将强制使用新编译器:

Install-Package Microsoft.Net.Compilers

请注意Install-Package 将选择最新的可用版本,它可能不是您正在寻找的版本。在安装之前,请检查发行说明和依赖项以解决正在处理的版本的潜在问题,在这种情况下,它更特定于 VS 2015。

所以对于 Visual Studio 2015:

Install-Package Microsoft.Net.Compilers -Version 1.0.0

【讨论】:

自 RyuJIT 或其他有这么多错误的东西以来,是否有任何担心这会导致错误? 请注意,如果您要更新 PATH 环境变量,请务必删除旧位置(例如:C:\Windows\Microsoft.NET\Framework\v4.0.30319),因为它从 cmd 执行“msbuild”时可能仍会调用它 我还必须安装 nuget 包 Microsoft.Net.Compilers:请参阅 ***.com/a/36774876/584714 是否有无需在每个项目中安装 nuget 包的解决方案?我有 100 个需要这个的项目,这对我来说似乎没有必要。好像是某个地方的错误。 有人回答@ColeW 的问题吗?【参考方案2】:

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

https://www.microsoft.com/en-us/download/details.aspx?id=48159

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

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

【讨论】:

恕我直言,这是有原因的,为什么这个问题与那个环境有关。最好对问题发表评论。 由于 *** 不允许我对问题发表评论,我以系统允许的唯一方式发布它。如果您觉得它没有用,请忽略它。对我来说,在我的构建服务器上搜索解决方案时,这是要走的路,而不是安装 VS2015 安装“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] 要下载和安装 Microsoft Build Tools 2015 Update 3,请访问 older VS downloads 并转到 Redistributables and Build Tools 部分。【参考方案3】:

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

另一种可能的解决方案是手动更新您的项目文件,以针对您希望构建项目的 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 为目标,但我还没有验证这一点。

【讨论】:

以上是关于如何将 msbuild 升级到 C# 6?的主要内容,如果未能解决你的问题,请参考以下文章

Docs-VisualStudio-MSBuild-MSBuild参考:MSBuild 保留属性和已知属性

msbuild 中动态生成的 C# 文件的问题

Sonarqube C# MsBuild 访问被拒绝

将 pdb 文件包含到我的 nuget (nupkg) 文件中

MSBuild 如何决定是不是需要重建 C# 库?

C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6