영어로 읽기

다음을 통해 공유


.NET 6의 새로운 기능

.NET 6은 .NET 5시작된 .NET 통합 계획의 마지막 부분을 제공합니다. .NET 6은 모바일, 데스크톱, IoT 및 클라우드 앱에서 SDK, 기본 라이브러리 및 런타임을 통합합니다. 이 통합 외에도 .NET 6 에코시스템은 다음을 제공합니다.

.NET 6은 LTS(장기 지원) 릴리스로 3년 동안 지원됩니다.

미리 보기 기능은 기본적으로 사용하지 않도록 설정됩니다. 또한 프로덕션에서 사용할 수 없으며 이후 버전에서 제거될 수 있습니다. 새 RequiresPreviewFeaturesAttribute 미리 보기 API에 주석을 추가하는 데 사용되며, 이러한 미리 보기 API를 사용하는 경우 해당 분석기가 경고합니다.

.NET 6은 Visual Studio 2022 이상 버전에서 지원됩니다.

이 문서에서는 .NET 6의 새로운 기능을 모두 다루지 않습니다. 새로운 기능을 모두 보려면, 또한 이 문서에 나열된 기능에 대한 더 많은 정보를 얻으려면 .NET 6 블로그 게시물을 참조하세요.

성능

.NET 6에는 다양한 성능 향상이 포함되어 있습니다. 이 섹션에서는 몇 가지 개선 사항을 나열합니다— FileStream, 프로필 기반 최적화, 및 AOT 컴파일. 자세한 내용은 .NET 6 블로그 게시물의 성능 향상을 참조하세요.

파일 스트림 (FileStream)

Windows에서 더 나은 성능과 안정성을 제공하기 위해 .NET 6에 대해 System.IO.FileStream 형식을 다시 작성했습니다. 이제 FileStream Windows에서 비동기 I/O를 만들 때 차단되지 않습니다. 자세한 내용은 .NET 6 블로그 게시물의 파일 IO 개선 사항을 참조하세요.

프로필 기반 최적화

PGO(프로필 기반 최적화)는 JIT 컴파일러가 가장 자주 사용되는 형식 및 코드 경로 측면에서 최적화된 코드를 생성하는 위치입니다. .NET 6에는 동적 PGO가 도입되었습니다. 동적 PGO는 계층형 컴파일과 함께 작동하여 계층 0 단계에서 배치되는 추가 계측에 따라 코드를 더욱 최적화합니다. 동적 PGO는 기본적으로 사용하지 않도록 설정되지만 DOTNET_TieredPGO환경 변수사용하여 사용하도록 설정할 수 있습니다. 자세한 내용은 JIT 성능 향상참조하세요.

Crossgen2

.NET 6에는 크로스겐의 후속작인 Crossgen2가 도입되어 제거되었습니다. Crossgen 및 Crossgen2는 앱의 시작 시간을 개선하기 위해 AOT(미리 실행) 컴파일을 제공하는 도구입니다. Crossgen2는 C++가 아닌 C#으로 작성되었으며 이전 버전에서는 불가능했던 분석 및 최적화를 수행할 수 있습니다. 자세한 내용은 Crossgen2대한 대화를 참조하세요.

Arm64 지원

.NET 6 릴리스에는 네이티브 Arm64 실행 및 x64 에뮬레이션 모두에 대한 macOS Arm64(또는 "Apple Silicon") 및 Windows Arm64 운영 체제에 대한 지원이 포함되어 있습니다. 또한 x64 및 Arm64 .NET 설치 관리자는 이제 나란히 설치합니다. 자세한 내용은 macOS 11 및 Windows 11에 대한 .NET 지원 (Arm64 및 x64)을 참조하십시오.

즉시 다시 로드

핫 리로드는 앱의 소스 코드를 수정하고 그 변경 사항을 실행 중인 앱에 즉시 적용할 수 있는 기능입니다. 이 기능의 목적은 편집 사이에 앱이 다시 시작되지 않도록 하여 생산성을 높이는 것입니다. 핫 다시 로드는 Visual Studio 2022 및 dotnet watch 명령줄 도구에서 사용할 수 있습니다. 핫 다시 로드는 대부분의 .NET 앱 유형과 C#, Visual Basic 및 C++ 소스 코드에서 작동합니다. 자세한 내용은 핫 리로드 블로그 게시물확인하세요.

