Since the announcement of .NET Core there’s been confusion around what that means for Portable Class Libraries, runtime support, NuGet support and how these “new” libraries relate to the existing PCLs. At least I was confused.
As ASPNet 5 started taking shape, we started hearing about new target frameworks for NuGet, like
dnxcore50. Other posts mentioned that the new Windows 10 Universal Windows Platform (UWP) would be using the new .NET Core 5 libraries too, but that lead to the question, what do we call it in NuGet?
dnxcore5 is clearly the wrong one as that refers to the Dotnet Runtime Environment.
Current NuGet conventions don’t make things any more clear. Today we have the following target framework names:
- Win Windows 8 and Windows 8.1
- Net .NET Framework
- Wpa Windows Phone App 8.1
- NetCore Also refers to Windows 8 and 8.1
- NetCore and Win are used interchangeably and are the same
So far, NuGet has added the following over the course of ASPNet vNext:
- dnx The Dotnet Runtime Environment for the .NET Framework
- dnxcore The Dotnet Runtime Environment for the .NET Core CLR
Over the past few days, it seems like the .NET Core team has been busy updating the target names to change from
dnxcore5 to something new called
dotnet. More confusion to ensue.
Brice Lambson was kind enough to explain it this afternoon and it finally all makes sense, so here is (don’t take this as official advice!) my current understanding. The new world distinguishes between the platform (.NET Framework/CoreCLR) and the app model (desktop/aspnet/UWP) cleanly.
- dotnet This is the new .NET Core for packages that don’t have any app model requirements.
- net Existing .NET Framework platform
- netcore For UWP apps, based on
dotnetplus app model specifics
- dnx ASPNet apps based on the .NET Framework
- dnxcore ASPNet apps based on the .NET Core framework
These are the targets you’ll most likely care about going forward. Most libraries will want to target
dotnet to hit the widest range of consuming apps.
dotnet will run on the .NET 4.6 Framework. If you need specific UWP functionality (like XAML in your library), then you’ll need
netcore5. If you need AspNet specific items, then you’ll need
dnxcore5. If you need something that’s only part of the full .NET Framework, then you’ll need either
This ties into the existing PCL structure by being a new platform. Today you have libraries that support multiple platforms like this
portable-net45+netcore45+wpa81. If you want to also include
dotnet, then it simply becomes
portable-net45+netcore45+wpa81+dotnet. If you can afford to target just Windows 10, .NET 4.6 and ASPNet 5, then having the older platforms severely limits your available surface area. In that case, better to target just
dotnet, which can then be consumed by all of the modern platforms.
What does this all mean?
The table below should help explain things. The columns represent target frameworks and the rows are platforms/apps. That is, if your library targets x it’ll run on y.