.NET 8 and .NET 9 End of Support (November 10, 2026): What It Means and How to Move to .NET 10

.NET 8 and .NET 9 both reach end of support on November 10, 2026. After that Patch Tuesday, Microsoft stops shipping security fixes for them, and your apps keep running unpatched. The fix is .NET 10, an LTS release supported until November 14, 2028.

In this tutorial, I’ll break down what .NET 8 end of support means in practice, who’s affected, the full version timeline, the Azure Functions deadline that lands the same day, and the short path to .NET 10.

.NET 8 and .NET 9 End of Support Dates at a Glance

Here’s the timeline from Microsoft’s .NET support policy, with the status as of today, October 26, 2026. My .NET versions and support dates page tracks every release:

VersionTypeReleasedEnd of supportStatus
.NET 10LTSNov 11, 2025Nov 14, 2028Supported
.NET 9STSNov 12, 2024Nov 10, 2026Ends in 15 days
.NET 8LTSNov 14, 2023Nov 10, 2026Ends in 15 days
.NET 7STSNov 8, 2022May 14, 2024Out of support
.NET 6LTSNov 8, 2021Nov 12, 2024Out of support

I like having the countdown in code, so here’s a tiny .NET 10 file-based app. It stores the dates in a C# Dictionary and subtracts DateOnly.DayNumber values:

using System.Globalization;
using System.Runtime.InteropServices;

CultureInfo.CurrentCulture = new("en-US");
var today = new DateOnly(2026, 10, 26);   // fixed "today"
var ends = new Dictionary<string, DateOnly>
{
    [".NET 8 (LTS)"] = new(2026, 11, 10),
    [".NET 9 (STS)"] = new(2026, 11, 10),
    [".NET 10 (LTS)"] = new(2028, 11, 14),
};

Console.WriteLine($"Runtime: {RuntimeInformation.FrameworkDescription}");
foreach (var (version, end) in ends)
{
    int days = end.DayNumber - today.DayNumber;
    Console.WriteLine($"{version,-14} {end:MMM d, yyyy}: {days} days left");
}

Output:

Runtime: .NET 10.0.13
.NET 8 (LTS)   Nov 10, 2026: 15 days left
.NET 9 (STS)   Nov 10, 2026: 15 days left
.NET 10 (LTS)  Nov 14, 2028: 750 days left
VS Code running SupportCheck.cs: a C# program printing days left until .NET 8 and .NET 9 end of support on November 10, 2026
15 days left for .NET 8 and .NET 9, counted from October 26, 2026

DayNumber turns each date into a plain day count, so the subtraction can’t trip over month lengths. I use the same idea for start and end dates of a month in C#.

What Does .NET 8 End of Support Actually Mean?

Microsoft defines end of support as the date after which it no longer provides fixes, updates or technical assistance. In practice, that’s four things:

  • No security patches. .NET servicing updates ship monthly, and security fixes land on Patch Tuesday (the second Tuesday). After November 10, .NET 8 and .NET 9 get none.
  • One possible last update. November 10 is itself a Patch Tuesday, so each version may get a final update that day, but only for a known critical issue.
  • No Microsoft support. You can’t open a support case for an out-of-support runtime.
  • Your apps keep running. Nothing gets switched off. The risk is the next vulnerability that never gets patched.

Visual Studio 2022 will mark the .NET 8 and .NET 9 components as out of support in a future servicing update. Existing installs aren’t affected, though the installer can remove out-of-support components.

On Azure App Service, apps on an end-of-support runtime continue to run unchanged. But App Service can’t provide security patches or support for that runtime until you upgrade.

Compliance is the part that bites first. Vulnerability scanners and auditors usually flag unsupported runtimes, so expect questions in your next security review. It’s also a common topic in .NET Core interview questions.

Why Do .NET 8 and .NET 9 End Support on the Same Day?

Releases alternate between Long Term Support and Standard Term Support. LTS versions get at least three years of patches. STS versions used to get 18 months, but Microsoft extended STS to 24 months in late 2025.

That extension moved .NET 9 from May 2026 to November 2026, right on top of .NET 8. End dates also snap to Patch Tuesday, which is why it’s November 10 rather than a release anniversary.

So there’s no point hopping from .NET 8 to .NET 9 now. Go straight to .NET 10 and you get support until 2028, plus everything in what is new in .NET 10.

Who Is Affected by .NET 8 and .NET 9 End of Support?

If any of these describe your work, the November 10 date applies to you:

  • Apps whose project files target net8.0 or net9.0, whether framework-dependent or self-contained.
  • Docker images built on the 8.0 or 9.0 runtime tags.
  • Web apps on Azure App Service using the .NET 8 or .NET 9 stack.
  • Azure Functions on the in-process model (covered below).
  • Third-party tools built on .NET 8 or 9. Ask the vendor for a .NET 10 build.

.NET Framework 4.8 isn’t part of this. It follows a separate lifecycle tied to the Windows version it ships with.

How to Check Which .NET Version You’re Running

Start with the machine. dotnet --version shows the SDK the CLI picks, and dotnet --list-runtimes lists every installed runtime. My full guide to checking the .NET version covers Visual Studio, the registry and code too.

Here’s what my demo machine prints for the runtimes:

dotnet --list-runtimes
Microsoft.AspNetCore.App 6.0.24 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 7.0.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 10.0.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.24 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 7.0.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 10.0.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 6.0.24 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 7.0.13 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 10.0.13 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Then check the code. Search your repos for <TargetFramework>net8.0 and net9.0, including TargetFrameworks with an s for multi-targeted libraries. Don’t forget CI pipelines and Dockerfiles that pin an SDK or image version.

