145

Updated an existing Web Site project type Visual Studio 2015, I changed the Framework to 4.6.

I then expected to have all those new features available in my code behind files.

Unfortunately I'm getting errors like:

Error CS8026: Feature 'expression-bodied property' is not available in C# 5. Please use language version 6 or greater.

or e.g.:

Error CS8026: Feature 'interpolated strings' is not available in C# 5. Please use language version 6 or greater.

I did a quick Google check and found a guy posting some comments in a blog posting of ScottGu (search for "8026" on the page).

Since I do not understand his solution, plus I want to have the solution more visible, I've created this SO posting.

My question:

How can I have a Visual Studio 2015 project of type Web Site (i.e. not Web Application) to recognize C# 6 features?

Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
  • 1
    Have you tried adding thw config elements he mentioned in the comment? – scheien Jul 21 '15 at 20:15
  • I'm about to do that, but it looks really strange _to me_, so I was expecting some more clean solution. – Uwe Keim Jul 21 '15 at 20:16
  • 5
    Of course, the other option is to stop using those web site "projects", and use Web Application Projects instead. – John Saunders Jul 21 '15 at 20:17
  • 2
    @JohnSaunders I would _love_ to do that. Since the migration is a manual task, I fear the time it will take and all the errors I will introduce during the migration. Did it a few times for smaller projects. Always was a hassle... – Uwe Keim Jul 21 '15 at 20:33
  • 1
    Glad you've considered it. The comment was mostly for other readers who might think that a "web site" project sounds like what they want. – John Saunders Jul 21 '15 at 20:42

8 Answers8

145

I've tested this with ASP.NET MVC 5 (tested 5.2.3), and your mileage may vary with other web frameworks, but you just need to add the NuGet package for Roslyn CodeDOM.

Microsoft.CodeDom.Providers.DotNetCompilerPlatform should add the DLL files...

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

Replacement CodeDOM providers that use the new .NET Compiler Platform ("Roslyn") compiler as a service APIs. This provides support for new language features in systems using CodeDOM (e.g. ASP.NET runtime compilation) as well as improving the compilation performance of these systems.

...and also add the following to your 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>

If the XML is still missing, try adding yourself.

Michael
  • 8,362
  • 6
  • 61
  • 88
jbtule
  • 31,383
  • 12
  • 95
  • 128
  • 1
    This works as expected. C# 6 now available. Drawback is that my **App_GlobalResources/Resources.resx** do not generate the auto-class to strongly-typed access the resources anymore. – Uwe Keim Jul 21 '15 at 20:30
  • This also allows for use of C# 6 features in front-end files in WebForms. – snumpy Sep 14 '15 at 20:59
  • 1
    As a note, I was able to build without errors after project target was changed to 4.6. However, I needed to install this package to resolve red squigglies showing up from intellisense. – Doug Morrow Oct 08 '15 at 23:56
  • 8
    I'm using this in a WebForms WebSite (no project file). Sadly, simple .aspx changes trigger a painfully slower recompilation when re-requesting the page in a browser. Maybe Roslyn is theoretically faster for a WebApplication (with proj file), but for WebSites it seems to be significantly slower via csc in the App_Code folder... Anyone seeing the same thing? – Stefan Anghel Feb 05 '16 at 17:55
  • 5
    Note, for WebForms to compile with C#6 you need to install NuGet packages `Microsoft.CodeDom.Providers.DotNetCompilerPlatform` and its dependency `Microsoft.Net.Compilers` –  Feb 24 '16 at 09:42
  • 3
    Note that if you have more than one web site in your solution - things wont work, the easiest way to reproduce is create empty solution and start adding projects into it, after second web site - you will start receive "cannot find csc.exe" errors – mac Feb 28 '16 at 07:51
  • @StefanAnghel: Did you solve the issue you were having? I am in the same boat as you are, i.e. I have a website, and after seeing your message I am reluctant to enable this feature. – boggy Oct 18 '16 at 23:09
  • From a deployment perspective, do you need to deploy anything else other than the output from the publish process? Thx – boggy Oct 18 '16 at 23:12
  • 1
    @costa Ended up reverting to C# 5, I so SO hate not having string interpolation, but then again, maybe using a WebSite project in 2016 is not such a great ALM choice... I blamed it on management, I hope you have someone to blame it on too... – Stefan Anghel Oct 19 '16 at 12:48
  • @StefanAnghel: Thank you for getting back to me. The best thing would be to upgrade the app from website to Web application but I didn't have the time. It's a big application. Anyway, good luck! – boggy Oct 19 '16 at 16:56
  • 1
    In addition to adding the suggested package, I had to update Microsoft.Net.Compilers to v2.0.1 in order for C# 6 to start working on Web Forms pages (this is with VS 2017 RTM). – RickNZ Mar 16 '17 at 06:12
  • 1
    I had to add the compiler section also in the web.config located in the Views folder. – RokX May 05 '17 at 14:39
  • I have a .net 2.o project and worked for me. actually, I knew the solution but I forget it. tanks for solution 100 likes ;) – Navid Golforoushan Nov 29 '17 at 18:56
  • When deploying, the server gives me "This program is blocked by group policy. For more information, contact your system administrator" Even tried setting trust to full. – Jason Honingford May 21 '20 at 17:27
  • All the web.config examples referenc e1.0.0, but the web.config section should reference 2.0.1, right? That is what nuget added to my web .config.... e.g. ... Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, – Allen Jun 02 '20 at 12:04
