웹 사이트 프로젝트 유형에서 C # 6을 사용하는 방법은 무엇입니까?


126

기존 웹 사이트 프로젝트 유형 Visual Studio 2015를 업데이트 하고 프레임 워크를 4.6으로 변경했습니다.

그런 다음 파일 뒤의 코드에서 모든 새로운 기능을 사용할 수있을 것으로 예상했습니다.

불행히도 다음과 같은 오류가 발생합니다.

오류 CS8026 : C # 5에서는 '표현 본문 속성'기능을 사용할 수 없습니다. 언어 버전 6 이상을 사용하십시오.

또는 예 :

오류 CS8026 : C # 5에서는 '보간 된 문자열'기능을 사용할 수 없습니다. 언어 버전 6 이상을 사용하십시오.

나는 빠른 구글 체크를했고 ScottGu의 블로그 포스팅 (페이지에서 "8026"을 검색)에 댓글올리는 사람을 발견 했습니다 .

나는 그의 솔루션을 이해하지 못하고 솔루션을 더 눈에 띄게 만들고 싶기 때문에이 게시물을 작성했습니다.

내 질문:

C # 6 기능을 인식하기 위해 웹 사이트 유형 (예 : 웹 응용 프로그램 아님) 의 Visual Studio 2015 프로젝트를 사용 하려면 어떻게해야합니까?


1
주석에서 언급 한 구성 요소를 추가해 보셨습니까?
scheien

나는 그 작업을 수행하는 대한 해요,하지만 정말 이상한 보이는 나에게 좀 더 깨끗한 솔루션을 기대하고 그래서.
Uwe Keim

5
물론 다른 옵션은 이러한 웹 사이트 "프로젝트"사용을 중지하고 대신 웹 응용 프로그램 프로젝트를 사용하는 것입니다.
John Saunders

1
내가 것 @JohnSaunders 사랑은 그렇게 할 수 있습니다. 마이그레이션은 수동 작업이므로 시간이 걸리고 마이그레이션 중에 발생할 모든 오류가 두렵습니다. 소규모 프로젝트를 위해 몇 번했습니다. 항상 번거 로움했다 ...
우베 KEIM

1
고려 해주셔서 감사합니다. 댓글은 대부분 "웹 사이트"프로젝트가 원하는대로 들린다 고 생각하는 다른 독자를위한 것입니다.
John Saunders

답변:


118

ASP.NET MVC 5 (5.2.3 테스트)로 이것을 테스트했으며 마일리지는 다른 웹 프레임 워크에 따라 다를 수 있지만 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으로 변경 한 후 오류없이 빌드 할 수있었습니다. 그러나 인텔리 센스에서 나타나는 빨간색 물결 모양을 해결하려면이 패키지를 설치해야했습니다.
Doug Morrow 2015 년

7
WebForms WebSite (프로젝트 파일 없음)에서 이것을 사용하고 있습니다. 슬프게도 간단한 .aspx 변경으로 인해 브라우저에서 페이지를 다시 요청할 때 재 컴파일 속도가 느려집니다. 아마도 Roslyn은 이론적으로 WebApplication (proj 파일 포함)의 경우 더 빠르지 만 WebSites의 경우 App_Code 폴더의 csc를 통해 상당히 느려진 것 같습니다. 같은 것을 보는 사람이 있습니까?
Stefan Anghel

4
WebForms를 C # 6으로 컴파일하려면 NuGet 패키지 Microsoft.CodeDom.Providers.DotNetCompilerPlatform및 해당 종속성 을 설치해야합니다.Microsoft.Net.Compilers

3
솔루션에 웹 사이트가 두 개 이상있는 경우 작동하지 않을 경우 가장 쉽게 재현 할 수있는 방법은 빈 솔루션을 만들고 여기에 프로젝트를 추가하는 것입니다. 두 번째 웹 사이트 이후에 "cannot find csc.exe"메시지가 표시됩니다. 오류

67

VS IDE를 통해이를 수행하는 방법에 대해서는 Sayed Ibrahim Hashimi 의이 블로그 게시물 을 참조하십시오 .

