마이크로소프트가 .NET Core 3.0의 첫 번째 프리뷰를 공개했다. 이번 릴리스는 WPF, Windows Forms, WinUI와 같은 주요 Windows 데스크톱 UI 기술의 소스 코드를 일반에 개방하고 .NET Core 기반 데스크톱 애플리케이션 개발을 공식 지원하는 것이 핵심이다. 동시에 C# 8.0, IoT 하드웨어 제어, JSON 처리 성능 향상, ARM64 아키텍처 확장 등 여러 개선점이 포함되었다. .NET Framework 4.8 역시 고해상도 디스플레이 대응과 최신 브라우저/미디어 컨트롤을 추가하며 기존 앱의 현대화를 돕는다.
Windows 데스크톱 기술의 오픈 소스와 .NET Core 통합
WPF, Windows Forms, 그리고 WinUI 라이브러리는 이제 GitHub에서 소스 코드가 공개되며 .NET Foundation의 관리 아래 커뮤니티 기여가 가능해졌다. 이를 통해 개발자는 WPF/Windows Forms 앱을 .NET Core 3.0 위에서 작성할 수 있다. Windows 전용 SDK에 포함된 "Windows Desktop" 구성 요소를 통해 이용 가능하며, 기존 .NET Core 프로젝트와 유사한 방식으로 관리된다. SDK 속성 UseWPF 또는 UseWindowsForms를 true로 설정하여 사용할 UI 프레임워크를 명시한다. 두 속성을 동시에 활성화하면 WPF 컨트롤을 포함한 Windows Forms 대화상자 같은 시나리오도 구현할 수 있다.
프로젝트 생성은 간단하다. 명령줄에서 dotnet new wpf 또는 dotnet new winforms를 실행하면 기본 템플릿이 자동으로 마련된다. 생성된 앱은 dotnet run이나 실행 파일을 통해 바로 구동된다. Visual Studio 2019 Preview 1에서는 디버깅도 지원된다.
빌드 및 배포 개선
이제 dotnet build 시 NuGet 의존성이 빌드 출력 폴더로 자동 복사된다. 이전에는 dotnet publish를 통해서만 가능했지만, 간단한 xcopy 배포가 용이해졌다. 또한 .NET Core 앱은 기본적으로 네이티브 실행 파일(exe 또는 Linux/macOS 실행 바이너리)을 생성하며, 자체 포함(self-contained)이 아니더라도 실행 파일을 통해 구동할 수 있다.
로컬 .NET 도구
글로벌 도구 외에 특정 디렉터리(예: 리포지토리)에 종속된 로컬 도구 시나리오가 추가되었다. dotnet-tools.json 매니페스트 파일을 작성한 뒤 dotnet tool install <패키지ID>로 도구를 등록하고, 복제 후에는 dotnet tool restore만으로 필요한 도구를 준비할 수 있다. 실행은 dotnet tool run <명령>이다. 이를 통해 팀별로 일관된 도구 버전을 유지할 수 있다.
고속 JSON 리더: Utf8JsonReader
System.Text.Json.Utf8JsonReader는 UTF-8 JSON 텍스트를 위한 저할당, 전진 전용 판독기다. ReadOnlySpan<byte>로부터 직접 읽어들이며, 기존 Json.NET 판독기 대비 2배 빠른 성능을 보여준다. 다음은 기본 읽기 루프의 예시이다.
byte[] jsonBytes = Encoding.UTF8.GetBytes("{\"name\":\"example\"}");
var reader = new Utf8JsonReader(jsonBytes);
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.PropertyName)
{
string prop = reader.GetString();
reader.Read();
string val = reader.GetString();
Console.WriteLine($"{prop} = {val}");
}
}
향후 Json 작성기, DOM, POCO 직렬화/역직렬화도 추가될 예정이다.
C# 8.0 언어 기능
인덱스 및 범위
Index 타입은 컬렉션의 시작(int) 또는 끝(^ 접두사) 기준 인덱싱을 표현한다. Range는 두 개의 Index로 구성되며 시작..끝 식으로 슬라이스를 생성할 수 있다.
비동기 스트림
IAsyncEnumerable<T>는 IEnumerable<T>의 비동기 버전이다. await foreach를 통해 소비하고 yield return으로 생성한다. 다음은 비동기 시퀀스를 생산/소비하는 예이다.
async IAsyncEnumerable<int> GenerateAsync()
{
for (int i = 0; i < 5; i++)
{
await Task.Delay(200);
yield return i;
}
}
await foreach (var num in GenerateAsync())
{
Console.WriteLine(num);
}
인터페이스 기본 구현
이제 인터페이스 멤버에 기본 구현을 제공할 수 있다. 기존 구현자에게 영향을 주지 않으면서 기능을 확장할 수 있다.
interface IReporter
{
void Report(string message);
void Report(Exception ex) => Report($"오류: {ex.Message}");
}
class ConsoleReporter : IReporter
{
public void Report(string message) => Console.WriteLine(message);
}
IoT 및 하드웨어 인터페이스
Linux에서 시리얼 포트 API가 지원되며, GPIO, PWM, SPI, I²C 등의 핀 제어를 위한 System.Device.Gpio NuGet 패키지가 제공된다. 라즈베리 파이와 아두이노 간 시리얼 통신과 LCD 패널 제어 같은 시나리오를 구현할 수 있다.
using var gpio = new GpioController();
int ledPin = 17;
gpio.OpenPin(ledPin, PinMode.Output);
gpio.Write(ledPin, PinValue.High); // LED 켜기
보안 및 암호화
AES-GCM과 AES-CCM 대칭 암호가 추가되었으며, 비대칭 키를 표준 포맷(PKCS#8, SubjectPublicKeyInfo 등)으로 가져오거나 내보낼 수 있다. X.509 인증서 없이도 키 관리를 수행할 수 있다.
byte[] key = new byte[16];
RandomNumberGenerator.Fill(key);
byte[] nonce = new byte[12];
RandomNumberGenerator.Fill(nonce);
byte[] plaintext = Encoding.UTF8.GetBytes("비밀 메시지");
byte[] ciphertext = new byte[plaintext.Length];
byte[] tag = new byte[16];
using var aes = new AesGcm(key);
aes.Encrypt(nonce, plaintext, ciphertext, tag);
byte[] decrypted = new byte[ciphertext.Length];
aes.Decrypt(nonce, ciphertext, tag, decrypted);
Console.WriteLine(Encoding.UTF8.GetString(decrypted));
Linux에서는 OpenSSL 1.1.1을 통해 TLS 1.3이 지원되어 연결 시간 단축과 보안 강화를 누릴 수 있다.
성능 및 내부 구조 개선
- 계층형 컴파일이 기본 활성화되어 시작 속도와 처리량이 최적화된다.
Span<T>,Memory<T>연산 성능이 향상되었다.System.Buffers.SequenceReader를 추가하여ReadOnlySequence<T>기반 파이프라인 데이터 파싱을 보다 효율적으로 수행할 수 있다.MetadataLoadContext를 통해 타 런타임/아키텍처의 어셈블리 메타데이터를 안전하게 읽을 수 있다.
플랫폼 확장
ARM64 아키텍처(Linux) 지원이 추가되었으며, Alpine, Debian, Ubuntu용 Docker 이미지도 제공된다. Windows, macOS, 여러 Linux 배포판에서 x64, x86, ARM32, ARM64가 지원된다.
이번 프리뷰를 통해 .NET Core 3.0의 방향이 선명해졌다. Windows 데스크톱 애플리케이션 개발자에게는 최신 기술 스택을, IoT 영역에는 하드웨어 제어를, 그리고 고성능 서버 애플리케이션에는 더 빠른 JSON 처리와 TLS 1.3 등이 제공된다. .NET Framework 4.8과의 공존도 계속되어 선택의 폭을 넓혀준다.