.NET MAUI

.NET 다중 플랫폼 앱 UI(.NET MAUI)는 2022년 1분기 릴리스 후보와 2022년 2분기 GA(일반 공급)로 미리 보기있습니다. .NET MAUI를 사용하면 단일 코드베이스를 사용하여 데스크톱 및 모바일 운영 체제용 네이티브 클라이언트 앱을 빌드할 수 있습니다. 자세한 내용은 .NET 다중 플랫폼 앱 UI 블로그 게시물의 업데이트를 참조하세요.

C# 10 및 템플릿

C# 10에는 global using 지시문, 파일 범위 네임스페이스 선언 및 레코드 구조체와 같은 혁신이 포함되어 있습니다. 자세한 내용은 C# 언어 버전 기록참조하세요.

이 작업과 함께 C#용 .NET SDK 프로젝트 템플릿은 새로운 언어 기능 중 일부를 사용하도록 현대화되었습니다.

  • async Main 메서드
  • 최상위 수준의 문장들
  • 대상 형식의 새 식
  • 암시적 global using 지시문
  • 파일 범위의 네임스페이스
  • Nullable 참조 형식

이러한 새 언어 기능을 프로젝트 템플릿에 추가하면 새 코드가 활성화된 기능으로 시작됩니다. 그러나 .NET 6으로 업그레이드할 때 기존 코드는 영향을 받지 않습니다. 이러한 템플릿 변경에 대한 자세한 내용은 .NET SDK: C# 프로젝트 템플릿 현대화 블로그 게시물을 참조하세요.

F# 및 Visual Basic

F# 6은 F# 언어 및 F# Interactive에 몇 가지 개선 사항을 추가합니다. 자세한 내용은 F# 6의 새로운 기능을 참조하세요.

Visual Basic에는 Visual Studio 환경 및 Windows Forms 프로젝트 시작이 개선되었습니다.

SDK 워크로드

.NET SDK의 크기를 더 작게 유지하기 위해 일부 구성 요소는새로운 선택적 SDK 워크로드에 배치되었습니다. 이러한 구성 요소에는 .NET MAUI 및 Blazor WebAssembly AOT가 포함됩니다. Visual Studio를 사용하는 경우 필요한 모든 SDK 워크로드 설치를 처리합니다. .NET CLI사용하는 경우 새 dotnet workload 명령을 사용하여 워크로드를 관리할 수 있습니다.

명령 묘사
dotnet 워크로드 검색 사용 가능한 워크로드를 검색합니다.
dotnet 워크로드 설치 지정된 워크로드를 설치합니다.
dotnet 워크로드 제거 지정된 워크로드를 제거합니다.
dotnet 워크로드 업데이트 설치된 워크로드를 업데이트합니다.
dotnet 워크로드 복구 설치된 모든 워크로드를 다시 설치하여 끊어진 설치를 복구합니다.
dotnet 워크로드 목록 설치된 워크로드를 나열합니다.

자세한 내용은 선택적 SDK 워크로드참조하세요.

System.Text.Json API들

.NET 6의 System.Text.Json에서 많은 개선이 이루어져, 이제는 "산업용" 직렬화 기술로 자리 잡았습니다.

원본 생성기

.NET 6은 System.Text.Json에 대한 새로운 원본 생성기을 추가합니다. 소스 생성은 JsonSerializer와 함께 작동하며 여러 가지 방법으로 구성할 수 있습니다. 성능을 향상시키고 메모리 사용량을 줄이며 어셈블리 트리밍을 용이하게 할 수 있습니다. 자세한 내용은 System.Text.Json 리플렉션 또는 원본 생성을 선택하는 방법 및 System.Text.Json원본 생성을 사용하는 방법을 참조하세요.

쓰기 가능한 DOM

기존 읽기 전용 DOM을 보완하는 새 DOM(문서 개체 모델)이 추가되었습니다. 새 API는 일반적인 CLR 개체(POCO) 형식을 사용할 수 없는 경우에 대한 경량화된 serialization 대안을 제공합니다. 또한 큰 JSON 트리의 하위 섹션으로 효율적으로 이동하여 배열을 읽거나 해당 하위 섹션에서 POCO를 역직렬화할 수 있습니다. 쓰기 가능한 DOM을 지원하기 위해 다음과 같은 새 형식이 추가되었습니다.