Visual Studio 2015 업데이트 1에는이를 단순화하는 새로운 기능이 포함되었습니다. .NET 4.5 이상을 대상으로하는 웹 프로젝트가 하나 이상 있고 프로젝트 메뉴에 DotNetCompilerPlatform NuGet 패키지가없는 솔루션이 열려 있으면 새 옵션 인 Enable C # 6 / VB 14가 나타납니다.
여기에 이미지 설명 입력

최신 정보.

VS 2017 및 2019에서는이 기능이 Build- > ASP.NET Compilation으로 이동했습니다 . 여기에 이미지 설명 입력


2
Visual Studio 2019에서이 항목이 어디에 있는지 알고 있습니까?
수호자 1

4
@ 보호 - 하나의 빌드 -> ASP.NET 컴파일
버티고

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
이 또한, U에게 거짓 오류를 표시 할 수 있습니다 ReSharper에서를 사용하여 알 나를 위해 일한 것은 ... 내가보기에 걸쳐 모두 "해결 기호에 없습니다"얻을 이유를 알아낼 걸 렸어요
니클라스

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 (Martin)

위의 David Taylor의 설명에 더해, TargetFramework를 기본 v4.5.2로 사용하여 웹 앱을 만들 때 system.codedom 설정이 올바른 것처럼 보입니다. TargetFramework를 v4.6으로 변경하면 CSharp의 컴파일러 설정이 문제를 일으키는 방식으로 수정되는 것처럼 보입니다.

내 해결 방법은 다음과 같습니다.

  1. 파일 / 새로 만들기 /ASP.NET 웹 응용 프로그램
  2. ASP.NET 4.5.2 템플릿에서 "웹 API"템플릿을 선택합니다.
  3. web.config에서 system.codedom 요소 (및 해당 콘텐츠)의 복사본을 가져옵니다.
  4. Properties / TargetFramework를 사용하여 Target Framework를 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. 빌드 탭에는 고급 ... 의 맨 아래 버튼이 있습니다.
  4. 그러면 아래와 같이 고급 빌드 설정 이 열립니다 . C # 6.0을 선택합니다.

여기에 이미지 설명 입력


@Manuzor 당신이 맞을 수 있습니다. 이것은 ASP.NET MVC 프로젝트를위한 것입니다.
Jess

@Ucho 무엇이 잘못 되었습니까? MVC 프로젝트입니까? 빌드 설정에 고급 옵션이 있습니까? C # 언어 버전에 대한 옵션이 누락 되었습니까? 버전을 설정했는데 언어 기능을 사용할 수 없습니까?
Jess

@Jess : 아, 아마도 작동하고 있습니다. 내 오류가 빌드가 아닌 IntelliSense에서 발생한다는 것을 알지 못했습니다.
Ucho

이 설정은 aspx 페이지의 코드에 적용되지 않는 것 같습니다 <% Eval(whatever) %>.
Chris

5

다음은 웹 사이트 프로젝트를 사용하는 VS2017에서의 모습입니다.

여기에 이미지 설명 입력


@Uwe 자르기 작업에 감사하지만이 특정 메뉴 항목이 있어야 할 위치에 대한 컨텍스트가 손실되었으므로 나머지 상단 탐색을 제거하는 데 동의하지 않습니다.
b_levitt

1
최신 VS 2017은 이것을 'Build-> ASP.NET Compilation'으로 옮겼습니다. 내 업데이트 된 답변을 참조하십시오.
Vertigo

웹 사이트 프로젝트 유형의 경우 VS2019에서 @b_levitt의 답변을 테스트했습니다. (1) web.config가 있는지 확인하십시오. 하나를 추가하지 않으면. (2) 솔루션 탐색기에서 솔루션을 선택하고 [Ctrl] + [S]를 실행하여 솔루션을 저장합니다. (3) Solution Explorer에서 프로젝트를 선택하고 Target Framework를 4.7.2로 변경합니다. (4) 메뉴 Build> ASP.NET Compilation에서 "Enable latest C # ..."옵션을 선택합니다.
Denny Jacob

2

WebAPI 프로젝트를 ZERO 변경 한 후이 오류가 발생했습니다. DotNetCompilerPlatform nuget 패키지를 제거하고 다시 설치하여 문제가 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.