What Is New in .NET Core 3.0
.NET Core 3.0 is a major release focused on expanding the platform's capabilities for desktop and cloud applications. It introduces Windows Desktop support, significant performance gains, and a more complete set of platform APIs. This update makes .NET Core a viable and powerful option for a much broader range of applications.
| Category | Key Changes |
|---|---|
| New Features | Windows Desktop (WinForms, WPF), C# 8.0, .NET Standard 2.1, New JSON APIs, IoT Default Support |
| Performance | Improved JIT, Hardware Intrinsics, Garbage Collection, Tiered Compilation, HTTP/2 |
| Deployment | Single-File Executables, Docker Image Updates, Assembly Unloading |
| Security | Cryptographic Key Import/Export, TLS 1.3 & OpenSSL 1.1.1 on Linux |
| Deprecated | Some Windows Compatibility Pack APIs, Older Runtime Identifiers (RIDs) |
What desktop application support was added?
.NET Core 3.0 brings full support for building Windows Desktop applications using Windows Presentation Foundation (WPF) and Windows Forms (WinForms). This is a monumental shift, allowing these mature UI frameworks to run on the modern, cross-platform .NET Core runtime.
In practice, you can now create new WPF/WinForms projects that target .NET Core or migrate existing .NET Framework desktop apps. This unlocks the performance improvements, side-by-side deployment, and newer language features of .NET Core for a massive ecosystem of desktop software.
Which C# language features are included?
.NET Core 3.0 ships with full support for C# 8.0. This introduces several new ways to write cleaner, more expressive code. The most significant features are nullable reference types, async streams, and ranges/indices.
Nullable reference types help eliminate null reference exceptions by making nullability an explicit part of your type declarations. Async streams (IAsyncEnumerable<T>) allow you to asynchronously iterate over data streams. Ranges and indices provide a succinct syntax for slicing data.
// Async Streams
await foreach (var item in asyncStream)
{
Console.WriteLine(item);
}
// Ranges and Indices
string[] words = new string[] { "The", "quick", "brown", "fox" };
var subArray = words[1..^1]; // contains "quick", "brown"
How was performance improved?
The runtime and core libraries received substantial performance optimizations. The Just-In-Time (JIT) compiler got smarter with better inlining and code generation. Hardware intrinsics allow you to directly target CPU-specific instruction sets like SSE4 and AVX2 for extreme performance in numerical computing.
Tiered compilation is now enabled by default, which means the runtime can quickly compile methods and then recompile them with more optimizations if they are used frequently. Garbage collection was also tuned for better throughput, especially for large memory heaps common in server workloads.
What are the new deployment options?
You can now publish a truly single-file executable. This bundles all your application dependencies, including the .NET Core runtime itself, into one file that users can run directly. This simplifies distribution immensely.
Assembly unloading is now possible with the introduction of AssemblyLoadContext. This is crucial for scenarios like plugins or scripting, where you need to load and then unload code to free up memory. The official .NET Core Docker images were also updated to use .NET Core 3.0.
What new APIs are available?
The platform expanded its API set with the adoption of .NET Standard 2.1, adding thousands of new members. A new set of high-performance JSON APIs in System.Text.Json is introduced for serialization and deserialization, offering a modern alternative to Newtonsoft.Json.
Cryptography got a boost with support for importing and exporting asymmetric keys from various formats without a platform-specific X509Certificate. Support for TLS 1.3 and OpenSSL 1.1.1 on Linux enhances secure communication capabilities.
// New System.Text.Json APIs
var jsonString = JsonSerializer.Serialize(weatherForecast);
var weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString);
FAQ
Can I migrate my existing .NET Framework WPF app to .NET Core 3.0?
Yes, this is a primary goal of the release. You'll use a migration tool to update your project file and dependencies. Most code should work, but you'll need to test for APIs that were part of .NET Framework but not in .NET Core, potentially using the Windows Compatibility Pack.
Should I use System.Text.Json or stick with Newtonsoft.Json?
For new projects, System.Text.Json is a great default choice due to its performance and integration. For existing projects heavily invested in Newtonsoft.Json's feature set, a migration may not be immediately necessary unless you need the performance benefits.
What is the main benefit of single-file publish?
It dramatically simplifies application distribution. Instead of a folder full of DLLs and an EXE, you distribute one file. The executable extracts its contents to a temporary directory on first run, making it completely self-contained and easy for end-users to manage.
How do hardware intrinsics help my application?
They allow C# code to directly use processor-specific SIMD instructions (like those in SSE or AVX2). This can lead to massive performance gains in math-heavy, vectorized operations found in graphics, machine learning, and scientific computing, bringing C# closer to native code speeds for these tasks.
Is TLS 1.3 supported on Windows?
Yes, but with a caveat. .NET Core 3.0 adds support for TLS 1.3 on Windows 10 builds 19628 and later. On Linux, it's enabled when using OpenSSL 1.1.1 or later. The runtime will use the highest available protocol version negotiated between the client and server.