자세한 내용은 JSON DOM 옵션을 참조하십시오.

IAsyncEnumerable 직렬화

이제 System.Text.JsonIAsyncEnumerable<T> 인스턴스를 사용한 직렬화 및 역직렬화를 지원합니다. 비동기 직렬화 메서드는 개체 그래프의 모든 IAsyncEnumerable<T> 인스턴스를 나열한 다음 JSON 배열로 직렬화합니다. 역직렬화를 위해 새 메서드 JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken) 추가되었습니다. 자세한 내용은 IAsyncEnumerable serialization참조하세요.

기타 새 API

유효성 검사와 기본값 설정을 위한 새로운 serialization 인터페이스:

자세한 내용은 콜백참조하세요.

새 속성 순서 지정 특성:

"원시" JSON을 작성하는 새 메서드:

스트림에 대한 동기 직렬화 및 역직렬화:

serialization 중에 참조 주기가 검색될 때 개체를 무시하는 새 옵션:

.NET에서 JSON 직렬화 및 역직렬화 을 참조하여 의 직렬화 및 역직렬화에 대한 자세한 정보를 확인하세요.

HTTP/3

.NET 6에는 새 버전의 HTTP인 HTTP/3에 대한 미리 보기 지원이 포함되어 있습니다. HTTP/3은 QUIC라는 새로운 기본 연결 프로토콜을 사용하여 기존 기능 및 성능 문제를 해결합니다. QUIC는 연결을 더 빠르게 설정하고, 연결은 IP 주소와 독립적이므로 모바일 클라이언트가 Wi-Fi와 셀룰러 네트워크 간에 로밍할 수 있습니다. 자세한 내용은 에서 HttpClient로 HTTP/3을 사용하는 방법을 참조하세요.을 확인해 보세요.

ASP.NET Core

ASP.NET Core에는 최소 API, Blazor WebAssembly 앱용 AOT(Ahead-Of-Time) 컴파일 및 단일 페이지 앱의 향상된 기능이 포함되어 있습니다. 또한 이제 Blazor 구성 요소를 JavaScript에서 렌더링하고 기존 JavaScript 기반 앱과 통합할 수 있습니다. 자세한 내용은 ASP.NET Core 6의 새로운 기능을 참조하세요.

OpenTelemetry

.NET 6은 소프트웨어의 성능 및 동작을 분석하는 데 도움이 되는 도구, API 및 SDK 컬렉션인 OpenTelemetry대한 향상된 지원을 제공합니다. System.Diagnostics.Metrics 네임스페이스의 API는 OpenTelemetry 메트릭 API 사양를 구현합니다. 예를 들어 다양한 메트릭 시나리오를 지원하는 네 가지 계측 클래스가 있습니다. 계측 클래스는 다음과 같습니다.

안전

.NET 6은 CET(제어 흐름 적용 기술) 및 "쓰기 전용 실행"(W^X)의 두 가지 주요 보안 완화에 대한 미리 보기 지원을 추가합니다.

CET는 일부 최신 Intel 및 AMD 프로세서에서 사용할 수 있는 인텔 기술입니다. 일부 제어 흐름 하이재킹 공격으로부터 보호하는 기능을 하드웨어에 추가합니다. .NET 6은 Windows x64 앱용 CET를 지원하며 명시적으로 사용하도록 설정해야 합니다. 자세한 내용은 Intel CET 섀도 스택과의 호환성에 대한 .NET 6을 참조하세요.

W^X는 .NET 6이 있는 모든 운영 체제에서 사용할 수 있지만 Apple Silicon에서 기본적으로만 사용하도록 설정됩니다. W^X는 메모리 페이지를 쓰기 가능하고 실행 가능하도록 동시에 허용하지 않음으로써 가장 간단한 공격 경로를 차단합니다.

IL 트리밍

독립형 배포의 트리밍이 향상되었습니다. .NET 5에서는 사용되지 않는 어셈블리만 잘립니다. .NET 6은 사용되지 않는 형식 및 멤버의 트리밍도 추가합니다. 또한 런타임에 사용되는 코드를 제거할 수 있는 경우를 경고하는 트리밍 경고는 이제 기본적으로 설정되어 있습니다. 자세한 내용은 자체 포함 배포 및 실행 파일 트리밍을 참조하세요.

