Microsoft’s second release candidate of .NET 5 arrived October 13, bringing the merger of .NET Framework and .NET Core one step closer to completion. The new unified .NET platform is due for general availability November 10, 2020.
Microsoft describes Release Candidate 2 as a near-final release and the last of two RCs. An initial RC was published on September 13. The .NET 5.0 release candidate can be downloaded from dotnet.microsoft.com.
High-level goals for .NET 5 include providing a unified .NET SDK experience, with a single BCL (base class library) across all .NET 5 applications, and with support for both native and web applications across multiple operating systems. A single .NET 5 native application project would support targets such as Windows, Microsoft Duo (Android), and Apple iOS using native controls on those platforms.
Additional goals of .NET 5 include support for building high-performance cloud applications, faster algorithms in the BCL, better support for containers in the runtime, and support for HTTP3. .NET 5.0 includes support for the WebAssembly binary format, via the Mono runtime and .NET libraries. A set of nullable reference type annotations also is featured.
.NET 5 also promises to allow developers to automatically find latent bugs in code. Other new features include the Half type, a binary floating-point that occupies 16 bits, and assembly trimming, which trims unused assemblies to reduce the size of applications. Customized trimming is highlighted, as well. New pattern matching in C# 9 covers relational, logical, and simple type patterns. The ClickOnce deployment option is now supported for .NET 5.0 Windows apps and .NET Core 3.1 apps.
.NET 5 Journey
Preview 1, released March 16, included regular expression performance improvements as well as code quality enhancements in RyuJIT.
Specific enhancements in .NET 5 preview 2, released April 2, included:
- A number of changes have been made to RyuJIT to improve the quality of the machine code generated, including duplicate zero initializations being eliminated more aggressively and nullable box optimizations invoked earlier.
- Server garbage collection on different threads now can work-steal while marking gen0/1 objects held live by older generation objects. Work stealing across threads shortens ephemeral GC pauses for scenarios where some GC threads took much longer to mark than others. In addition, part of the Pinned Object Heap (POH) feature has been implemented, the part internal to garbage collection, to allow the collector to manage pinned objects separately. This avoids the negative effects of pinned objects on generational heaps.
Enhancements in .NET 5 preview 3, unveiled April 23, include the following:
- The BitArray class for managing an array of bit values was updated to include a hardware-accelerated implementation for ARM64 using ARM64 intrinsics. BitArray performance improvements are significant, Microsoft said. In addition, On Stack replacement (OSR) in the CLR was implemented to allow code executed by currently running methods to be changed in the middle of method execution, while those methods are active “on stack.” This capability, to improve performance characteristics of tiered compilation, is now an experimental, opt-in feature on x64. Another enhancement for RyuJIT improves code quality for structs as arguments in “tail call” position calls. RyuJIT also is expected to offer better performance of generics.
- The addition of support for preserving references was added to System.Txt.Json, enabling reference loop handling for JSON serialization. Also, immutable classes and structs are now supported for JsonSerializer. Also supported now is null value handling.
- The .NET SDK now will auto-reference the NETFramework.ReferenceAssemblies NuGet package given a .NET Framework target framework in a project file. This change enables the building of .NET Framework projects on a machine without a .NET Framework targeting pack installed. This improvement is specific to targeting packs and does not account for other possible project dependencies.
.NET 5 Preview 4, released on May 19, introduced the following new capabilities:
- C# 9 and F# 5 language support.
- Improved performance of tailcalls used by F#.
- Improved performance of ToUpperInvariant, string.ToLowerInvariant, and related patterns.
- Improved HTTP 1.1 and HTTP 2 performance.
- An improved call counting mechanism.
- Dynamic expansion of the internal generic dictionary to eliminate performance cliffs hit by generic code.
- A pinned object heap to reduce heap fragmentation.
- Single file applications based on a new single file publishing type that executes an application from a single binary.
.NET 5 Preview 5, released June 10, contains the following new features:
- The RyuJIT JIT compiler has a faster, portable implementation of tailcall helpers. The JIT asks the runtime for help whenever it realizes it will need a helper to perform a tailcall. Also for RyuJIT, there has been continued progress in the ARM64 hardware intrinsics implementation. Other improvements in the RyuJIT involve better speed in a case that was affecting regular expression compilation and improved Intel architecture performance.
- Exports for native binaries with calls into .NET code have been enabled. The building block of this capability is hosting API support for UnManagedCallersOnlyAttribute. The native exports project enables exposing of custom native exports. It does not require a higher-level interop technology like COM and is cross-platform.
- DirectoryServices.Protocols support is being expanded to Linux and MacOS.
- The Alpine 3.12 Linux distribution now is supported.
.NET 5 Preview 6, released June 25, removed built-in support for WinRT (Windows Runtime), a collection of APIs for building Universal Windows Platform applications. This is a breaking change; .NET Core 3.x apps using WinRT must be recompiled. The .NET and Windows teams have been working to change the way WinRT works with Windows, replacing WinRT support with the C#/WinRT toolchain in .NET 5. C#/WinRT is a NuGet-packaged toolkit offering WinRT projection support for C#.
Other changes in .NET 5 Preview 6:
A bulletin pertaining to Preview 7, which arrived July 21, acknowledges about 250 performance-oriented pull requests in .NET 5 and notes that a pleasant surprise is in store for those who have followed .NET Core performance.
Other additions and improvements noted in the .NET 5 Preview 7 bulletin:
- The new System.text.json JSON API provides the ability to ignore default values for value-type properties when serializing, useful for reducing serialization and wire costs. This is a breaking change. Also added for System.text.json is the ability to deal with circular references when serializing, with API shape now expected to be final.
- Garbage collection now exposes detailed data on the most recent collection, using the GetGCMemoryInfo method, which returns a GCMemoryInfo struct. GCMemoryInfo serves information about machine and heap memory and the most recent collection, or the most recent collection of the kind of GC specified — ephemeral, full blocking, or background. The most likely use cases for this API are logging/monitoring or to indicate to a load balancer that a machine should be taken out of rotation to request a full GC. Another GC change, meanwhile, was made to defer the expensive reset memory operation to low-memory situations.
- Ryujit, the assembly code generator for .NET, gains enhancements ranging from enabling the eliding of some bounds checks to tail duplication improvement and improvements for removal of redundant zero inits. Also featured in Ryujit are ARM64 hardware intrinsics and API optimization.
What is next?
.NET 5.0 will be released in November of 2020 which is just over a year since .NET Core 3 had been released. This signifies a yearly trend of .NET major releases which give further strength to the .NET platform as a development tool of the future.
After .NET 5 (2020+) Microsoft have confirmed that they are planning a full new release of .NET very year in the month of November for the foreseeable future. This includes a Long-Term Support (LTS) version every other year starting with .NET 6.0 in 2021. You should get at least three years of security updates and bug fixes for that time. See image below for the .NET schedule.