For a build-time alarm, set the CheckSdkVulnerabilities MSBuild property to true. The build then warns with NETSDK1239 when the resolved SDK is end of life.

Azure Functions In-Process Model Support Also Ends November 10, 2026

This one’s easy to miss. Support for the Azure Functions in-process model ends on the same day, and Microsoft’s answer is to migrate C# function apps to the isolated worker model on .NET 10.

The migration touches more than the target framework. Here are the main changes from the Microsoft Learn migration guide:

  1. Set the project SDK to Azure.Functions.Sdk and TargetFramework to net10.0.
  2. Replace Microsoft.NET.Sdk.Functions and any Microsoft.Azure.WebJobs.* packages with Microsoft.Azure.Functions.Worker packages.
  3. Add a Program.cs that builds the host; it replaces your FunctionsStartup class.
  4. Rename [FunctionName] to [Function] and get ILogger<T> through the constructor.
  5. Set FUNCTIONS_WORKER_RUNTIME to dotnet-isolated, then deploy through a staging slot and swap.

Locally, that last setting lives in local.settings.json:

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
    }
}

Watch the JSON, too. The isolated model uses System.Text.Json, which ignores Newtonsoft attributes like [JsonProperty]. I covered its options in serializing objects to JSON in C#.

How to Move from .NET 8 or .NET 9 to .NET 10

For most apps, the upgrade is a short checklist. I’ll keep it brief here; the step-by-step version with real errors and fixes is in my guide to upgrading .NET 8 to .NET 10.

  1. Install the .NET 10 SDK and pin it with global.json so every developer and build agent uses the same one.
  2. Change TargetFramework from net8.0 or net9.0 to net10.0.
  3. Update Microsoft.* packages (EF Core, ASP.NET Core, Extensions) to 10.x; dotnet list package --outdated shows what’s behind.
  4. Build, run your tests and read the .NET 10 breaking changes for the areas you use.
  5. Update hosting: the App Service stack, Docker base images and CI pipeline SDK versions.
  6. Deploy to staging first, then production.

Pin the SDK with global.json

This global.json asks for SDK 10.0.100 or any later 10.0 feature band, so the CLI won’t silently fall back to an older SDK:

{
  "sdk": {
    "version": "10.0.100",
    "rollForward": "latestFeature"
  }
}

Running dotnet --version and dotnet --list-sdks in that folder confirms the pick:

dotnet --version
10.0.402

dotnet --list-sdks
7.0.403 [C:\Program Files\dotnet\sdk]
10.0.402 [C:\Program Files\dotnet\sdk]
VS Code showing global.json pinning the .NET 10 SDK with rollForward latestFeature, and dotnet --version and dotnet --list-sdks output
global.json resolves to SDK 10.0.402, the newest installed 10.0 SDK

Change the TargetFramework to net10.0

Here’s a small console project after the change. The comment marks where net8.0 used to be. If you’re new to project-based apps, see creating a console app in VS Code.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <!-- was net8.0: .NET 8 support ends November 10, 2026 -->
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

And the Program.cs that proves which runtime it lands on:

using System.Runtime.InteropServices;

Console.WriteLine($"Framework: {RuntimeInformation.FrameworkDescription}");
Console.WriteLine($"Runtime version: {Environment.Version}");
Console.WriteLine($"Target: {AppContext.TargetFrameworkName}");

Running dotnet run --project OrdersApp prints:

Framework: .NET 10.0.13
Runtime version: 10.0.13
Target: .NETCoreApp,Version=v10.0
VS Code showing OrdersApp.csproj with TargetFramework net10.0 and dotnet run output reporting .NETCoreApp v10.0
After the TargetFramework change, the app reports .NET 10

AppContext.TargetFrameworkName confirms the build target, while Environment.Version shows the runtime patch. With .NET 10 you also get C# 14 by default; see what is new in C# 14.

Which .NET 8 End of Support Plan Should You Pick?

With 15 days left, here’s how I’d triage:

Your situationWhat I’d do now
Simple web app or API on .NET 8/9Retarget to net10.0 this week and ship it
Azure Functions in-processMigrate to isolated worker on .NET 10 first
Large app, can’t finish by Nov 10Start now, patch to the final 8.0 update, plan a dated cutover
Vendor app on .NET 8Ask the vendor for a .NET 10 release
.NET Framework 4.8 appNot affected by this date

Whatever you pick, log errors well during the cutover. My log4net setup for ASP.NET Core works the same on .NET 10.

Once you’re on .NET 10, these are good next reads:

Frequently Asked Questions

Will my .NET 8 app stop working after November 10, 2026?

No. It keeps running. It just stops receiving security fixes and Microsoft support, so new vulnerabilities in the runtime stay unpatched.

Is .NET 9 supported longer than .NET 8?

No. Even though .NET 9 is newer, it’s an STS release with 24 months of support, so it ends on November 10, 2026, the same day as .NET 8.

Can I upgrade from .NET 8 straight to .NET 10?

Yes. You don’t need .NET 9 in between. Change TargetFramework to net10.0, update your packages and review the .NET 10 breaking changes.

How long is .NET 10 supported?

Until November 14, 2028. It’s an LTS release, per the .NET releases and support page on Microsoft Learn.

Does the Azure Functions in-process model end too?

Yes, on the same day. Move C# function apps to the isolated worker model, following the in-process to isolated migration guide.

Is .NET Framework 4.8 affected?

No. .NET Framework has its own lifecycle tied to Windows, separate from .NET 8 and .NET 9.