.NET 8 and .NET 9 support ends on 10 November 2026: how to upgrade to .NET 10

Microsoft stops security updates for .NET 8 and .NET 9 on 10 November 2026. What that means, what breaks and how to move to .NET 10 LTS.

Vlado Pandžić

Vlado Pandžić · Founder · Senior .NET architect
Published · 4 min read

Microsoft ends support for .NET 8 and .NET 9 on 10 November 2026. From that day neither version gets security updates. The upgrade target is .NET 10, a long-term support (LTS) release supported until November 2028. For most business applications the upgrade takes days, not months, if you know where to look.

Which versions are affected

Version Support End of support
.NET 8 LTS 10 November 2026
.NET 9 STS 10 November 2026
.NET 10 LTS November 2028

.NET 9 ends on the same day as .NET 8 because standard-term releases are now supported for 24 months instead of 18.

What end of support means

Applications on .NET 8 and .NET 9 keep running after 10 November. What stops:

  • Security updates. Vulnerabilities found after that date stay open in production.
  • Technical support from Microsoft.
  • A clean audit. Security scanners flag unsupported runtimes, and that shows up in customer security questionnaires and certifications.

Go straight from .NET 8 to .NET 10

There is no need to stop at .NET 9. Both .NET 8 and .NET 10 are LTS releases, and you can move directly. Just read the breaking changes for both .NET 9 and .NET 10.

Upgrade checklist

  1. Install the .NET 10 SDK and a supported IDE. Targeting net10.0 requires Visual Studio 2026; Visual Studio 2022 does not support it. JetBrains Rider and VS Code work too.

  2. Update global.json if the solution pins an SDK version.

  3. Change the target framework in every project, or once in Directory.Build.props:

    <PropertyGroup>
      <TargetFramework>net10.0</TargetFramework>
    </PropertyGroup>
  4. Update the Microsoft packages (ASP.NET Core, EF Core, Microsoft.Extensions.*) to 10.x, then check that every third-party package has a version that supports .NET 10.

  5. Build and fix the warnings. Obsolete APIs appear as warnings. If warnings are treated as errors, most of the work is here.

  6. Run the tests, and check by hand what they don’t cover: startup, authentication, background jobs and data access.

  7. Update the pipeline and hosting: CI build images, Docker base images (mcr.microsoft.com/dotnet/aspnet:10.0), the ASP.NET Core Hosting Bundle on IIS, or the runtime stack on Azure App Service.

  8. Deploy to a test environment first, and watch the database for the first hours after the production release (see EF Core below).

Breaking changes to check first

Microsoft’s lists are long. These are the changes that most often affect business web applications.

SDK and build

  • dotnet restore now audits transitive packages in projects that target .NET 10. Known vulnerabilities in the dependencies of your dependencies show up as warnings NU1901–NU1904, and if warnings are treated as errors, the build stops. Find the source with dotnet nuget why and update the package rather than hiding the warning.

ASP.NET Core 10

  • Cookie login redirects are disabled for known API endpoints. Instead of redirecting to the login page, API endpoints now return 401 or 403. Better for APIs, but check frontends that relied on the redirect.
  • WebHostBuilder, IWebHost and WebHost are obsolete. A Program.cs that dates back to ASP.NET Core 2 or 3 should move to the minimal hosting model.
  • Razor runtime compilation and IActionContextAccessor are obsolete.

Entity Framework Core 10

  • Collections in queries such as ids.Contains(x.Id) are now translated into multiple SQL parameters instead of a single JSON parameter. Usually faster, but measure queries that pass long lists.
  • SQL parameter names are simpler (@city instead of @__city_0). Almost every cached query plan is recompiled after deployment, so expect a short spike in database CPU.
  • On Azure SQL (UseAzureSql), EF now maps JSON to the new json column type, and the first migration after the upgrade alters existing JSON columns.

Runtime and containers

  • Default container images use Ubuntu 24.04 instead of Debian, and Debian images are no longer published. Check Dockerfiles that install system packages.
  • BackgroundService runs all of ExecuteAsync as a task, so code before the first await no longer blocks application startup.
  • MailAddress rejects consecutive dots and System.Text.Json checks for conflicting property names. Small changes that surface as validation or serialization errors.

How long it takes

Rough ranges for a solution that has tests:

  • a single API or service: a few hours to a day
  • a typical business application with a database and a frontend: 2 to 5 days
  • a large solution with many projects, old dependencies or a custom build: 1 to 3 weeks

The framework itself is rarely the slow part. Third-party packages without a .NET 10 version and missing tests are.

Still on .NET Framework?

Then 10 November doesn’t apply to you, but a bigger decision does. .NET Framework 4.8 still gets security fixes, but no new features, and ASP.NET Web Forms has no upgrade path to modern .NET. This is how we move Web Forms to Blazor, screen by screen, while the old application keeps running.

Sources

© 2026 ProCoding — All rights reserved.Legal notice and privacySplit, Croatia