코드 분석

.NET 6 SDK에는 API 호환성, 플랫폼 호환성, 트리밍 안전성, 문자열 연결 및 분할에서 범위 사용, 더 빠른 문자열 API 및 더 빠른 컬렉션 API와 관련된 몇 가지 새로운 코드 분석기가 포함되어 있습니다. 새(및 제거된) 분석기의 전체 목록은 Analyzer 릴리스 - .NET 6참조하세요.

사용자 지정 플랫폼 가드

플랫폼 호환성 분석기OperatingSystem 클래스의 Is<Platform> 메서드(예: OperatingSystem.IsWindows())를 플랫폼 가드로 인식합니다. 사용자 지정 플랫폼 가드를 허용하기 위해 .NET 6에는 지원되거나 지원되지 않는 플랫폼 이름으로 필드, 속성 또는 메서드에 주석을 추가하는 데 사용할 수 있는 두 가지 새로운 특성이 도입되었습니다.

Windows Forms

Application.SetDefaultFont(Font) 애플리케이션 전체에서 기본 글꼴을 설정하는 .NET 6의 새로운 메서드입니다.

C# Windows Forms 앱용 템플릿은 global using 지시문, 파일 범위 네임스페이스 및 nullable 참조 형식을 지원하도록 업데이트되었습니다. 또한 상용구 코드를 줄이고 Windows Forms 디자이너가 기본 설정 글꼴로 디자인 화면을 렌더링할 수 있도록 하는 애플리케이션 부트스트랩 코드를 포함합니다. 부트스트랩 코드는 Application.EnableVisualStyles()같은 다른 구성 메서드에 대한 호출을 내보내는 소스 생성 메서드인 ApplicationConfiguration.Initialize()대한 호출입니다. 또한 ApplicationDefaultFont MSBuild 속성을 통해 기본이 아닌 글꼴을 설정하는 경우 ApplicationConfiguration.Initialize()SetDefaultFont(Font)호출을 생성한다.

자세한 내용은 Windows Forms의 새로운 기능 블로그 게시물을 참조하세요.

원본 빌드

.NET SDK의 모든 소스를 포함한 소스 tarball은 이제 .NET SDK 빌드의 결과물입니다. Red Hat과 같은 다른 조직에서는 이 원본 tarball을 사용하여 자체 버전의 SDK를 빌드할 수 있습니다.

대상 프레임워크 이름

.NET 6에 추가 OS 관련 TFM(대상 프레임워크 모니커)이 추가되었습니다(예: net6.0-android, net6.0-iosnet6.0-macos). 자세한 내용은 .NET 5+ OS별 TFM참조하세요.

제네릭 수학

미리 보기는 .NET 6에서 제네릭 형식에 연산자를 사용할 수 있는 기능입니다. .NET 6에는 C# 10의 새로운 미리 보기 기능인 static abstract 인터페이스 멤버를 활용하는 다양한 인터페이스가 도입되었습니다. 이러한 인터페이스는 다른 연산자에 해당합니다. 예를 들어 IAdditionOperators+ 연산자를 나타냅니다. 인터페이스는 System.Runtime.Experimental NuGet 패키지에서 사용할 수 있습니다. 자세한 내용은 일반 수학 블로그 게시물을 참조하세요.

NuGet 패키지 유효성 검사

NuGet 라이브러리 개발자인 경우 새로운 패키지 유효성 검사 도구 사용하면 패키지가 일관되고 올바른 형식인지 확인할 수 있습니다. 다음을 확인하여 여부를 결정할 수 있습니다.

  • 패키지 버전 간에 호환성을 깨뜨리는 변경 사항이 있습니다.
  • 패키지에는 모든 런타임별 구현에 대해 동일한 공용 API 집합이 있습니다.
  • 대상 프레임워크나 런타임 적용 가능성에 어떠한 간격이 있습니까?

자세한 내용은 패키지 유효성 검사 블로그 게시물을 참조하세요.

리플렉션 API들

.NET 6에는 코드를 검사하고 Null 허용 여부 정보를 제공하는 다음과 같은 새로운 API가 도입되었습니다.

이러한 API는 리플렉션 기반 도구 및 serializer에 유용합니다.

