如何在网站项目类型中使用C#6?


126

更新了现有网站项目类型Visual Studio 2015,将Framework更改为4.6。

然后,我希望文件中的代码中具有所有这些新功能。

不幸的是,我收到如下错误:

错误CS8026:C#5中没有功能“表达式绑定的属性”。请使用语言版本6或更高版本。

或例如:

错误CS8026:C#5中没有功能“插值字符串”。请使用语言版本6或更高版本。

我做了一次Google快速检查,发现一个人在ScottGu的博客文章中发表了一些评论(在页面上搜索“ 8026”)。

由于我不了解他的解决方案,并且我想使解决方案更加可见,因此我创建了此SO发布。

我的问题:

如何拥有类型为Web站点(即不是Web应用程序)的Visual Studio 2015项目来识别C#6功能?


1
您是否尝试添加他在评论中提到的配置元素?
scheien 2015年

我将要这样做,但是对我来说真的很奇怪,因此我期待有一些更干净的解决方案。
Uwe Keim

5
当然,另一个选择是停止使用这些网站的“项目”,而改为使用Web应用程序项目。
约翰·桑德斯

1
@JohnSaunders我会喜欢这样做。由于迁移是一项手动任务,因此我担心迁移会花费时间,并且会引入所有错误。对于较小的项目做了几次。一直很麻烦...
Uwe Keim

1
很高兴您考虑了。该评论主要是针对其他读者的,他们可能认为“网站”项目听起来像他们想要的。
约翰·桑德斯

Answers:


118

我已经使用ASP.NET MVC 5(已测试5.2.3)对此进行了测试,您的工作量可能会因其他Web框架而异,但是您只需要添加Roslyn CodeDOM |。NuGet

.NET编译器的CodeDOM提供程序...

使用新的.NET编译器平台(“ Roslyn”)编译器作为服务API的替换CodeDOM提供程序。这为使用CodeDOM的系统中的新语言功能(例如ASP.NET运行时编译)提供了支持,并提高了这些系统的编译性能。

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/

NuGet软件包应添加DLL文件,并将以下内容添加到您的web.config中。

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>

如果仍然缺少。尝试添加自己。


1
这按预期工作。C#6现在可用。缺点是我的App_GlobalResources / Resources.resx不再生成用于强类型访问资源的自动类。
Uwe Keim

1
需要注意的是,在项目目标更改为4.6之后,我能够进行无错误构建。但是,我需要安装此软件包来解决从intellisense出现的红色弯曲。
道格·莫罗

7
我在WebForms WebSite(无项目文件)中使用它。可悲的是,简单的.aspx更改在浏览器中重新请求页面时会导致痛苦的缓慢重新编译。从理论上讲,也许Roslyn对于WebApplication(带有proj文件)要快,但是对于WebSites,通过App_Code文件夹中的csc似乎要慢得多……有人见过同样的东西吗?
Stefan Anghel'2

4
请注意,要使WebForms使用C#6进行编译,您需要安装NuGet软件包Microsoft.CodeDom.Providers.DotNetCompilerPlatform及其依赖项Microsoft.Net.Compilers

3
请注意,如果您的解决方案中有多个网站-事情将无法进行,那么最简单的复制方法是创建一个空解决方案并开始向其中添加项目,第二个网站之后-您将开始收到“找不到csc.exe”错误
mac

67

另请参见Sayed Ibrahim Hashimi的这篇博客文章,了解如何通过VS IDE做到这一点。

在Visual Studio 2015 Update 1中,我们包含了一项新功能来简化此操作。当您打开的解决方案至少有一个针对.NET 4.5+的Web项目并且在“项目”菜单中没有DotNetCompilerPlatform NuGet程序包时,您将看到一个新选项,出现“启用C#6 / VB 14”。
在此处输入图片说明

更新。

VS 2017和2019将此功能移至Build-> ASP.NET Compilation在此处输入图片说明


2
您知道此项在Visual Studio 2019中的位置吗?
保护者

4
@ protector-one Build-> ASP.NET Compilation
Vertigo

1
我在VS2019中打开了一个较旧的基于文件夹的网站项目,并且在该选项显示之前,必须对文件>保存该项目。
Corgalore

15

我按照@jbtule的建议安装了DotNetCompilerPlatform,但是仍然出现相同的错误。

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

