将 C# 7.1 与 MSBuild 结合使用

Using C# 7.1 with MSBuild

要在 Visual Studio 2017 中使用新的 C# 7.1 language features,请将设置 <LangVersion>latest</LangVersion> 添加到项目文件中。

但是,从 MSBuild(版本 15.3.409.57025,位于 C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\MSBuild.0\Bin)构建此类项目会导致错误:

CSC : error CS1617: Invalid option 'latest' for /langversion;
must be ISO-1, ISO-2, Default or an integer in range 1 to 6.

MSBuild 是否还不支持此功能,或者是否有可能实现此功能?

这涵盖了最初在 Visual Studio 2013 年和 2015 年以不同方式创建的 200 多个项目。它们都使用 Target Framework Migrator 工具(保存 lots 次点击并出现 - 基于检查 .csproj 文件更改 - 正确完成工作)。

从 Visual Studio 2017 年开始,项目全部构建成功。

我在这里找到了一个使用 C# 7.1 的 C# 控制台应用程序的解决方案。

使用 VS 2017 命令行(以及 MSBuild 15.3.409.57025)它运行良好。 (.csproj 确实包含 <LangVersion>latest</LangVersion>。)

Is this feature just not yet supported by MSBuild, or is it possible to get this working?

是的。

csc.exe 的哪个实例正在 运行 以及它的版本是什么?因为看起来,尽管引用了版本,但您的 csc.exe 版本是错误的(错误消息显示 1-6 所以即使 C# 7 也不起作用)。

我们发现我们的 MVC 项目触发了这个问题。

为了修复,我们将这些项目使用的 Microsoft.CodeDom.Providers.DotNetCompilerPlatform NuGet 包从版本 1.0.0 更新为 1.0.7.

添加对 Microsoft.Net.Compilers 包(版本 2。3.x,以获得 C# 7.1)的引用。

description of the package:

Microsoft.Net.Compilers

This package not only includes the C# and Visual Basic compilers, it also modifies MSBuild targets so that the included compiler versions are used rather than any system-installed versions. Once installed, this package requires Microsoft Build Tools 2015.

Nuget 包

  • Microsoft.Net.Compilers nuget 包不工作,不需要 安装。

设置如下project/build settings

  • Debug Release 构建属性中至少设置 C# 7.1 或更高。 (通过:项目菜单 > [ProjectName] 属性 > 构建选项卡 > [高级] 按钮 > 语言版本)。

  • 将其设置为最新 无效。

还要确保您是 运行 最新的 MSBuild 版本。

如果您因为遇到 OP 提到的错误而登陆这里,运行 msbuild 通过命令行 (例如来自构建代理,例如 jenkins),解决方案可能很简单 升级 Microsoft Build Tools 2015.

您可以通过 choco install microsoft-build-tools or manually via the official Microsoft Build Tools 2015 或更新您的 Visual Studio 2017 安装来做到这一点。

确保您已针对 "All Configuration" 而不仅仅是 "Debug"

进行了更改

否则您会感到困惑,为什么它在生产中会失败。