在ASP.NET应用程序中启用C# 7

60

我刚刚开始在 Visual Studio 2017 上处理我的旧解决方案。只需在旧的 IDE 中打开解决方案即可无缝工作。 现在,C# 应用程序项目默认使用 C# 7.0 编译器。这些项目的属性页面(编译/高级)让您轻松选择所需的编译器目标语言版本,默認为最新版本。

然而,我找不到在 ASP.NET 网页项目 中启用 C# 7.0 的方法。 如果我写了一个类似以下语句的声明:

if (int.TryParse("1", out int myInt)) { ... }

这个IDE警告我需要使用7+版本的语言。

我的研究表明,我应该在web.config文件的system.codedom编译器区域中针对特定的c#版本,以便针对最新的Roslyn版本。

现在我拥有的是:

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>

本文涉及针对 C# 6 的编译设置。如果我已经使用 NuGet 下载了最新版本的 Roslyn,那么针对 C# 7 的正确设置是什么?

更新: 以下是 Web 项目可用的 编译 选项的屏幕截图(使用的是意大利语的 VS2017,但应该很容易理解)。在此处无法选择所需的 C# 版本。

Compile options


你尝试过更改compilerOptions吗? MSDN文档说明它只影响那个。https://msdn.microsoft.com/zh-cn/library/f4ckecs0.aspx - Stavm
我尝试将其设置为 _/langversion:7_。无法编译。 - davidthegrey
1
它返回:CS1617:/langversion的选项'7'无效;必须是ISO-1、ISO-2、默认或1到6范围内的整数。 - davidthegrey
在C#6中,微软在Visual Studio中添加了一个名为“项目”>“启用C#6”的子菜单,请检查他们是否在VS2017中也这样做了。https://blogs.msdn.microsoft.com/webdev/2015/12/07/new-feature-to-enable-c-6-vb-14/ - Stavm
1
Julien,我希望微软提供更简单的工具,但现在他们通过nuget提供了两个包:_Microsoft.Net.Compilers_,它刚刚更新到v2.0.1,以及 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 编译器作为服务(Roslyn),它是v1.0.3(去年12月发布)。我应该假设c# 7还没有准备好用于asp.net吗? - davidthegrey
显示剩余3条评论
6个回答

83

在网站的NuGet窗口中:

  1. 卸载 Microsoft.CodeDom.Providers.DotNetCompilerPlatform
  2. 重新安装它
  3. web.config中,在system.codedom > compilers > compiler下,将compilerOptions="/langversion:6改为7

9
这是完全可行的答案!但为了完整起见,对于那些来到这里的人,原帖中提到需要假设已经安装了最新的Roslyn和NuGet。这意味着需要安装Microsoft.Net.Compilers2.0及以上版本。此外,如果您想使用C# 7元组,则需要从NuGet安装System.ValueTuple - jbtule
1
这些建议都对我没用 - 不是这个,也不是之前的答案。 - niico
有一个新版本的Microsoft.CodeDom.Providers.DotNetCompilerPlatform(1.0.4),它可以在Web项目中启用C# 7。该项目必须针对4.6+进行目标设置,因为Roslyn编译器2.0需要.NET Framework 4.6。 - mattfei
这帮助我编译,但是我得到了错误 Could not find a part of the path … bin\roslyn\csc.exe。并且这是解决方案 - Alexey Markov
4
还有一种可能是使用/langversion:latest,它类似于/langversion:default。详情请见文档 - Uwe Keim
请确保在进行此更改后重新启动Visual Studio。 - David Peden

27

我能够使用默认语言设置编译它,但不能使用C# 7选项编译它。 enter image description here

但是下面的设置会导致编译时出现错误:

enter image description here

所以你可以将你的语言版本设置保持为默认值。

如果你正在尝试使用Roslyn并且没有使用Visual 2017默认的编译器构建,则可能需要进行一些更改

选择你的项目名称,右键单击>> Properties窗口 >> Build然后在“Conditional Compilation symbols”文本框中添加以下两个选项__DEMO__,__DEMO_EXPERIMENTAL__

enter image description here

更新

要使用C# 7.0,您需要使用Microsoft.Net.Compilers的2.0+版本。

enter image description here

安装最新版本的Microsoft.Net.Compilers(2.0+)后,您可以选择语言版本为C# 7。

因此,最好的解决方案是安装最新版本的Microsoft.Net.Compilers(2.0+)。