Microsoft.Extensions API들

다음 표와 같이 여러 확장 네임스페이스가 .NET 6에서 개선되었습니다.

Namespace 개선
Microsoft.Extensions.DependencyInjection CreateAsyncScopeIAsyncDisposable 서비스를 등록하는 서비스 공급자에 대해 using 문을 안전하게 사용할 수 있도록 합니다.
Microsoft.Extensions.Hosting 새로운 ConfigureHostOptions 메서드는 애플리케이션 설정을 간소화합니다.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging에는 성능이 우수한 로깅 API를 위한 새로운 소스 생성기가 있습니다. partial 로깅 메서드에 새 LoggerMessageAttribute를 추가하면 소스 생성기가 트리거됩니다. 컴파일 시 생성기는 기존 로깅 솔루션보다 런타임에 일반적으로 더 빠른 partial 메서드의 구현을 생성합니다. 자세한 내용은 컴파일 타임 로깅 소스 생성을 참조하세요.

새로운 LINQ API들

.NET 6에는 수많은 LINQ 메서드가 추가되었습니다. 다음 표에 나열된 대부분의 새 메서드에는 System.Linq.Queryable 형식에 동일한 메서드가 있습니다.

메서드 묘사
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) 열거형을 강제 적용하지 않고 시퀀스의 요소 수를 확인하려고 시도합니다.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) 시퀀스의 요소를 지정된 크기의 청크로 분할합니다.
Enumerable.MaxByEnumerable.MinBy 키 선택기를 사용하여 최대 또는 최소 요소를 찾습니다.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectByEnumerable.UnionBy 집합 기반 작업을 수행하는 이러한 새로운 메서드 변형을 사용하면 키 선택기 함수를 사용하여 같음을 지정할 수 있습니다.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index)Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) 시퀀스의 시작 또는 끝에서 계산되는 인덱스를 허용합니다( 예: Enumerable.Range(1, 10).ElementAt(^2)9반환합니다.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource)Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource)Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource)Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
새 오버로드를 사용하면 시퀀스가 비어 있는 경우 사용할 기본값을 지정할 수 있습니다.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>)Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) 새 오버로드를 사용하면 비교자를 지정할 수 있습니다.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Range 인수를 수락하여 시퀀스 조각을 간단하게 만들 수 있습니다. 예를 들어 source.Take(7).Skip(2)대신 source.Take(2..7) 사용할 수 있습니다.
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) 세 개의 지정된 시퀀스에서 요소를 사용하여 튜플 시퀀스를 생성합니다.

날짜, 시간 및 표준 시간대 개선 사항

.NET 6에는 System.DateOnlySystem.TimeOnly두 구조체가 추가되었습니다. 각각 DateTime의 날짜 부분과 시간 부분을 나타냅니다. DateOnly 생일 및 기념일에 유용하며, TimeOnly 매일 경보 및 주간 업무 시간에 유용합니다.

이제 표준 시간대 데이터가 설치된 운영 체제에서 IANA(Internet Assigned Numbers Authority) 또는 Windows 표준 시간대 ID를 사용할 수 있습니다. 시스템에서 요청된 표준 시간대를 찾을 수 없는 경우 windows 표준 시간대에서 IANA 표준 시간대로 입력을 자동으로 변환하도록 TimeZoneInfo.FindSystemTimeZoneById(String) 메서드가 업데이트되었습니다. 또한 한 표준 시간대 형식에서 다른 표준 시간대 형식으로 수동으로 변환해야 하는 경우 시나리오에 대해 새 메서드 TryConvertIanaIdToWindowsId(String, String)TryConvertWindowsIdToIanaId 추가되었습니다.

몇 가지 다른 표준 시간대 개선 사항도 있습니다. 자세한 내용은 .NET 6날짜, 시간 및 표준 시간대 개선 사항을 참조하세요.

PriorityQueue 클래스

PriorityQueue<TElement,TPriority> 클래스는 값과 우선 순위가 모두 있는 항목의 컬렉션을 나타냅니다. 항목은 우선 순위가 증가하는 순서로 큐에서 삭제됩니다. 즉, 우선 순위 값이 가장 낮은 항목이 먼저 큐에서 삭제됩니다. 이 클래스는 최소 힙 데이터 구조를 구현합니다.

참고하세요