원문: https://devblogs.microsoft.com/dotnet/dotnet-11-preview-3/
라이브러리 업데이트
System.Text.Json: 이름 지정 및 무시 기본값 제어 옵션 강화
Preview 3에서는 System.Text.Json의 기본제공 명명 및 무시 옵션이 확장되었습니다. 기존의 camel, snake, kebab 프리셋에 더해 JsonNamingPolicy.PascalCase가 추가되었으며, [JsonNamingPolicy]를 통해 개별 멤버 단위로 명명 정책을 재정의할 수 있습니다. 또한 형식 수준의 [JsonIgnore(Condition = ...)]를 통해 모델의 기본 무시 동작을 한 곳에서 설정할 수 있습니다 (dotnet/runtime #124644, dotnet/runtime #124645, dotnet/runtime #124646).
using System.Text.Json;
using System.Text.Json.Serialization;
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public sealed class EventData
{
[JsonNamingPolicy(JsonKnownNamingPolicy.CamelCase)]
public string EventName { get; set; } = "";
public string? Notes { get; set; }
}
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.PascalCase
};
Zstandard: System.IO.Compression으로 이동, ZIP 읽기 시 CRC32 검증
이전에 .NET 11에서 소개되었던 Zstandard API가 이제 System.IO.Compression에 포함되어 DeflateStream, GZipStream, BrotliStream과 나란히위치하게 되었습니다 (dotnet/runtime #124634). 또한 Preview 3에서는 ZIP 항목을 읽을 때 CRC32 검증이 추가되어, 손상된 페이로드를 묵인하는 대신 InvalidDataException으로 더빠르게 실패합니다(dotnet/runtime #124766). 이전 프리뷰 패키지를 사용 중이었다면 별도의 System.IO.Compression.Zstandard 패키지 참조를 제거하세요.
-<PackageReference Include="System.IO.Compression.Zstandard" />
SafeFileHandle 및 RandomAccess: 파이프 지원 확장
Preview 3에는 몇 가지 저수준 I/O 업데이트가 포함되어 있습니다. SafeFileHandle.Type은 핸들이파일, 파이프, 소켓, 디렉터리 또는 기타 OS 객체인지 여부를 보고합니다(dotnet/runtime #124561). SafeFileHandle.CreateAnonymousPipe는 각끝단의 비동기 동작을 분리하여 파이프 쌍을 만들 수 있으며(dotnet/runtime #125220), RandomAccess. Read/Write는 파이프처럼seek이 불가능한 핸들에서도 작동합니다(dotnet/runtime #125512). Windows에서는 프로세스가 리다이렉트된stdout/stderr에 대해 오버랩 I/O를 사용하게 되어, 많은 프로세스를 다루는 앱에서 스레드 풀 블로킹을 줄일 수 있습니다 (dotnet/runtime #125643).
using Microsoft.Win32.SafeHandles;
using System.IO;
SafeFileHandle.CreateAnonymousPipe(out SafeFileHandle readEnd, out SafeFileHandle writeEnd,
asyncReads: true, asyncWrites: false);
Console.WriteLine(readEnd.Type); // Pipe
정규식: 모든 유니코드 줄바꿈 시퀀스 인식
새로운 RegexOptions.AnyNewLine 플래그를 사용하면 ^, $, .가 \\n뿐만 아니라전체 유니코드 줄 바꿈 문자 집합을 줄 끝으로 취급합니다(dotnet/runtime #124701). 이는 Windows, Unix 및 유니코드 특수 줄 바꿈이 혼합될 수 있는 텍스트를 구문 분석할 때 유용합니다. Preview 3에는 일반적인 정규식 패턴에 대한 최적화 개선 사항도 포함되어 있습니다.
using System.Text.RegularExpressions;
string text = "line1\\r\\nline2\\u0085line3\\u2028line4";
var matches = Regex.Matches(
text,
@"^line\\d$",
RegexOptions.Multiline | RegexOptions.AnyNewLine);
호환성 파괴 변경 사항
-
ZipArchive는 이제항목을 읽는 동안 CRC32를 검증합니다. 이전에는 통과되던 손상되거나 잘린 아카이브가 이제InvalidDataException을 발생시킬수 있습니다(dotnet/runtime #124766). -
처리되지 않은
BackgroundService예외는 이제 조용히 무시되지 않고 호스트를 중지시킵니다(dotnet/runtime #124863). -
서버의 클라이언트 인증서 검증 중 온라인 AIA(Authority Information Access) 가져오기가 기본적으로 비활성화되었습니다. 온라인 AIA 가져오기에 의존하고 있었다면 검증 구성을 다시 확인하십시오(dotnet/runtime #125049).
-
TarWriter는 동일한하드 링크 파일이 아카이브에 여러 번 포함될 때HardLink항목을 출력합니다(dotnet/runtime #123874).
버그 수정 (Bug fixes)
-
의존성 주입 (Dependency injection)
- 팩토리 기반 순환 종속성은 이제 유용하지 않은 오류 대신 명확한
InvalidOperationException을 발생시킵니다(dotnet/runtime #124331).
- 팩토리 기반 순환 종속성은 이제 유용하지 않은 오류 대신 명확한
-
로깅 (Logging)
- 로깅 소스 생성기가 이제 제네릭 메서드를 지원합니다(dotnet/runtime #124638).
-
네트워킹 (Networking)
- Windows의
HttpListener에서 HTTP.sys 커널 응답 버퍼링을 제어할 수 있습니다(dotnet/runtime #124720).
- Windows의
런타임 업데이트
Runtime async: 미리 보기 API 옵트인 요구 사항 제거
Runtime async는 여전히 runtime-async=on 기능 스위치를 사용하지만, Preview 3부터는 API에 적용되었던 [RequiresPreviewFeatures] 게이트가 제거되었습니다. 이제 net11.0 프로젝트에서 runtime-async=on을 켜기위해서만 \\<EnablePreviewFeatures>true\\</EnablePreviewFeatures>를 설정할 필요가 없습니다(dotnet/runtime #124488).
또한 이번 프리뷰에는 NativeAOT 및 ReadyToRun 지원도 포함되었습니다(dotnet/runtime #123952, dotnet/runtime #124203, dotnet/runtime #125420). 후속 작업으로 continuation 객체를 보다 적극적으로 재사용하고, 변경되지 않은 로컬 값을 저장하지 않도록 하여 async 중심 코드에서 할당(alloc) 부하를 줄였습니다 (dotnet/runtime #125556, dotnet/runtime #125615).
<PropertyGroup>
<Features>runtime-async=on</Features>
- <EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
JIT 최적화: switch, 경계 검사, 형 변환 개선
Preview 3는 소스 코드 변경 없이도 일반 코드에 이점을 제공하는 JIT 개선 사항을 계속해서 제공합니다. 예를 들어, 다중 대상 switch 표현식과 같은 일반적인 패턴이 더 단순한 분기 없는 검사 형태로 접혀지며(dotnet/runtime #124567), 인덱스-from-end 접근 방식에서 불필요한 경계 검사를 더 많이 제거할 수 있게 되었으며(dotnet/runtime #124571), AVX-512 이전의 x86 하드웨어에서 uint → float/double 형 변환이 더 빨라졌습니다(dotnet/runtime #124114).
컴파일러 측의 지원 작업을 통해 JIT가 이러한 축약을 더 많은 실제 코드에 적용할 수 있게 되었습니다.
bool isSmall = x is 0 or 1 or 2 or 3 or 4;
int tail = values[^1] + values[^2];
double d = someUint;
브라우저 및 WebAssembly: WebCIL 및 디버깅 개선
Preview 3는 WebCIL 페이로드 로딩 지원을 포함하여 브라우저/CoreCLR 작업을 확장했으며(dotnet/runtime #124758, dotnet/runtime #124904), 디버깅을 위한 심볼 및 스택 트레이스 품질을 개선했으며(dotnet/runtime #124500, dotnet/runtime #124483), JS 경계를 넘어 float[], Span<float>, ArraySegment<float>를 더 직접적으로 마샬링할 수 있게 했습니다(dotnet/runtime #123642).
호환성 깨는 변경 사항 (Breaking changes)
- NativeAOT 네이티브 라이브러리 출력은 이제 Unix에서 관례적인
lib접두사를 사용합니다. 스크립트가MyLib.so를 기대했다면libMyLib.so를 찾도록수정하세요 (dotnet/runtime #124611).
버그 수정 (Bug fixes)
-
JIT
- async save/restore, if-conversion, return-block 복제 관련 정확성 문제를 수정했습니다(dotnet/runtime #125044, dotnet/runtime #125072, dotnet/runtime #124642).
-
VM / 런타임 비동기
- runtime-async 재개(resumption) 스텁의 경합 누수(race leak)와, 경합 시 교착 상태가 발생할 수 있는 잠금(lock) 수준 문제를 수정했습니다 (dotnet/runtime #125407, dotnet/runtime #125675).
SDK 업데이트
CLI에서 솔루션 필터를 편집할 수 있습니다.
dotnet sln 명령을 사용하여 CLI에서 직접 솔루션 필터(.slnf)를 생성하고 편집할 수 있게 되었습니다(dotnet/sdk #51156). 이를 통해 대규모 리포지토리에서 주 솔루션을 변경하지 않고도 일부 프로젝트만 로드하거나 빌드할 수 있습니다. 솔루션 필터에 대한 자세한 내용은 문서에서 확인할수 있습니다.
dotnet new slnf --name MyApp.slnf
dotnet sln MyApp.slnf add src/Lib/Lib.csproj
dotnet sln MyApp.slnf list
dotnet sln MyApp.slnf remove src/Lib/Lib.csproj
파일 기반 앱을 여러 파일로 분리할 수 있습니다
파일 기반 앱이 이제 #:include를 지원하므로, 파일 기반 워크플로를 유지한 채로 공용 헬퍼를 별도의 파일로 분리할 수 있습니다(dotnet/sdk #52347). Roslyn은 해당 지시문에 대한 편집기 자동 완성 기능도 추가했습니다(dotnet/roslyn #82625).
#:include helpers.cs
#:include models/customer.cs
Console.WriteLine(Helpers.FormatOutput(new Customer()));
dotnet run-e를 사용하여 명령줄에서 환경 변수를 전달할 수 있습니다
dotnet run -e FOO=BAR를 사용하면로컬 앱 실행 시 셸 상태를 내보내거나 런치 프로필을 수정하지 않고도 명령줄에서 환경 변수를 전달할 수 있습니다(dotnet/sdk #52664). 이렇게 하면 간단한 설정 재정의 사항을 셸 상태나 런치 설정 대신 명령줄에 유지할 수 있습니다. 이 방식으로 전달된 환경 변수는 MSBuild 로직에서 처리할 수 있도록 RuntimeEnvironmentVariable 항목으로 제공됩니다.
dotnet run -e ASPNETCORE_ENVIRONMENT=Development -e LOG_LEVEL=Debug
dotnetwatch에 Aspire, 크래시 복구 및 Windows 데스크톱 개선 사항이 추가되었습니다.
Preview 3에는 장시간 로컬 개발 루프를 위한 여러 dotnet watch 업데이트가 포함되어 있습니다. Aspire 앱 호스트와 연동할 수 있고(dotnet/sdk #53192), 충돌 발생 후 관련 파일의 변경 사항이 감지되면 자동으로 다시 실행하며(dotnet/sdk #53314), WinForms 및 WPF와 같은 Windows 데스크톱 앱에서 Ctrl+C 처리를 더 원활하게 합니다(dotnet/sdk #53127).
기타 CLI 개선 사항
-
dotnet format은 이제다중 대상 프로젝트에 대해-framework을 지원합니다(dotnet/sdk #53202). -
MTP
모드의 dotnet test는 이제-artifacts-path를 지원합니다(dotnet/sdk #53353). -
dotnet toolexec 및 dnx가 더이상 추가 승인 프롬프트로 인해 중지되지 않습니다(dotnet/sdk #52956).
버그 수정
-
글로벌 및 로컬 도구에
대해 dotnet tool install --source가 적용되지않던 문제를 수정했습니다(dotnet/sdk #52787). -
dotnet remove package가 project인수를 인식하지 못하는 문제를 수정했습니다(dotnet/sdk #53401). -
dotnet run이 서로다른 대상 프레임워크를 참조하는 프로젝트를 대상으로 할 때발생하는 NETSDK1005 오류를수정했습니다(dotnet/sdk #53523). -
dotnet workload repair는 형식이잘못되었거나 손상된 워크로드 세트를 복구할 수 있습니다(dotnet/sdk #52434). -
-self-contained 옵션이더 이상항상 true를 의미하지않고, 전달된 값을 구문 분석합니다(dotnet/sdk #52333).
C# 프로그래밍 언어
유니온(union) 유형 지원
Preview2에서 유니온 유형에 대한 컴파일러 지원이 추가되었습니다. Preview 3에서는 유니온 유형을 다룰 때의 IDE 지원이 더욱 개선되었습니다. 자세한 내용은 유니온 유형에 대한 블로그 게시물과 C# 가이드에서 확인할수 있습니다. “새로운 기능” 페이지에는 언어 참조 링크가 포함되어 있으며, 조만간 튜토리얼 등 추가 자료 링크도 추가될 예정입니다.
또한 Preview 3에서는 UnionAttribute 타입과 IUnion 인터페이스에 대한 폴리필을 직접 제공해야 합니다.
`namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false)] public sealed class UnionAttribute : Attribute;
public interface IUnion
{
object? Value { get; }
}
}`
ASP .NET Core
Zstandard 응답 압축 및 요청 압축 해제
ASP.NET Core는 응답 압축과 요청 압축 해제 모두에서 Zstandard(zstd)를 지원합니다(dotnet/aspnetcore #65479). 기존의 response-compression 및 request-decompression 미들웨어에 zstd 지원이 추가되었으며, 기본적으로 활성화됩니다.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddResponseCompression();
builder.Services.AddRequestDecompression();
builder.Services.Configure<ZstandardCompressionProviderOptions>(options =>
{
options.CompressionOptions = new ZstandardCompressionOptions
{
Quality = 6 // 1-22, 높을수록 더 잘 압축되지만 느려집니다
};
});
이 기여에 대해 @manandre 님께 감사드립니다!
Virtualize: 런타임에서 높이 가변 항목에 적응
Blazor의 Virtualize<TItem> 컴포넌트는 더 이상 모든 항목의 높이가 동일하다고 가정하지 않습니다. 이제 런타임에서 측정된 항목 크기에 맞춰 적응하므로, 항목 높이가 다양한 경우에도 잘못된 여백 및 스크롤 문제를 줄입니다. 또한 평균 항목 높이 계산의 정확도를 높이기 위해 OverscanCount의 기본값이 3에서 15로 변경되었습니다. 잠재적인 성능 영향 가능성을 줄이기 위해 QuickGrid는 OverscanCount를 계속 3으로 유지합니다(dotnet/aspnetcore #64964).
<Virtualize Items="messages" Context="message">
<article class="message-card">
<h4>@message.Author</h4>
<p>@message.Text</p>
</article>
</Virtualize>
HTTP/3: 더 이른 시점에 요청 처리 시작
Kestrel은 이제 제어 스트림과 SETTINGS 프레임을 먼저 기다리지 않고 HTTP/3 요청 처리를 시작하므로, 새 연결에서 첫 번째 요청의 지연 시간을 줄입니다(dotnet/aspnetcore #65399).
버그 수정 (Bug fixes)
-
Blazor
-
Virtualize에서 null참조 오류를 수정했습니다(dotnet/aspnetcore #65207). -
overflow-x가 설정된경우의 scroll-container 감지를 수정했습니다(dotnet/aspnetcore #65744). -
게시된 Blazor WebAssembly 앱에서 Web Worker 템플릿 문제를 수정했습니다(dotnet/aspnetcore #65885).
-
TempData 지연 로딩 수정:
Get,Remove,Keep및 열거(enumeration) 동작이 이제 지연 로딩을 올바르게 트리거합니다 (dotnet/aspnetcore #65722). -
ResourceCollectionProvider에서IJSObjectReference누수를 수정했습니다(dotnet/aspnetcore #65606). -
Blazor 리소스 컬렉션 엔드포인트의 캐시 헤더에
no-transform이 포함되도록하고,Vary헤더를 올바르게 수정했습니다(dotnet/aspnetcore #65513).
-
-
데이터 보호
- .NET Framework 대상에서
ManagedAuthenticatedEncryptor해시 계산 및 비교 동작을 수정했습니다 (dotnet/aspnetcore #65890).
- .NET Framework 대상에서
-
HTTP / Kestrel
-
HTTP/2 HEADERS 프레임의 패딩 길이 검증이 PRIORITY 플래그 바이트를 고려하도록 수정했습니다 (dotnet/aspnetcore #65729).
-
CONTINUATION 프레임에 걸쳐 트레일러가 분할될 때 발생하던 HTTP/2 Content-Length 불일치를 수정했습니다 (dotnet/aspnetcore #65765).
-
HPACK/QPACK 디코더가
MaxRequestHeaderFieldSize문서에 따라 비압축 헤더 크기 제한을 검증하도록 수정했습니다 (dotnet/aspnetcore #65771). -
RFC 8446에 따라
TlsListener에서 지나치게큰 TLS 레코드 길이를 처리하는 방식을 수정했습니다(dotnet/aspnetcore #65558). -
HTTP 응답에 대한
ReasonPhrase검증을 업데이트했습니다 (dotnet/aspnetcore #65797).
-
-
JSON 패치
- 배열 요소 내부 속성에 대한
JsonPatchDocument작업을 수정했습니다 (dotnet/aspnetcore #65470).
- 배열 요소 내부 속성에 대한
-
미들웨어
- 요청이 캐시 쓰기와 같은 틱에 도달했을 때 캐시된 항목을 잘못 거부하던 출력 캐싱 신선도 확인을 수정했습니다 (dotnet/aspnetcore #65659).
-
최소 API
JsonElement,Dictionary와 같이 인덱서가있는 유형을 만났을 때 검증 소스 생성기가 충돌하던 문제를 수정했습니다 (dotnet/aspnetcore #65432).
-
SignalR
StatefulReconnect에서 취소처리(cancellation handling)가 더 적극적으로 작동하도록 수정했습니다 (dotnet/aspnetcore #65732).
MAUI
Maps: 클러스터링, 스타일링, 더욱 풍부한 상호작용 API 추가
Preview 3에서 Map 컨트롤은 대규모 기능 확장을 거쳤습니다. 핀 클러스터링, 사용자 지정 핀 아이콘, 사용자 지정 JSON 스타일링, MapLongClicked, 원·다각형·폴리라인 클릭 이벤트, MapElement.IsVisible 및 ZIndex, 프로그래밍 방식의 정보 창 제어, 더 부드러운 영역 변경, 더 풍부한 사용자 위치 이벤트가 포함됩니다 (dotnet/maui #29101, dotnet/maui #33831, dotnet/maui #33950, dotnet/maui #33982, dotnet/maui #33985, dotnet/maui #33792, dotnet/maui #33799, dotnet/maui #33991, dotnet/maui #33993). 이 API 덕분에 플랫폼별 구현으로 되돌아가지 않고도 고밀도이며 인터랙티브한 지도 경험을 더 쉽게 만들 수 있습니다.
<maps:Map IsClusteringEnabled="True"
MapLongClicked="OnMapLongClicked">
<maps:Pin Label="Seattle"
Location="47.6062,-122.3321"
ClusteringIdentifier="stores"
ImageSource="store.png" />
</maps:Map>
XAML 및 스타일링 개선: 시작 시 작업 감소 및 반복 속도 향상
XAML 소스 생성이 이제 ResourceDictionary 항목을 팩토리로 등록하고, 페이지 시작 시 모든 스타일과 브러시를 즉시 생성하는 대신 필요할 때(on demand) 로드하도록 변경되었습니다(dotnet/maui #33826). 또한 Preview 3에서는 암시적 XAML 네임스페이스 선언이 기본적으로 활성화되었으며, Hot Reload 또는 동적 UI 업데이트 중에 변경된 스타일과 시각적 상태를 다시 적용할 수 있는 명시적 API가 추가되었습니다. 앱이 스타일시트를 사용하지 않는 경우 MAUI CSS를 트리밍하여 불필요한 앱 크기를 줄일 수 있습니다(dotnet/maui #33834, dotnet/maui #34723, dotnet/maui #33160).
특히,InvalidateStyle()및 VisualStateManager.InvalidateVisualStates()는 툴링 및 앱 코드에서 요소 트리를 다시 생성하지 않고도 인플레이스 스타일 및 시각적 상태 변경 사항을 다시 적용할 수 있는 명시적인 방법을 제공합니다.
<ContentPage.Resources>
<Style x:Key="PrimaryButtonStyle" TargetType="Button">
<Setter Property="Padding" Value="12,8" />
</Style>
</ContentPage.Resources>
LongPressGestureRecognizer가 이제 .NET MAUI에 내장되었습니다
.NET MAUI에는 이제 플랫폼 전반에 걸쳐 지속 시간, 이동 임계값, 상태 변경 및 명령을 지원하는내장 LongPressGestureRecognizer가포함되어 있습니다(dotnet/maui #33432). 이를 통해 툴킷 동작이나 사용자 지정 핸들러를 사용할 필요 없이 길게 누르기 상호 작용에 대한 기본 API를 사용할 수 있습니다.
<Image Source="avatar.png">
<Image.GestureRecognizers>
<LongPressGestureRecognizer
MinimumPressDuration="750"
Command="{Binding ShowContextMenuCommand}" />
</Image.GestureRecognizers>
</Image>
플랫폼 통합을 통한 iOS 알림 권한 지원 추가
Preview 3에는iOS의 PostNotifications 권한구현이 추가되어, 앱이 플랫폼별 코드로 전환하지 않고도 크로스 플랫폼 Permissions API를 통해 알림 권한을 요청할 수 있습니다(dotnet/maui #30132).
var status = await Permissions.RequestAsync<Permissions.PostNotifications>();
.NET for Android, Android 17 / API 37 프리뷰 지원 추가
.NET for Android Preview 3은 Android 17 / API 37 프리뷰와 호환되므로, 앱은 곧 출시될 플랫폼에 대해 미리 검증할 수 있습니다.
.NET 11 Preview 3 출시를 준비하는 과정에서 .NET MAUI 팀과 긴밀히 협력해준 Uno Platform 팀에깊은 감사를 드립니다. 그들의 기여 덕분에 .NET for Android가 Google의 최신 플랫폼 업데이트와 완벽하게 호환되어, 개발자들이 Android 17 프리뷰 및 API 37을 즉시 활용할 수 있게 되었습니다. 이러한 파트너십은 .NET 생태계를 강화하고, 고품질의 크로스 플랫폼 개발자 경험을 제공하려는 우리의 공동 의지를 반영합니다.
API 37을 사용하려면.csproj 파일을 업데이트하세요:
<PropertyGroup>
<TargetFramework>net11.0-android37</TargetFramework>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
Visual Studio에서 API 37을설치하려면 도구 > Android > Android SDK 관리자 > 저장소 > 전체 목록을 사용하십시오:
참고
기본적으로 SDK관리자는 C:\\Program Files (x86)\\Android\\android-sdk\\platforms\\android-37.0에 설치되며, .NET for Android는 이 경로를 자동으로 찾지 못합니다. 향후 릴리스에서 이 문제가 해결될 때까지 임시 해결책으로 폴더이름을 C:\\Program Files (x86)\\Android\\android-sdk\\platforms\\android-37로 변경하십시오.
Android 17에서 사용할 수 있는 새로운 API를 호출하는 전체예제는 API-37 HPKE 암호화 샘플을 참조하십시오. 변경 사항의 전체 목록은.NET for Android Preview 3 릴리스 노트를 참조하십시오.
.NET for Android의 CLI 기반 기기 검색 및 배포 흐름 개선
이제 dotnet run을 사용하여사용 가능한 에뮬레이터를 나열하고 배포 전에 선택한 AVD를 자동으로 부팅할 수 있습니다(dotnet/android #10826). 이러한 변경 사항으로 인해 CLI 우선 Android 개발이 IDE 전용 장치 관리에 덜 의존하게 되었습니다.
Apple 워크로드용 .NET, 패키징 및 바인딩 품질 개선
Preview 3은 후처리 과정에서 정적 프레임워크를 필터링하여 앱 번들에 실제로 포함된 프레임워크에 대해서만 스트리핑 및 심볼 처리가 이루어지도록 함으로써 Apple 워크로드 패키징을 개선했습니다(dotnet/macios #24845). 릴리스브랜치에는 NSArray API에대한 nullability 어노테이션 개선과 같은 바인딩 품질 관련 작업도 포함되어 있습니다(dotnet/macios #24907).
Apple용 .NET의 Xcode 26.3 지원
이제 Apple 플랫폼을 대상으로 할 때 Xcode 26.3이 지원됩니다. 새로운 API는 도입되지 않았습니다.
Apple 플랫폼의 CoreCLR 개선 사항
이 프리뷰에는 모든 Apple 플랫폼(iOS, macOS, Mac Catalyst 및 tvOS)에 걸친 여러 CoreCLR 개선 사항이 포함되어 있습니다:
-
더 작아진 릴리스 빌드. 네이티브 심볼 제거 기능이 이제 CoreCLR 및 ReadyToRun(R2R) 프레임워크까지 적용되어, MAUI 템플릿 앱의 번들 크기가 77.8MB에서 41.6MB로 줄었습니다(dotnet/macios #24678).
-
더 빠른 증분 빌드. 사용자 어셈블리만 변경될 때 R2R 복합 이미지가 캐시되어 증분 빌드 시간이 약 39초에서 약 26초로 단축되었습니다(dotnet/macios #24735).
-
더 스마트한 코드 생성. R2R 컴파일러는 이제 배포 대상에 필요한 최소 명령어 세트(예: iOS 16+의 경우 ARMv8.2-A)를 대상으로 하여, 기기 호환성을 저해하지 않으면서 더 우수한 네이티브 코드를 생성합니다(dotnet/macios #24621).
-
macOS에서의 R2R. ReadyToRun 컴파일이 이제 macOS에서 작동하며, 모든 Apple 플랫폼에 대한 R2R 지원이 완료되었습니다(dotnet/macios #25080).
Entity Framework Core
ChangeTracker.GetEntriesForState()는불필요한 변경 감지를 방지합니다
ChangeTracker의새로운GetEntriesForState()API는 먼저DetectChanges()를 강제로 실행하지 않고도 선택된 상태의 추적된 엔터티를 반환합니다(dotnet/efcore #37847). 이를 통해 관심 있는 상태를 이미 알고 있는 장기 컨텍스트나 대량의 변경 추적 코드에서 불필요한DetectChanges()호출을 방지할 수 있습니다.
var modified = context.ChangeTracker.GetEntriesForState(
added: false,
modified: true,
deleted: false,
unchanged: false);
DbContext 구성을 통해 제공자를 제거하고 풀링된 팩토리를 추가할 수 있습니다
Preview 3에서는 다른 공급자를 등록하기 전에 이전 공급자 구성을 제거하기 위한RemoveDbContext()/RemoveExtension()헬퍼가 추가되었습니다(dotnet/efcore #37891). 이는 프로덕션용 SQL Server 구성을 메모리 내 또는 SQLite 공급자로 대체하는 테스트 환경에서 특히 유용합니다.
AddPooledDbContextFactory<TContext>()에도 이제 매개변수가 없는 오버로드가 추가되어,ConfigureDbContext<TContext>()내에 이미 존재하는 구성에 대해 더 이상 추가적인 설정 보일러플레이트가 필요하지 않습니다(dotnet/efcore #37144).
services.RemoveDbContext<MyContext>();
services.AddPooledDbContextFactory<MyContext>();
마이그레이션에 대한 제어력 강화 및 명확한 피드백 제공
이제 EF Core에서는ExcludeForeignKeyFromMigrations(true)를사용하여 마이그레이션에서 외래 키 제약 조건을 제외할 수 있습니다(dotnet/efcore #37815). 또한 모델 스냅샷에 최신 마이그레이션 ID가 기록되므로, 팀 워크플로에서 EF가 마이그레이션 트리의 분기를 더 일찍 감지할 수 있습니다(dotnet/efcore #37689).
modelBuilder.Entity<Order>()
.HasOne(o => o.Customer)
.WithMany(c => c.Orders)
.ExcludeForeignKeyFromMigrations(true);
SQL 생성 시 불필요한 조인이 제거되고 SQL Server에 JSON API가 추가되었습니다
1:1 조인에 대한 쿼리 생성이 이제 일반적인 상황에서 불필요한 조인을 제거합니다(dotnet/efcore #37819). SQL Server 2025는 이제EF.Functions.JsonContains()를 지원하며, 명확성을 위해 이전 프리뷰 API의 이름이JsonPathExists()로 변경되었습니다(dotnet/efcore #37714,dotnet/efcore #37732).
호환성 변경 사항
-
RelationalEventId.MigrationsNotFound는이제 정보성 메시지를 기록하는 대신 기본적으로 예외를 발생시킵니다(dotnet/efcore #37839). -
Microsoft.EntityFrameworkCore.Tools및Microsoft.EntityFrameworkCore.Tasks는더 이상Microsoft.EntityFrameworkCore.Design에 직접 의존하지 않습니다(dotnet/efcore #37837). -
EFOptimizeContextMSBuild 속성이 제거되었습니다. 프로젝트나 빌드 파이프라인에서 이 속성을 설정한 경우, 이를 제거하고 대신EFScaffoldModelStage및EFPrecompileQueriesStage속성을 사용하십시오(dotnet/efcore #37838). -
SqlVector속성은 더 이상 기본적으로 로드되지 않습니다. 애플리케이션에 벡터 값이 필요한 경우 명시적으로 투영하거나 로드하십시오(dotnet/efcore #37829). -
Preview 3에서는
Microsoft.Data.SqlClient가7.0.0으로 업데이트되었습니다. 공급자별 SQL Server 동작에 의존하는 경우 SqlClient 릴리스 노트를 검토하십시오(dotnet/efcore #37949).
버그 수정
-
예상되는 공급자 구성 없이 공간형 또는
HierarchyId유형이 사용될 때 오류 보고 기능이 개선되었습니다(dotnet/efcore #37733). -
속성의 백업 필드를 찾을 수 없는 경우 더 명확한 예외를 추가했습니다(dotnet/efcore #36720).
-
스칼라 투영 및 nullable-value-type
SetProperty람다에 대한ExecuteUpdate를수정했습니다(dotnet/efcore #37791,dotnet/efcore #37975). -
쿼리 변환 및 마이그레이션에서 여러 JSON 및 복합 속성 에지 케이스를 수정했습니다(dotnet/efcore #37823,dotnet/efcore #37855,dotnet/efcore #37965).
컨테이너 이미지
.NET 컨테이너 이미지에 서명 적용
이제 모든 .NET 컨테이너 이미지는Notary Project사양에 따라 Microsoft에서 암호학적으로 서명합니다.이미지 서명을검사하고 확인하는 방법에 대한 최신 문서는이미지 서명 문서를참조하십시오.
Notary CLI또는ORAS CLI를사용하여 서명 아티팩트에 대한 세부 정보를 확인하세요:
notation inspect mcr.microsoft.com/dotnet/sdk:11.0.100-preview.3 oras discover mcr.microsoft.com/dotnet/sdk:11.0.100-preview.3
