There’s a lot of conflicting information about .NET online. Old articles mix up .NET Framework with .NET Core, outdated tutorials reference syntax that no longer reflects how modern C# works, and the version numbers add another layer of confusion. This article cuts through all of that.
What is .NET?
.NET is an open-source platform for building virtually any type of application - console, Windows desktop, fully cross-platform, high-performance, cloud-native, games, mobile, and AI-driven applications.
It was developed by Microsoft and first released in 2002 under the name .NET Framework. At that time it was Windows-only.
How it got to where it is today
In 2016, Microsoft released .NET Core - a focused effort to make .NET cross-platform, enabling it to run on Windows, macOS, and Linux. .NET Core was a significant step forward, but it initially didn’t include everything that .NET Framework offered. The two platforms existed in parallel, each covering different ground.
Microsoft’s stated long-term goal was always a single unified platform. That arrived in 2020 with .NET 5 - the first release that brought together the capabilities of both .NET Framework and .NET Core under one unified framework.
.NET Framework still exists and is still maintained, but it is no longer the focus of new development. It’s kept alive for legacy applications.
Starting with .NET 6, the unified platform dropped the “Core” name entirely. Today it’s simply called .NET, followed by a version number - .NET 9, .NET 10, .NET 11, and so on.
SDK vs Runtime
So how do you work with .NET? Well, there are two things you install depending on what you need:
The .NET SDK is for building applications. It includes the language compilers, the .NET runtime, and the command-line tools required for development.
The .NET Runtime is for running applications that have already been built. If you’re deploying an app to a server and don’t need to compile anything there, the runtime is all you need. It handles garbage collection, error handling, and security - freeing developers from low-level concerns so they can focus on writing code.
Languages and how code gets compiled
.NET supports several high-level programming languages, C#, F#, and others, with C# being by far the most widely used.
Here’s what happens when you write and run your code:
- Your source code is compiled by a language-specific compiler (C# compiler compiles your C# code, F# compiler compiles your F# code, and so on).
- All of these compilers produce the same output: IL (Intermediate Language). This is a common or universal, platform-agnostic code that all .NET languages compile down to. This step is called compile time.
- When you run the application, the .NET Runtime takes the IL and converts it into native machine code that your system can actually execute. This step is called runtime. Depending on the type of application, the runtime uses either JIT (Just-In-Time) compilation, translating IL as the program runs, or AOT (Ahead-Of-Time) compilation, which produces native code before the application starts.
The IL model is what makes .NET language-agnostic. A library written in F# can be consumed from C# because both compile to the same common format.
Release cycle: LTS and STS
Since .NET Core, Microsoft has followed the Modern Lifecycle Policy - frequent releases with predictable schedules. A new major version ships every November: .NET 8, .NET 9, .NET 10, and so on.
Each major release falls into one of two tracks:
LTS (Long-Term Support) - supported for 3 years. Recommended for production applications where stability matters more than accessing the latest features.
STS (Standard-Term Support) - supported for 1.5 years. Recommended for developers who want to try new features sooner and are comfortable updating more frequently.
Tooling
When it comes to writing .NET code, two tools stand out:
Visual Studio Code works on Windows, Linux, and macOS. It’s a great choice for lightweight to medium-scale apps, and its extension ecosystem can bring it closer to behaving like a full IDE experience while keeping it cross-platform.
Visual Studio is the preferred option for enterprise-grade applications. It offers more capabilities without adding extensions, but is only available on Windows.
How modern C# has simplified getting started
In the early days of .NET, even a Hello World program meant creating a solution, a project, and a C# file - all before writing a single line of your own code.
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
Modern C# removes the unnecessary boilerplate. Two features making this possible are Top-level statements, introduced in .NET 5, which removes the need for a Program class and Main method and File-based apps, introduced in .NET 10, which goes further - by letting you avoid the effort of creating a solution or project file at all. All you need is a single .cs file to write your code, and that’s it!
Console.WriteLine("Hello World!");
You can run it directly from the command line:
dotnet run app.cs
When your application grows and needs better organization (you need a project or multiple projects with a solution), you can convert it into a full project with a single command:
dotnet project convert app.cs
Modern C# syntax has followed the same direction across the board. For example features like collection expressions and the spread operator let you express things that used to require writing for loops and more, in a much cleaner and declarative style. The code is shorter and more readable, which is great for maintenance.
The takeaway
It all started from .NET Framework. .NET Core was the effort toward cross-platform and finally modern .NET (beginning with .NET 5) - is where active development is happening. If you’re starting today, you’re starting with the best version of this platform that has ever existed - so enjoy and happy coding!