성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
[공진영] 안녕하세요 좋은글 감사합니다. 현재 제가 wpf로 관제 모...
[정성태] The Windows Registry Adventure #1: ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>.NET Framework 프로젝트에서 C# 8.0/9.0 컴파일러를 사용하는 방법</h1> <p> 현재 Visual Studio 2019에서는 모든 닷넷 프로젝트에 걸쳐서 기본적으로 C# 컴파일러의 버전을 바꾸지 못하도록 했습니다. 그래서 프로젝트 설정의 고급 빌드(Build / Advanced Build Settings)에 가보면 다음과 같은 식으로 링크가 제공되는데,<br /> <br /> <img alt='cs8_in_netfr_1.png' src='/SysWebRes/bbs/cs8_in_netfr_1.png' /><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Automatically selected based on framework version Why can't I select a different C# version? </pre> <br /> 누르면 아래의 문서로 넘어갑니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# language versioning ; <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version'>https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version</a> </pre> <br /> 정리해 보면, 생성한 닷넷 프로젝트의 환경에 따라 다음과 같이 C# 컴파일러 버전이 자동 적용된다고 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET 5 - C# 9.0 .NET Core 3.x - C# 8.0 .NET Core 2.x - C# 7.3 .NET Standard 2.1 - C# 8.0 <span style='color: blue; font-weight: bold'>.NET Standard 2.0 - C# 7.3</span> .NET Standard 1.x - C# 7.3 <span style='color: blue; font-weight: bold'>.NET Framework (all) - C# 7.3</span> </pre> <br /> .NET Framework의 마지막 버전이 4.8이고 그것이 .NET Standard 2.0을 구현하고 있기 때문에 결국 .NET Framework 환경에서는 8.0/9.0 버전의 컴파일러 적용이 안 되고 있는 것입니다.<br /> <br /> 실제로 .NET 4.8 대상으로 다음의 C# 8.0 (또는 9.0) 코드를 사용해 컴파일하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > class Program { static void Main(string[] args) { <span style='https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#using-declarations'>using</span> var file = new System.IO.StreamReader("test.txt"); } } </pre> <br /> 컴파일 오류(CS8370)가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > CS8370 Feature 'using declarations' is not available in C# 7.3. Please use language version 8.0 or greater. </pre> <br /> <hr style='width: 50%' /><br /> <a name='langver'></a> <br /> 물론 방법은 있습니다. 문서(<a target='tab' href='https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version'>C# language versioning</a>)에도 나오지만, 프로젝트 파일(csproj)을 직접 편집기로 열어 LangVersion 노드를 다음과 같이 명시적으로 추가해 주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="15.0" ...[생략]... /> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ProjectGuid>{4F3F253F-549E-42AD-B367-881973F0EEA4}</ProjectGuid> <OutputType>Exe</OutputType> <RootNamespace>ConsoleApp1</RootNamespace> <AssemblyName>ConsoleApp1</AssemblyName> <TargetFrameworkVersion>v4.8</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <Deterministic>true</Deterministic> <span style='color: blue; font-weight: bold'><LangVersion>9.0</LangVersion></span> </PropertyGroup> // ...[생략]... </Project> </pre> <br /> 이후, 다시 이 글의 예제 코드를 컴파일하면 정상적으로 빌드가 되는 것을 확인할 수 있습니다. 물론, 그래도 모든 C# 8.0/9.0의 구문을 사용할 수 있는 것은 아닙니다. 가령 비동기 스트림 구문의 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Asynchronous streams ; <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#asynchronous-streams'>https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#asynchronous-streams</a> </pre> <br /> <a target='tab' href='https://anthonychu.ca/post/async-streams-dotnet-core-3-iasyncenumerable/'>IAsyncEnumerable 타입</a>을 사용해야 하는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > public static async <span style='color: blue; font-weight: bold'>System.Collections.Generic.IAsyncEnumerable<int></span> GenerateSequence() { for (int i = 0; i < 20; i++) { await Task.Delay(100); yield return i; } } </pre> <br /> 이것이 기본 .NET Frmaework 4.8에는 포함되어 있지 않으므로 컴파일 오류가 발생합니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1359
(왼쪽의 숫자를 입력해야 합니다.)