C# 7.1 无法发布

46

我有一个ASP.NET Core C#网络应用程序。我进行了一些更改,现在使用了C# 7.1的功能。我更改了项目版本,以便它可以编译和运行良好。然而,当我尝试发布项目时,出现错误:

特性“默认文本”在C# 7.0中不可用。请使用7.1或更高版本的语言。

我看到的编译命令是:

C:...\.nuget\packages\microsoft.net.compilers\2.6.1\tools\csc.exe /noconfig /unsafe- /checked- /nowarn:1701,1702,1705,1701,1702,2008 /nostdlib+ /errorreport:prompt /warn:4 /define:TRACE;RELEASE;NETCOREAPP2_0 /errorendlocation /preferreduilang:en-US /warnaserror+:NU1605`

如其他地方建议的那样,我安装了 Microsoft.Net.Compilers (v2.6.1),但没有任何变化。

是否有 Visual Studio 设置会特别影响发布?

更新: 看起来控制台应用程序没有这个问题。 如果它成功构建,则也可以成功发布。 但是,Web 应用程序无法发布。有人成功地发布了具有 C# 7.1 功能的 ASP.NET Core Web 应用程序吗?


9
项目 -> 项目属性(底部)-> 构建 -> 高级 -> 语言版本。更改为“次要版本(最新)”或“C# 7.1”。 - JohnyL
谢谢。正如我所说,我更改了项目版本,因此它可以编译和运行。但即使有了这个更改,它仍然无法发布(为了更好的清晰度,我应该说语言版本)。 - Felix
@Felix,我刚刚创建了一个使用C#7.1默认字面量的ASP.NET Core示例应用程序,并使用Visual Studio Enterprise 2017和dotnet CLI将其发布到文件夹中,没有出现任何错误。你能否分享一下你遇到问题的示例应用程序? - ironstone13
1
@Felix,我已经克隆了你的代码库,并且可以构建、发布和运行Web应用程序,没有任何问题。在我看来,这似乎是一个环境配置问题。你的发布使用的路径与我的csc.exe不同。我已经上传了我的Visual Studio配置详细信息以及发布日志到Gist - 也许这可以帮助你 https://gist.github.com/oleh-zheleznyak/458230bb535366c378fc3b7380fbc2bf - ironstone13
谢谢。我看到路径上的差异了;奇怪的是,CLI应用程序的路径与Web应用程序的路径相同,并且可以正常发布。无论如何,通过dotnet cli发布是可接受的解决方法,并且符合脚本化部署的要求! - Felix
显示剩余3条评论
5个回答

53

这正是我一直在寻找的神奇开关! - Felix
7
如果有人在 Mac 版本的 Visual Studio 上运行此操作,我无法找到.pubxml文件或@ironstone13下面回答中提到的配置选项。我所需要做的就是在我的.csproj文件中,在<PropertyGroup>标签下添加<LangVersion>latest</LangVersion>,这样就可以消除这个错误了!Visual Studio for Mac V 8.0.2 - Jeff L
已更新至8.2版本,问题已解决。不需要添加LangVersion。 - Chucky
我不明白。我刚刚在VS2017中更新到15.9.20。对我来说仍然存在问题。然而,上述修复方法确实有效。 - AlbatrossCafe

50

更新:
将VS2017从15.4.5版本升级到15.5.2版本后,我能够复现这个问题,并出现了一个错误。

C# 7.0不支持特性“默认字面量”。请使用语言版本7.1或更高版本。

@Jeremy Cook的回答解决了这个问题:
在.pubxml文件中添加<LangVersion>latest</LangVersion>


无论是旧的还是新的项目格式,都可以通过项目文件中的LangVersion元素来设置。你可以通过在Visual Studio中的UI界面或者csproj XML文件中更改该元素来实现。

请注意,此设置取决于生成配置。为了确保您可以使用C# 7.1及更高版本进行编码和发布,请务必在不同的构建配置(DebugRelease等)中配置此设置。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <LangVersion>latest</LangVersion>
  </PropertyGroup>

</Project>

输入图片描述


7
@Felix,你是否将C#7.1设置为“Debug”和“Release”配置?你可能在“Debug”模式下编码但是在“Release”模式下发布。 - ironstone13
刚刚双重检查了一下,发布版和调试版都已设置为C# 7.2(或尝试了最新的次要版本)。 - Felix
2
很高兴你解决了你的问题,你当然可以自由选择接受任何你愿意接受的答案作为“回答你问题的那个答案”,但请记住未来的访问者,他们将得出与你相同的结论:他们按照这个答案所说的做了一切,但仍无法发布。因此,这个答案实际上并没有回答你的问题。 - Lasse V. Karlsen
2
@LasseVågsætherKarlsen,你完全正确 - 在Jeremy Cook的提示下,我终于能够重新生成问题,所以我更新了我的答案,并点赞了他的答案。现在SO用户将找到他们所寻求的解决方案! - ironstone13
1
@ironstone13,我已经简化并改进了您的配置,使其适用于最新的小版本(例如7.2、7.3等),您介意吗? - Vadim Ovchinnikov
显示剩余5条评论

2
对于MAC用户,我花了很长时间才找到解决方法。以下是对我有效的方法。 右键单击主要的.csproj文件,然后点击“编辑项目文件”打开它。 然后,在...内添加最新一行并保存。 就这样! 现在运行您的代码,应该可以正常工作了。 add 'latest langversion' to visual studio

0

如果您正在从ASP.NET Core 2.0迁移到ASP.NET Core 2.1,请确保您有以下代码行:

<TargetFramework>netcoreapp2.1</TargetFramework>

在你的.pubxml文件中。


-3

看起来你已经发布到了本地的Nuget存储库。请确保Nuget存储库已配置为使用C#7.1,并检查你的Nuget.exe打包工具是否已更新到最新版本,以支持C#7.1。


你为什么得出这个结论?这绝对不是我的意图;而且当我在代码中没有使用7.1功能时,目标位置显示为bin\Release\PublishOutput,这正是输出的位置。 - Felix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接