5
"高级生成设置"对话框仅适用于桌面和控制台应用程序,而不适用于Web项目。在Web项目中,您必须手动编辑web.config文件。 我已经下载了编译器的第二个版本,但是设置_/langversion:7_ 仍然导致编译器错误。 - davidthegrey
我想你应该知道,我们需要从Nuget为每个项目单独安装编译器。请问您能否提供更多细节信息,例如您之前使用哪个版本的Visual Studio创建了什么类型的项目,以及现在您正在使用哪个版本的Visual Studio 2017。我想了解这些信息以便在我的端上复制这个问题。 - Banketeshvar Narayan
我正在使用Visual Studio 2017专业版RTM。我已经在原始帖子中添加了Web项目可用编译选项的截图。是的,我知道解决方案中的每个项目都使用独立的编译器设置。 - davidthegrey
我使用的是与您相同的Visual Studio版本,只是专业版而不是企业版,语言为意大利语而不是英语,但我确信选项是相同的。我们只是在谈论不同类型的项目。我可以在我的解决方案中的其他应用程序类型中看到您提到的选项,但在Web项目中却没有。无论如何,我只需要像下面的Hassan Abdullah建议的那样卸载并重新安装CodeDom提供程序,这一点都不明显。现在c#7可以工作了! - davidthegrey
这在MVC应用程序中运行良好 - 但在网站应用程序中不行。 - niico
显示剩余3条评论

8
如果您尝试安装Microsoft.CodeDom.Providers.DotNetCompilerPlatform 2.0.0版本,并且您的项目针对的是早于4.6版本的.net,则它将自动使用较旧的roslyn版本,该版本仅支持langversion 6。这是因为较新版本的roslyn(包括支持csharp-7的第一个版本)需要至少.net-4.6才能运行。如果您的项目针对较旧版本的.net,则会收到您看到的错误消息:
CS1617 Invalid option 'latest' for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to 6.
请按照以下步骤操作: 1.确保您的项目至少定位到.net-4.6。必要时重新定位。 2.如果您的项目仍在使用packages.config,则必须卸载并重新安装Microsoft.CodeDom.Providers.DotNetCompilerPlatform,以将您的项目文件更新为指向nuget包的.net-4.6变体。如果您正在使用,则已经准备就绪(但您必须手动配置web.config的system.codedom部分)。

3
жіЁж„ҸпјҡMicrosoft.CodeDom.Providers.DotNetCompilerPlatformиҝҮеҺ»жӣҫдҫқиө–дәҺMicrosoft.Net.CompilersпјҢеӣ жӯӨеҰӮжһңжӮЁжӯЈеңЁеҚҮзә§ж—§йЎ№зӣ®пјҢиҜ·зЎ®дҝқеҗҢж—¶жӣҙж–°иҝҷдёӨдёӘиҪҜ件еҢ…пјҢжҲ–иҖ…еҰӮжһңжӮЁдёҚеҶҚйңҖиҰҒMicrosoft.Net.CompilersпјҢеҲҷе°Ҷе…¶еҲ йҷӨгҖӮ - KyleMit

6

如果需要支持C# 7.x,请将项目的Build Configuration Language Version设置为C# latest minor version (latest)

Build Configuration Language Version

如果您正在使用.NET Compiler Platform(“Roslyn”)的CodeDOM Providers(例如Microsoft.CodeDom.Providers.DotNetCompilerPlatform nuget包),请在asp.net的web.config文件中设置compilerOptions="/langversion:latest"。

<system.codedom>
   <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:latest /nowarn:1659;1699;1701"/>
   </compilers>
</system.codedom>

更多信息请参考:

1

你需要替换项目文件夹中的文件

/Bin/roslyn 

从NuGet包文件夹中获取文件

/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0/tools/Roslyn472

在安装新版本的Nuget时,项目文件夹中的csv.exe未被替换。替换文件后,它的工作非常出色。

不要忘记在项目属性中将.Net版本更改为最新版本。


+1 那正是我正在寻找的信息,感谢您抽出时间发布!那么...你是怎么想到的呢?我还没有找到任何关于如何设置新的asp.net网站/4.8框架以使用最新的c#版本的明确指导... - Margo Noreen

0

我正在引用一个自定义的项目A,该项目引用了另一个自定义的项目B。 我刚刚重新添加了从A到B的引用,现在似乎可以工作了(暂时)。


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