.NET vs .NET Framework vs .NET Core vs .NET Standard — what's what in 2026?
.NET Framework is the original Windows-only runtime. Its final version is 4.8.1 and it gets maintenance fixes only, supported as a component of Windows. .NET Core (1.0–3.1) was the cross-platform, open-source rewrite. From version 5 it dropped "Core" and became just .NET, with a new release every November. .NET 10 is the current LTS (November 2025 to November 2028). .NET Standard is not a runtime. It is an API specification that let one library run on several runtimes. It is frozen at 2.1, and today only netstandard2.0 still matters, for libraries that must also run on .NET Framework.
Two runtimes and one contract
The names are confusing because Microsoft reused the ".NET" brand for very different things. A simple way to sort them: there are two runtime families (the legacy Windows-only .NET Framework and the modern cross-platform .NET) plus one specification (.NET Standard) that defined an API surface both could implement.
| Name | What it is | Platforms | Status in late 2026 | Example TFM |
|---|---|---|---|---|
| .NET Framework 1.0–4.8.1 | Original runtime + BCL + ASP.NET (System.Web), WCF, WPF, WinForms | Windows only | Maintenance only, supported with the Windows lifecycle. No new features | net48, net481 |
| .NET Core 1.0–3.1 | Cross-platform, open-source rewrite, side-by-side installs | Windows, Linux, macOS | All versions out of support (3.1 ended December 2022) | netcoreapp3.1 |
| .NET 5+ (".NET") | The continuation of .NET Core, renamed. One platform for web, cloud, desktop, mobile | Windows, Linux, macOS, Android, iOS, WebAssembly | .NET 10 LTS is current. .NET 8 and 9 both reach end of support on November 10, 2026. .NET 11 (STS) ships November 2026 | net10.0, net10.0-windows |
| .NET Standard 1.0–2.1 | A versioned API contract (a reference assembly), not a runtime | Any runtime that implements it | Frozen. No versions after 2.1 | netstandard2.0 |
How we got here
flowchart LR NF[".NET Framework 1.0 to 4.8.1 - Windows only"] NC[".NET Core 1.0 to 3.1 - cross-platform"] N5[".NET 5 - Core renamed, 2020"] N8[".NET 8 LTS"] N9[".NET 9 STS"] N10[".NET 10 LTS - Nov 2025"] N11[".NET 11 STS - Nov 2026"] NS[".NET Standard 2.0 - shared API contract"] NC --> N5 --> N8 --> N9 --> N10 --> N11 NS -.->|"implemented by"| NF NS -.->|"implemented by"| NC NS -.->|"implemented by"| N10
In 2016 Microsoft could not make .NET Framework cross-platform without breaking millions of Windows apps, because it is installed machine-wide, updated in place and tied to Windows (IIS, the registry, COM). So it built .NET Core alongside it: modular, side-by-side, open source and much faster. When Core 3.1 had absorbed most of what people needed (including WinForms and WPF on Windows), the next release was called .NET 5. "Core" was dropped to signal that this is now the .NET. Version 4 was skipped to avoid confusion with .NET Framework 4.x. ASP.NET Core and EF Core kept the "Core" suffix to tell them apart from ASP.NET 4.x (System.Web) and Entity Framework 6.
.NET Framework: what it still is, and what it isn't
.NET Framework 4.8.1 is the last version. Since 4.5.2 it has been defined as a component of Windows, so 4.6.2 through 4.8.1 are supported for as long as the Windows version they run on is supported. You get security and reliability fixes, but no new APIs, runtime features or performance work. Several technologies were never ported to modern .NET:
- ASP.NET Web Forms and the
System.Webpipeline (replaced by ASP.NET Core, Razor Pages and Blazor). - WCF server (the community CoreWCF project fills part of the gap; gRPC is the usual replacement). Windows Workflow Foundation.
- AppDomains (only one exists in modern .NET; use
AssemblyLoadContextfor isolation), .NET Remoting and Code Access Security.
Large Framework apps are usually migrated incrementally (strangler fig): a new ASP.NET Core app sits in front, uses YARP to forward not-yet-migrated routes to the old app, and takes over endpoints one by one. System.Web adapters share session and authentication in the meantime.
Modern .NET: cadence, support and deployment
- Yearly releases every November. Even-numbered versions are LTS (3 years of support). Odd-numbered ones are STS, which now get 2 years (extended from 18 months starting with .NET 9). That is why .NET 8 and .NET 9 end support on the same day.
- Side-by-side. Several runtimes can be installed at once. An app is either framework-dependent (uses a shared runtime and rolls forward to the latest installed patch) or self-contained (ships its own runtime). Native AOT goes further and produces a single native binary.
- One TFM family.
net10.0covers web, console and libraries. OS-specific suffixes (net10.0-windows,net10.0-android,net10.0-ios) add platform APIs such as WPF/WinForms or mobile bindings.
.NET Standard: a contract, not a runtime
Before .NET 5 there were several runtimes: Framework, Core, Mono/Xamarin and Unity. A library author needed one target that worked on all of them. .NET Standard solved this with a versioned reference assembly (netstandard.dll) that lists APIs. Each runtime version declares which Standard version it implements. Higher versions have more APIs and are implemented by fewer platforms:
netstandard2.0: implemented by .NET Framework 4.6.1+ (4.7.2+ recommended in practice), .NET Core 2.0+, all .NET 5+ versions, Mono and Unity. This is the bridge target and the only Standard version still worth choosing.netstandard2.1: .NET Core 3.0+ and Mono, but not .NET Framework. That removes its main reason to exist.- There will be no new versions after 2.1. In .NET 5+, the
net10.0TFM is the contract, and newer APIs ship with the platform each year instead of waiting for a cross-runtime standardization process.
A typical reusable NuGet library multi-targets: netstandard2.0 for reach, plus a modern TFM to light up faster APIs.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net10.0</TargetFrameworks>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
<!-- In-box on net10.0, a package on netstandard2.0 -->
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="System.Text.Json" Version="10.0.0" />
</ItemGroup>
</Project>
using System.Security.Cryptography;
namespace Contoso.Common;
public static class Hashing
{
public static string Sha256Hex(byte[] data)
{
#if NET5_0_OR_GREATER
// Allocation-friendly APIs that only exist in modern .NET
return Convert.ToHexString(SHA256.HashData(data));
#else
using var sha = SHA256.Create();
return BitConverter.ToString(sha.ComputeHash(data)).Replace("-", "");
#endif
}
}
What to target in 2026: a decision guide
| Scenario | Target | Why |
|---|---|---|
| New web API, worker, console or cloud app | net10.0 | Current LTS, best performance, supported until November 2028 |
| Library used only by your modern apps | Same TFM as the apps | No need for .NET Standard; full API surface |
| Public NuGet library that must also serve .NET Framework users | netstandard2.0;net10.0 | Reach plus modern fast paths |
| WinForms/WPF desktop app | net10.0-windows | Desktop runs on modern .NET (Windows only) |
| Legacy Web Forms/WCF app | Stay on 4.8.1, or migrate incrementally | No direct port. Rewrite UI/endpoints piece by piece |
Frame it as "two runtimes and a contract", then add the dates. Saying ".NET 10 is LTS until November 2028, .NET 8 and 9 go out of support in November 2026, so our upgrade is already planned" shows you track support policy. Interviewers at companies with old Framework estates love candidates who can explain the migration options (incremental with YARP and System.Web adapters vs. big-bang rewrite).
- Targeting
netstandard2.1and expecting .NET Framework consumers to use it. They cannot. - Referencing a .NET Framework-only DLL from a
net10.0app: it may compile through the compatibility shim, then fail at run time withTypeLoadExceptionorMissingMethodExceptionas soon as it touchesSystem.Web, AppDomains or Remoting. - Treating "the .NET Core version" as something separate from .NET 8/10. It is the same product line.
- Running production on an STS release without a plan to move to the next version before support ends.
".NET Core is a lightweight version of .NET Framework, and .NET Standard is the standard library." — This mixes up a runtime with a specification and suggests you have not built or shipped a library in years.
Likely follow-ups
Why did Microsoft skip version 4 and drop "Core"?
.NET Framework 4.x was still widely used, so ".NET 4" would have been ambiguous. Dropping "Core" signaled that this line is the single future of .NET. ASP.NET Core and EF Core kept the suffix to avoid confusion with ASP.NET 4.x and EF6.
LTS or STS — which would you run in production?
Most teams standardize on LTS (3 years) to limit upgrade work. STS (now 2 years) is fine if you upgrade every year anyway and want new features sooner. What matters is never running an unsupported runtime.
Framework-dependent vs self-contained deployment?
Framework-dependent apps are small and use the runtime installed on the host or in the base image, rolling forward to the latest patch. Self-contained apps ship the runtime, so they are larger but isolated from host updates. That also means you must redeploy to get runtime security patches. Containers often use framework-dependent apps on official runtime images, so patching becomes a base-image rebuild.
Can a .NET 10 app consume a library that targets .NET Framework 4.8?
Sometimes. NuGet allows it through a compatibility fallback (warning NU1701), and it works if the library only uses APIs that exist in .NET. Anything that relies on System.Web, AppDomains, Remoting or some Windows-only APIs fails at run time. Prefer a netstandard2.0 or modern build of the library. The Windows Compatibility Pack can cover some Windows-only APIs such as the registry and EventLog.