What Is New in .NET 11
| Category | Item |
|---|---|
| New Features |
Runtime-native async (Runtime Async) - runtime-level async state machine support with cleaner stack
traces C# 15 collection expression arguments Zstandard compression in System.IO.CompressionJsonNamingPolicy.PascalCase and per-member naming policy overrides in
System.Text.Jsondotnet sln can now create and manage solution filter files (.slnf) from the CLIdotnet run -e flag for passing environment variables directly on the command lineSafeFileHandle pipe-type reporting and anonymous pipe creationRandomAccess read/write on non-seekable handlesTar archive format selection ASP.NET Core native OpenTelemetry semantic attributes on HTTP server activity Blazor EnvironmentBoundary component for conditional rendering by hosting
environmentIHostedService support in Blazor WebAssemblyEF Core GetEntriesForState API on ChangeTrackerWSL automatic HTTPS dev-cert trust via dotnet dev-certs https --trustNew Arm SVE2 JIT intrinsics |
| Improvements |
JIT: bounds check elimination for index-plus-constant patterns and index-from-end access JIT: redundant checked arithmetic context removal JIT: switch expression folding into branchless checks WebAssembly: WebCIL payload loading and improved debugging symbols WebAssembly: float[], Span<float>, and
ArraySegment<float> marshaling improvementsDebugger can now step through await boundaries in runtime-async methods correctlySDK installers on Linux and macOS reduced by ~140 MB (816 duplicate files replaced with symlinks) dotnet watch integrates with Aspire app hosts, auto-relaunches after crashesMatrix4x4 performance improvement in numericsRegexOptions support for all Unicode newline sequencesNew String Rune-based operations; BFloat16 support in
BitConverterCRC32 validation when reading ZIP entries; new methods for ZIP archive entries Blazor Virtualize<TItem> now measures actual item heights at runtime instead of
assuming uniform heightKestrel starts processing HTTP/3 requests without waiting for the control stream CA1873 analyzer false-positive rate reduced for property accesses and common method calls F# parallel compilation enabled by default; faster computation expression compilation |
| Breaking Changes |
Minimum hardware requirements raised to x86-64-v2 (SSE4.1/SSE4.2 required); Windows Arm64 now
requires LSE SDK no longer auto-configures Mono launch target for .NET Framework apps on Linux Virtualize<TItem>.OverscanCount default changed from 3 to 15Microsoft.AspNetCore.OpenApi updated to OpenAPI 3.2.0 (breaking changes from upstream
Microsoft.OpenApi)ASP.NET Core Identity switches from DateTime/DateTimeOffset to
TimeProvider
|
What Is Runtime Async and Why Does It Matter for Async-Heavy .NET Apps?
Runtime Async is the single biggest architectural shift in .NET 11: the runtime itself now understands async
methods as a first-class concept, taking over work that the C# compiler has been doing alone since C# 5. Before
this change, every async method was lowered by the compiler into a state machine struct that
manually tracked suspension points. That worked, but it left the runtime blind to the logical flow of async
execution - which is exactly why await-heavy stack traces have always looked like garbage in the
debugger.
With Runtime Async, the CLR owns the suspend/resume cycle. Breakpoints now bind correctly inside async methods,
and the debugger can step through await boundaries without falling into compiler-generated
infrastructure you never wrote. In practice, this alone will save a meaningful amount of time for anyone
debugging production issues in async microservices.
Starting with Preview 3, you no longer need
<EnablePreviewFeatures>true</EnablePreviewFeatures> to use Runtime Async when targeting
net11.0. NativeAOT and ReadyToRun are also supported. To opt in on an earlier preview or for a
non-net11.0 target, add both flags:
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<Features>$(Features);runtime-async=on</Features>
</PropertyGroup>
Think of Runtime Async as the runtime finally learning to read the same code you wrote, rather than squinting at a compiler translation. The performance gains are real too - fewer allocations per async call and lower overhead on the hot path. This is the change that will compound across every web app, background service, and gRPC endpoint you deploy on .NET 11.
What JIT Improvements Ship with .NET 11 and Will You Actually Feel Them?
The JIT in .NET 11 is meaningfully smarter about removing work it can prove is unnecessary, and the gains show up without any code changes on your part. Here are the four areas worth knowing:
| Optimization | What It Does | Who Benefits |
|---|---|---|
| Bounds check elimination | Drops redundant checks for i + cns < len patterns and values[^1]-style
index-from-end access |
Any tight loop over arrays or Span<T> |
| Redundant checked context removal | Proves and eliminates overflow checks when the value is already in range | Numeric-heavy code, parsers, serializers |
| Switch expression folding | Folds multi-target switch expressions into branchless constant checks (e.g.,
x is 0 or 1 or 2 or 3 or 4) |
Pattern-matching-heavy code; state machines |
| Arm SVE2 intrinsics | New SIMD intrinsics for Scalable Vector Extension 2 on supported Arm64 hardware | Data processing workloads on Arm64 servers |
Most teams running on x64 cloud hardware will see the bounds check and switch folding improvements automatically
in their next benchmark run. The Arm SVE2 intrinsics are relevant if you are running on newer AWS Graviton or
Azure Ampere instances. None of these require a code change - just retarget to net11.0 and
recompile.
What Did the SDK Team Actually Ship in .NET 11 for Day-to-Day Developer Workflow?
The SDK changes in .NET 11 are the kind you notice in the first hour after installing. Three of them are genuinely useful in regular development loops.
Smaller installers on Linux and macOS
The SDK installer now deduplicates assemblies using symbolic links, replacing 816 duplicate files (140 MB on Linux x64) with symlinks pointing to a single copy. The archive drops significantly as a result. If you run automated CI installs on Linux, this is an immediate win. Windows deduplication is planned for a future preview.
Pass environment variables to dotnet run
You can now pass environment variables inline with dotnet run instead of exporting them to the
shell first:
dotnet run -e ASPNETCORE_ENVIRONMENT=Development -e LOG_LEVEL=Debug
These are available to MSBuild as RuntimeEnvironmentVariable items. For anyone who has been
sourcing a .env file just to flip an environment before running locally, this removes that
ceremony.
Solution filter management from the CLI
dotnet sln can now create and edit .slnf solution filter files directly, using the
same subcommands you already know:
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
In large monorepos this is a real quality-of-life improvement. You no longer need to hand-edit JSON or open
Visual Studio just to adjust which projects load. The dotnet watch tooling also gains Aspire
app-host integration and automatic crash recovery in Preview 3, which makes local Aspire development loops
noticeably less brittle.
What Breaking Changes in .NET 11 Actually Require Migration Work?
Most .NET 11 breaking changes are narrow, but two of them can catch you off guard depending on your deployment target and library choices.
Minimum hardware requirements raised
The most broadly impactful change is the updated minimum hardware floor. On x86/x64, .NET 11 now requires the x86-64-v2 instruction set (SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT). On Windows Arm64, LSE is now required. In practice, any CPU still officially supported by Intel, AMD, or the Windows operating system already satisfies this. Chips that fall outside that range went out of support around 2013. If you run .NET on genuinely old hardware or unusual embedded targets, verify before upgrading.
Mono launch target removed for .NET Framework on Linux
The SDK no longer auto-configures RunCommand and RunArguments to use Mono when you run
dotnet run on a .NET Framework project targeting Linux. This is a behavioral change with a clear
workaround - set those properties explicitly in your project file - but it will silently break any pipeline that
relied on the old automatic behavior. Mono ownership has moved on, and the .NET SDK is making that separation
official.
ASP.NET Core and library changes to watch
Virtualize<TItem>.OverscanCountdefaults from 3 to 15. Blazor apps that relied on the old default for layout calculations may see scrolling behavior change.Microsoft.AspNetCore.OpenApinow targets OpenAPI 3.2.0 viaMicrosoft.OpenApi 3.3.1, which has upstream breaking changes. Review the Microsoft.OpenApi upgrade guide before updating API doc generation code.- ASP.NET Core Identity moves all time-based logic to
TimeProvider. Custom token providers or test harnesses that hook intoDateTime.UtcNowdirectly will need updating.
What Did .NET 11 Add to System.Text.Json and the Base Class Libraries?
The library additions in .NET 11 are focused rather than sprawling - a few genuinely useful APIs rather than a kitchen-sink expansion.
System.Text.Json gets three worthwhile improvements. First,
JsonNamingPolicy.PascalCase is now built in, which is useful when you are generating JSON for
systems that expect PascalCase rather than the camelCase default. Second, you can now apply a naming policy at
the individual member level rather than only at the type level, which handles the case where one field in a
contract has to match an external convention the rest of the type does not use. Third, type-level ignore
conditions let you annotate a type to control which members are included or excluded globally.
Compression gains two practical additions. Zstandard (zstd) lands in
System.IO.Compression as a first-class codec alongside GZip and Brotli - no more pulling in a
third-party NuGet package for zstd support. ZIP entry reading now validates CRC32 on extraction, which catches
corrupted archives that previously would silently produce bad data.
Low-level I/O fills a couple of gaps: SafeFileHandle can now report whether a
handle refers to a pipe and can create anonymous pipes, and RandomAccess gains read/write support
for non-seekable handles. These are plumbing APIs, but the teams building cross-platform process interop or
custom I/O layers will know exactly where they fit.
Strings and numerics round things out with Rune-based operations on String (useful
for correct Unicode text processing), BFloat16 in BitConverter (relevant for ML
inference pipelines that work with 16-bit brain float), and a Matrix4x4 performance improvement
that benefits any graphics or physics code running on the BCL types.
Common Questions about .NET 11
Do I need to change my project file to use Runtime Async in .NET 11 Preview 3 and later?
No,
if your project targets net11.0, Runtime Async is available without setting EnablePreviewFeatures. You only need
the extra project property flags when targeting an earlier framework moniker or working with Preview 1 or
Preview 2 builds.
Will my app fail to start on existing server hardware after upgrading to .NET 11?
Only if you
are running on CPUs that predate SSE4.2 or POPCNT support, which means chips that went out of official Intel and
AMD support around 2013. Any hardware running Windows 10 or later, or any current cloud VM (x64 or Arm64),
already meets the new baseline. If .NET 11 cannot start on a machine, it prints a message listing the missing
instruction sets so you know exactly what is missing.
How do I pass environment variables to my app with dotnet run in .NET 11?
Use the new -e flag
once per variable: dotnet run -e ASPNETCORE_ENVIRONMENT=Development -e MY_KEY=value. These are passed directly
to the process and also exposed to MSBuild as RuntimeEnvironmentVariable items, so you do not need to export
them to your shell session or source a separate env file beforehand.
Does the Blazor Virtualize component change break existing scroll behavior in .NET
11?
Potentially yes. The OverscanCount default changed from 3 to 15, and the component now
measures actual item heights instead of assuming they are uniform. If your virtualized list relies on items all
being the same height, the new behavior is more accurate but may produce different scroll positions than before.
Test any virtualized list after upgrading.
Is .NET 11 a Long-Term Support release?
No, .NET 11 is a Standard Term Support release,
meaning it receives 18 months of support from the general availability date rather than the 3 years offered by
LTS releases such as .NET 10. Teams that need longer support windows should stay on .NET 10 LTS and plan to
adopt .NET 12 LTS when it arrives.
What does the OpenAPI 3.2.0 change in ASP.NET Core 11 require from me?
If you call AddOpenApi
in your app, review the Microsoft.OpenApi 3.3.1 upgrade guide before updating, because the upstream library
introduced breaking changes when moving from 2.x to 3.x. To generate an OpenAPI 3.2.0 document you must
explicitly set the version: builder.Services.AddOpenApi(options => { options.OpenApiVersion =
Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_2; }). Apps that do not call AddOpenApi are unaffected.