在VSTS中进行构建时,如何设置csc langversion?

Phi*_*hil 8 c# tfs csc azure-devops azure-pipelines

我有一个简单的测试控制台应用程序。它唯一的代码是

public class Class1
{
    private protected int _value = 0b_1001_0110;
}
Run Code Online (Sandbox Code Playgroud)

这只是测试这些C#7.2功能是否可以构建。

在Visual Studio 2017 15.5.2中,如果我这样设置语言版本,它们可以正常构建

高级构建设置

如果我现在将项目检入VSTS并运行构建,它将失败,并显示各种错误,例如

Test \ CSharp72Test \ CSharp72Test \ Class1.cs(7,17):错误CS0107:多个保护修饰符
Test \ CSharp72Test \ CSharp72Test \ Class1.cs(7,40):错误CS1013:无效的数字

因为它对C#7一无所知。

如果我现在添加“ Microsoft.NET.Compilers 2.6.1” NuGet软件包并对其进行重建,则该软件包在本地可以正常运行,但在VSTS中使用

Test \ CSharp72Test \ CSharp72Test \ Class1.cs(7,40):错误CS8107:功能“前导数字分隔符”在C#7.0中不可用。请使用7.2版或更高版本的语言。

现在使用的是正确版本的CSC.exe,但未传递/ langversion:latest。

在多项目解决方案中,如何在每个项目中正确传递此信息

Pat*_*SFT 7

Visual Studio生成任务还调用MSBuild.exe命令来运行生成。

您可以直接通过MSBuild Argument传递并通过本地命令行成功构建,如下所示?

msbuild "C:\Users\Admin\Source\repos\ClassLibrary2\ClassLibrary2\ClassLibrary2.csproj" /property:langversion=latest 
Run Code Online (Sandbox Code Playgroud)

因此,您只需要/property:langversion=latest在VSTS中添加Visual Studio Build任务的MsBuild Argument,或直接<LangVersion>xx</LangVersion>在项目文件中将其值更改为Latest 。

但是,根据VSTS托管VS2017映像,主机代理仅安装了Visual Studio 2017 Enterprise * 版本:15.4.0

C#7.2随Visual Studio 2017的15.5版本一起提供。

也有一个相关的用户声音:带有VS 15.5的托管代理,以启用C#7.2支持

解决方法是,您可以设置所有者生​​成代理并安装Visual Studio 2017 15.5.2。

  • 1)在高级构建设置中设置语言版本将更新项目文件。2)问题是,在与VS一起构建时使用langversion *,而在MSBuild中不使用langversion。因此更新托管版本将无法解决问题,因为CSC.exe默认使用langversion:default,它等于C#7.0。我认为这是一个错误。我将针对具有相同问题的https://www.nuget.org/packages/Microsoft.Net.Compilers创建一个问题。 (2认同)