Application & Data Migration Blog Posts | GAPVelocity AI

What .NET 11 Preview 3 Means for Modernization Projects

Written by DeeDee Walsh | Apr 18, 2026 9:20:08 PM

Microsoft released .NET 11 Preview 3 this week, and while most coverage will focus on the developer-experience improvements, there are four changes worth flagging specifically for teams running or planning legacy modernization projects. Each one reinforces a pattern we've been tracking for years: the target platform keeps getting better, and the cost of staying on VB6, PowerBuilder, Access, or WebForms keeps getting higher.

C# Now Has Discriminated Unions

The headline feature for modernization work is C# union type support. After more than a decade of requests, C# finally gets the same sum-type expressiveness that F# developers have enjoyed since the language shipped. For codebases that lean on VB6's Variant, PowerBuilder's Any, or Clarion's loosely-typed return values, unions are the first clean way to translate those patterns into idiomatic modern C#.

This matters because the quality of modernized output has always been constrained by the expressiveness of the target language. When your legacy function returns "a record, or nothing, or an error message," translating to pre-union C# forced an awkward choice between exceptions, nullable wrappers, or custom result classes. Unions close that gap. We published a deeper technical walkthrough of this in our companion post, but the short version is that this is the most consequential change for VB6 and PowerBuilder modernization in any .NET release in recent memory.

Zstandard Compression Lands in ASP.NET Core and System.IO.Compression

Zstd is meaningfully more efficient than gzip and brotli at comparable CPU cost, better compression ratios, faster decompression, lower bandwidth bills. In .NET 11, it's now a first-class citizen in both the base compression library and the ASP.NET Core response compression pipeline.

For modernized applications deployed on Azure, this translates directly into lower egress costs and faster payloads. It's a small win in isolation, but on applications with hundreds of endpoints and millions of requests per day, it compounds. It's also the kind of ambient improvement that a rewrite-in-place team using the same legacy runtime simply doesn't get. Modernize to .NET 11, and your bandwidth bill gets better on its own.

Container Images Are Now Signed

Microsoft now publishes signed .NET container images by default. For any modernization project serving regulated buyers (healthcare, financial services, government) this is a vendor compliance checkbox that used to require additional tooling or process. Image provenance is increasingly a procurement gate, and being able to say "the modernized application ships as a signed container on a signed base image" is a trust signal that matters in security reviews.

If your modernization project is in flight and you haven't explicitly discussed supply-chain attestation with your target customers, this is a good moment to add it to the conversation. The capability is now there for free.

Runtime Async Is No Longer Behind a Preview Flag

Runtime async, the lower-level infrastructure that makes async/await faster and less allocation-heavy graduates out of preview-API status in .NET 11 Preview 3. In practical terms, modernized applications get incremental performance improvements on async-heavy workloads without any code changes, just by targeting the new runtime.

This is the story that runs through every .NET release: the platform itself keeps getting faster, and those improvements flow automatically to applications built on it. Legacy runtimes (the VB6 runtime, the PowerBuilder runtime, the Access runtime) are frozen. Every performance improvement Microsoft ships to .NET is a growing delta between "modernized" and "stuck."

The Underlying Pattern

Four improvements, one story. Each release of .NET widens the gap between the modern platform and the legacy platforms customers are still running. Unions make the target language more expressive. Zstd makes deployed applications cheaper to run. Signed containers make them easier to sell into regulated markets. Runtime async makes them faster.

For teams evaluating modernization, this is the argument that matters more than any individual feature: the is between "your application today" and "your application on a stack that keeps improving for free, every six months, indefinitely." That compound improvement is the real case for modernization and every .NET release makes it a little stronger.

.NET 11 ships in general availability later this year. For modernization projects in planning, it's worth targeting .NET 11 from the start. For projects already in flight on .NET 9 or .NET 10, the upgrade path is straightforward and the payoff keeps growing.