95

See also this blog post from Sayed Ibrahim Hashimi on how to do this through the VS IDE.

In Visual Studio 2015 Update 1 we have included a new feature to simplify this. When you have a solution open which has at least one web project which is targetting .NET 4.5+ and does not have the DotNetCompilerPlatform NuGet package in the Project menu you’ll see a new option, Enable C# 6 / VB 14 appear.
enter image description here

Update.

VS 2017 and 2019 have this feature moved to Build -> ASP.NET Compilation. enter image description here

Vertigo
  • 1,847
  • 22
  • 19
18

I installed the DotNetCompilerPlatform as @jbtule suggested, but was still getting the same errors.

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

I closed the solution, deleted the bin and obj folders, then opened the solution and rebuilt. Now the C# 6 features work.

Jon Crowell
  • 21,695
  • 14
  • 89
  • 110
13

Possible solutions, taken from the comments on ScottGu's blog posting (search for "8026" on the page):

Solution suggestion 1 (David Taylor)

Add these RTM code dom elements to 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>

Then add the Roslyn and Microsoft.CodeDom.Providers.*.dll stuff into your BIN directory.

It is easy enough to setup, but just was strange to me that the default template wasn't set up for it if you selected .NET 4.6 when creating a new "Web Site" in VS 2015 RTM.

Solution suggestion 2 (Martin)

Further to David Taylor's comment above, it looks like the system.codedom settings are correct when a Web App is created with the TargetFramework as the default v4.5.2. Changing the TargetFramework to v4.6 appears to modify the compiler settings for CSharp, in a way that causes an issue.

My workarounds was as follows:

  1. File/New/ASP.NET Web Application
  2. Select "Web API" template from ASP.NET 4.5.2 Templates
  3. Take a copy of the system.codedom element (and its contents) in web.config
  4. Using Properties/TargetFramework, set the Target Framework to 4.6
  5. Replace the modified system.codedom element in web.config with the copy taken prior to changing TargetFramework
  6. Hit F5

Home Page should load as expected.

For info, the system.codedom contents immediately after changing TargetFramework to v4.6. was as follows (note use of the Type "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>
Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
  • 3
    In regards to your solution 2, `Microsoft.CSharp.CSharpCodeProvider` version 4.0 means it's not using Rosyln, Thus will not work for C# 6.0. – jbtule Jul 21 '15 at 20:28
  • 1
    When migrating from an older solution, make sure `` in the `csproj` file is equal to `6`. It can cause problems if it's something else. – Saul Mar 14 '16 at 16:16
7

This is not for a Web Site Project. This is how you do it for an ASP.NET MVC project.

You can toggle C# 6 in the Visual Studio UI. This is such an easy option, it is worth trying first.

  1. Right click your project and select Properties.
  2. Click the Build tab.
  3. The build tab has an Advanced... button at the very bottom.
  4. This opens up the Advanced Build Settings as shown below. Select C# 6.0.

enter image description here

Jess
  • 23,901
  • 21
  • 124
  • 145
  • @Manuzor you might be right. This was for a ASP.NET MVC project. – Jess Aug 11 '17 at 13:35
  • @Ucho what is wrong? Is it an MVC project? Do you have the Advanced option in the build settings? Are you missing options for C# language version? Did you set the version and not able to use language features? – Jess Oct 16 '18 at 15:17
  • @Jess: Ah, is probably working. I did not notice that my error come from IntelliSense not from build. – Yarl Oct 17 '18 at 11:15
  • This setting doesn't seem to apply to code in aspx pages, e.g. `<% Eval(whatever) %>`. – Chris Sep 27 '19 at 19:17
  • Didn't work for my MVC project. The dropdown is disabled, and hyperlink underneath says I can't change versions. – Michael Jan 26 '22 at 21:39
  • ...But for reasons I cannot understand, _it builds anyway._ Even though the IDE complains it has no idea how to compile null-coalescing operators. – Michael Jan 26 '22 at 21:57
7

Here's what it looks like in VS2017 with a website project:

enter image description here

b_levitt
  • 7,059
  • 2
  • 41
  • 56
  • I appreciate the crop job @Uwe but I don't think I agree with removing the rest of the top nav since context is lost for where this particular menu item should be. – b_levitt Aug 28 '18 at 15:46
  • 1
    Latest VS 2017 has moved this to 'Build -> ASP.NET Compilation'. See my updated answer. – Vertigo Oct 28 '19 at 06:58
  • For web site project types I tested @b_levitt's answer on VS2019. (1) Make sure you have a web.config. If not add one. (2) Save the solution by selecting it on the Solution Explorer and issuing [Ctrl] + [S]. (3) Select the project on the Solution Explorer and change the Target Framework to 4.7.2 (4) Select "Enable latest C#..." option from menu Build > ASP.NET Compilation. – Denny Jacob Jan 01 '20 at 21:47
  • "The path is not of a legal form" – IrishChieftain Dec 07 '20 at 14:11
3

I received this error after making ZERO changes to my WebAPI project. I uninstalled the DotNetCompilerPlatform nuget package and reinstalled, which fixed the problem.

ComeIn
  • 1,519
  • 17
  • 12
3

I stumbled across this searching for solution in VS2019 Visual Studio 2019.

Here it is when you have the website project selected in your solution file. "Build → ASP.NET Compilation → Enable latest C# and VB language features".

enter image description here

Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
moto_geek
  • 510
  • 5
  • 14