This post is part of C# Advent organized by @mgroves.

A Brief History of “.NET Core”

‘Twas a holiday season, so bright and so clear,
When .NET Core was a name we held dear.
Once, it meant Silverlight, in the browser’s embrace,
A vision of apps that could run with great grace.

But as time moved on, so too did the trend,
Silverlight’s reign began to descend.
Then WinRT arrived, all shiny and new,
With Windows Store apps, the promise it grew.

Next came UWP, a universal dream,
For apps that could run on each Windows stream.
Yet, despite all the progress, something was amiss,
The tech world was changing, and something we’d miss.

Then .NET Core rose, its name now aglow,
A shift to the future, a new path to go.
It wasn’t just Windows, it reached far and wide,
Cross-platform magic, no longer confined.

Gone were the days of Silverlight’s reign,
No more WinRT to tether and chain.
UWP too, was a chapter now closed,
But the legacy of .NET still brightly glowed.

Now .NET Core means something profound,
A modern framework that’s world-renowned.
It’s cloud, it’s mobile, it’s web all combined,
A platform so nimble, for all to find.

So here’s to the future, to the journey ahead,
With .NET Core, new dreams are now spread.
We celebrate Christmas, not just for the cheer,
But for how far .NET has come through the years!

ChatGPT, of course. I couldn't write this.

I thought today would be a fun time to write up something I’ve been meaning to write for years: the history of “.NET Core” terminology.

More specifically, this is how I’ve seen the term “.NET Core” used in the past. It’s not guaranteed to be correct, and certainly not guaranteed to be complete! Am I missing anything? Feel free to shout out in the comments!

.NET Compact Framework

I believe I first heard the term “.NET Core” referring to the .NET Compact Framework. This was way back when .NET Framework 3.5 was the new hotness. Actually, that was “.NET Framework 3.5 SP1” - as in “Service Pack 1”. Yes, .NET used to have service packs.

I’m not sure if “.NET Core” was the proper term to refer to NetCF or not. AFAIK, it was an unofficial term that was applied because .NET Compact Framework contained a small subset of the (massive) .NET Framework, intended to run on embedded devices. Hence, it was a “core” (minimal) framework.

Silverlight, WinRT, Windows Phone, Windows Store, and Universal Windows Platform

Perhaps I should have put a trigger warning on this article… Sorry for anyone who winced in pain just reading the title for this section…

All of these technologies had something or other to do with “.NET Core” as a term. They were all minimal sub-frameworks of the full .NET Framework. And at least some of them had similar terminology for their runtimes (e.g., Silverlight ran on “Core CLR”). My brain has mercifully purged the sordid details. I only vaguely remember Windows Phone being different from Windows Phone Apps, and Silverlight getting even more stripped-down to run on Windows Phone.

This was not a fun time to be a library developer.

netcore as a Target Framework Moniker

This is what I actually want to focus on. Target framework monikers (TFMs) are very important to library developers.

The term “.NET Core” officially entered the NuGet space as a TFM, but it wasn’t for what we call .NET Core today. It was for Windows Store apps (and WinRT apps), and briefly extending into UWP apps.

Yes, Windows Store projects way back in Windows 8.0 (as well as WinRT) used a TFM identifier of netcore45. Windows 8.1 used netcore451. When Windows Store apps were replaced by Universal Windows Platform (UWP) apps, they briefly used netcore50 before changing to uap10.0.

So, when the (modern) .NET Core team needed a TFM, they found netcoreNN wasn’t available. I assume this is why they went with netcoreappNN instead (after a brief foray into dnxcore50 and aspnetcore50). So .NET Core TFMs for older versions (1.0-3.1) are netcoreapp1.0 - netcoreapp3.1. It was just an unfortunate accident of history.

No More .NET Core

The .NET team has dropped “Core”. There is now one .NET moving forward - a great relief to library authors!

Since v5, the TFMs have even changed: modern .NET uses net9.0 and similar, dropping the “core” moniker even from the TFM.

I still refer to .NET as “.NET Core” from time to time, especially in conversations that have to do with both .NET Framework and the new .NET. E.g., I’ll refer to a “.NET Core migration” rather than just “.NET migration” for a project currently targeting .NET Framework. The proper term, though, is no longer “.NET Core” but just “.NET”.

“.NET Core” is gone. And good riddance!

May the future be One .NET, and I wish you all joy in this Christmas season!