我关闭了解决方案,删除了bin和obj文件夹,然后打开了解决方案并进行了重建。现在,C#6功能可以使用了。


3
刚刚关闭并重新打开VS对我有用(在之后Install-Package ...)。同时定位4.6。
rwalter

1
这对我有用,还注意到使用resharper可能会显示u错误,花了我一段时间才弄清楚为什么我在整个视图中都出现“无法解析符号” ...
Niklas

1
就我而言,重新打开解决方案后,我只需要等待大约30秒钟,它就可以工作而不必删除bin和了obj
Marc.2377

12

可能的解决方案,摘自ScottGu博客上的评论(在页面上搜索“ 8026”):

解决方案建议1(David Taylor)

将这些RTM代码dom元素添加到web.config中:

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
</system.codedom>

然后将Roslyn和Microsoft.CodeDom.Providers。*。dll文件添加到您的BIN目录中。

设置很容易,但令我感到奇怪的是,如果在VS 2015 RTM中创建新的“网站”时选择了.NET 4.6,则没有为其设置默认模板。

解决方案建议2(马丁)

除了上面的David Taylor的评论之外,当使用TargetFramework作为默认v4.5.2创建Web应用程序时,system.codedom设置正确。将TargetFramework更改为v4.6似乎会以某种方式修改CSharp的编译器设置。

我的解决方法如下:

  1. 文件/新建/ASP.NET Web应用程序
  2. 从ASP.NET 4.5.2模板中选择“ Web API”模板
  3. 在web.config中获取system.codedom元素(及其内容)的副本
  4. 使用Properties / TargetFramework,将目标框架设置为4.6
  5. 将web.config中修改后的system.codedom元素替换为更改TargetFramework之前的副本
  6. 击中 F5

主页应按预期加载。

有关信息,请在将TargetFramework更改为v4.6之后立即查看system.codedom的内容。如下所示(注意使用“ Microsoft.CSharp.CSharpCodeProvider”类型):

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701">
            <providerOption name="CompilerVersion" value="v4.0"/>
        </compiler>
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
</system.codedom>

3
关于解决方案2,Microsoft.CSharp.CSharpCodeProvider版本4.0表示它未使用Rosyln,因此不适用于C#6.0。
jbtule

1
从旧的解决方案迁移,确保<LangVersion>csproj文件等于6。如果还有其他问题,可能会导致问题。
萨尔

7

这不适用于网站项目。这是为ASP.NET MVC项目执行的操作。

您可以在Visual Studio UI中切换C#6。这是一个简单的选择,值得首先尝试。

  1. 右键单击您的项目,然后选择“ 属性”
  2. 单击生成选项卡。
  3. 生成选项卡的底部有一个Advanced ...按钮。
  4. 这将打开“ 高级构建设置”,如下所示。选择C#6.0。

在此处输入图片说明


@Manuzor,您可能是对的。这是针对ASP.NET MVC项目的。
杰西(Jess)

@Ucho有什么问题?它是MVC项目吗?在构建设置中是否有“高级”选项?您是否缺少C#语言版本的选项?您是否设置了版本并且无法使用语言功能?
杰西

@Jess:嗯,可能正在工作。我没有注意到我的错误来自IntelliSense而不是构建。
Ucho

此设置似乎不适用于aspx页面中的代码,例如<% Eval(whatever) %>
克里斯,

5

这是带有网站项目的VS2017中的外观:

在此处输入图片说明


我非常感谢@Uwe的裁剪工作,但我认为我不同意删除顶部导航栏的其余部分,因为该特定菜单项的位置丢失了上下文。
b_levitt

1
最新的VS 2017已将其移至“构建-> ASP.NET编译”。看到我更新的答案。
眩晕

对于网站项目类型,我在VS2019上测试了@b_levitt的答案。(1)确保您有一个web.config。如果不加一个。(2)通过在解决方案资源管理器中选择解决方案并发出[Ctrl] + [S]来保存解决方案。(3)在解决方案资源管理器上选择项目,并将目标框架更改为4.7.2。(4)从菜单“生成”>“ ASP.NET编译”中选择“启用最新的C#...”选项。
丹尼·雅各布

2

对我的WebAPI项目进行零更改后,我收到此错误。我卸载了DotNetCompilerPlatform nuget软件包并重新安装,从而解决了该问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.