Will .NET 6 features bridge the gap between .NET frameworks?
Microsoft's original .NET Framework has come a long way, but will the new iterations of this framework be enough to convince developers to leave it behind?
Despite its age, Microsoft's .NET Framework continues to evolve to support its dedicated users. Meanwhile, a revamped version of the framework known as .NET Core has also developed a strong user base and portfolio of development capabilities designed for modern programming needs.
However, not all those entrenched with .NET Framework have made the jump to .NET Core, and the divide between those who stick with the old and those who embrace the new iteration of Windows development environments is significant. Now, with the release of .NET 6 in 2021, Microsoft seems to hope that new features will bridge that divide, mainly through performance improvements for cloud, desktop and mobile app development.
From .NET Framework to .NET Core
When .NET Framework was first released in 2002, it brought managed code to the Windows NT, 2000 and XP OSes. It was designed to improve development for Windows applications and web projects and offered support for several programming languages, including C#, C++ and F#. Over time and across nine major version releases, the number of languages that fell under the .NET banner grew.
In 2016, Microsoft released a new version of the framework, .NET Core, which featured a full redesign aimed at cross-platform development, including broader support for OSes and languages outside of the Microsoft realm. While it still supports older versions of the framework, Microsoft has steadily added features that it hopes will encourage developers to make the transition from .NET Framework to .NET Core.
Why .NET Framework still stands
.NET Framework primarily operates by providing functions based on an object-oriented approach. Applications written in a .NET Framework environment are typically based in C#. However, the framework also makes it possible to connect with OS-provided functions written in C, C++ and other widely used languages.
Despite its age, many developers continue to use .NET Framework to manage legacy applications that rely on features that aren't quite compatible with .NET Core. In certain instances, these applications are already heavily integrated with third-party libraries, NuGet packages, code access security or other legacy application domains. These applications might also rely on older tools associated with the .NET Framework portfolio, such as Visual Studio, ASP.NET Web Forms or the Common Language Runtime (CLR) VM.
CLR is a particularly important element of .NET Framework, since it handles every aspect of the application's overall execution. This includes a just-in-time (JIT) compiler that translates the language-specific code into local machine code at runtime, enabling the application to run in many different environments without compatibility errors. While .NET Core does possess its own version of CLR, known as CoreCLR, which comes with its own JIT compiler known as RyuJIT, there are many applications that are immovably embedded in and dependent on the original .NET Framework CLR.
The reasons for .NET Core
While .NET Framework was revolutionary when it was first introduced, developers stuck dealing with legacy application issues highlighted the need for an alternative like .NET Core that could add the development flexibility and dynamic deployment capabilities modern programmers demand.
To start, .NET Core provides cross-platform capabilities for not just Windows, but Linux and macOS as well. It also offers the scalability and high performance critical for running microservices applications. Additionally, by keeping code modular and lightweight, .NET Core simplifies things like container-based development, which is a fundamental part of distributed architectures, like microservices. For example, developers can deploy server apps to Linux Docker to reduce the number of servers and VMs they rely on, reducing costs and resource overhead requirements.
To provide flexibility, .NET Core includes mechanisms that help developers write an application once and deploy it uniformly across a system. This capability is particularly helpful when a web or service application needs to run on multiple operating platforms, whether Windows, Linux or macOS. Developers using .NET Core do also have an opportunity to employ extensions that somewhat mimic .NET Framework capabilities, such as the Visual Studio Code extension, as well as third-party extensions, such as Sublime Text and Emacs.
When using containers to develop microservices applications, the smaller image size of .NET Core containers makes them easier to deploy, debug, update and manage. With the framework's cross-platform capabilities, developers can deploy server apps to Linux Docker containers using their on-premises Linux/Windows infrastructures or deploy containerized applications in the cloud using a specific service, such as Azure Kubernetes Service.
The emergence of .NET 6
Along with Android, iOS and macOS integrations, .NET 6 features new runtime optimizations, cloud diagnostics tools, and improvements aimed at C# 10 and F# 6. These language improvements are particularly helpful, as they help simplify code generation processes, like data type declarations and embedding lambda expressions. For example, C# 10 offers directives and file-scoped namespaces that help reduce the amount of boilerplate code developers are forced to write. Additionally, those who work in F# 6 can accelerate debugging by employing a new collection of list and array expressions.
Here are some of the other standout .NET 6 features:
- integrations for Android, iOS and macOS application development;
- native support for ARM64 mobile architecture and Apple silicon;
- a profile-guided optimization system that enables a JIT compiler to automatically optimize executed code;
- improved support for popular tools, like WebAssembly, dotnet monitor and OpenTelemetry; and
- new APIs designed to assist with HTTP/3 communication processes, JSON configuration data processing and direct manipulation of memory.
Does .NET 6 bridge the divide?
The new features in .NET 6 were added with the intention of meeting the next stage of technology innovation, where developers will increasingly employ microservices architectures, software-defined networks, more powerful processors and data-rich systems, such as IoT and 5G. In a somewhat symbolic move, the Core moniker was removed from the framework's name, seemingly in an effort to illustrate Microsoft's desire for this release to bring new levels of unification to the entire .NET community.
As for eliminating reliance on earlier iterations and releases of Microsoft's development framework, .NET 6 goes further than any previous version in terms of offering tools and features ready for new paradigms of cloud, desktop and mobile development. This is all underlined, of course, with the traditional support from Microsoft that other users of the framework enjoy.
Of course, the last thing to do is rush into adoption. Development teams and architects need to carefully consider the pros and cons of whether it's worth making the jump to .NET 6. Users of .NET Framework specifically need to consider the legacy application support and embedded component issues that kept them from moving to .NET Core in the first place and whether .NET 6 provides the delicate transition they need. Users of .NET Core likely won't run into quite as many backward compatibility issues, but it's still a possibility to keep in mind.