Where a .NET 8 repo hides its version before the November 10 end of support
.NET 8 and .NET 9 both leave support on November 10, 2026, and the in-process model for Azure Functions ends the same day. The author argues that the target framework is rarely a one-line change, because version pins hide in Directory.Build.props, global.json, Dockerfiles, CI workflows and Functions setup.
Key points
- Search Directory.Build.props for properties such as $(AppTfm) and for TargetFrameworks in multi-targeted libraries.
- Update global.json to a full SDK version such as 10.0.100 and review the rollForward setting.
- Change sdk and aspnet image tags in Dockerfiles and compose files to 10.0; .NET 10 default images are Ubuntu 24.04 based.
- Update setup-dotnet or UseDotNet versions and matrix build values in your CI pipeline.
- Move in-process Azure Functions to the isolated worker model and deploy the FUNCTIONS_WORKER_RUNTIME change together with the code.
- After migrating, run dotnet ef migrations add UpgradeCheck to catch an unexpected EF Core migration before deployment.
Support for .NET 8 and .NET 9 ends on November 10, 2026, and the in-process model for Azure Functions ends on the same day. After that, those runtimes stop receiving security patches, although apps will not stop running on the 11th. The author points out that moving to .NET 10 is rarely a single-line edit.
The version a project really uses can be set in a shared Directory.Build.props property, a global.json SDK pin, Dockerfile base image tags, compose files, and CI setup steps. For Azure Functions, the work is larger: FunctionsStartup goes away, the app must move to the isolated worker model, and serialization changes from Newtonsoft to System.Text.Json. The article also flags behavior changes that compile cleanly but act differently at runtime.
Real-world use
- Moving a monorepo with several projects, a shared props file and Docker images to .NET 10 in one branch.
- Migrating a legacy in-process Azure Functions app to the isolated worker model and rolling it out through a staging slot.
- Aligning SDK versions and container images across a CI pipeline that has not been touched for years.
Why it matters
A version pin can live in several files, so changing one csproj may leave production quietly on .NET 8. Scanning all of them before the support end date reduces the risk of running unpatched runtimes.
Related stories
- How the Intune team moved a .NET Framework service to .NET 8 with CopilotApps on Azure Blog6 d ago
- Collection Return Types in C#: Interfaces, Views, and SnapshotsNick Cosentino (Dev Leader)2 d ago
- CritterWatch 1.1 groups dead letters by failure cause and acts on each group at onceJasperFx (Critter Stack) Blog4 d ago