Upgrade .NET solutions with verified, reviewable changes
The problem
Upgrading a .NET solution means touching every project file, chasing transitive package conflicts and fixing the APIs that changed.
AI that guesses package versions produces plausible but wrong results; the only safe check is a real restore and build.
What UpgradePilot does for .NET
- Finds target versions with
dotnet list package --outdated. - Updates NuGet references or Central Package Management across every
.csproj. - Upgrades target frameworks and applies Roslyn rename codemods.
- Runs EF Core migration checks; destructive operations are flagged, never silently applied.
- Runs
dotnet buildanddotnet test, plus a NuGet vulnerability scan. - Generates upgrade documentation, a rollback plan and the pull request.
What you still review by hand
UpgradePilot is built so nothing is hidden: these are the places a person should look before merging.
- Behavior changes documented in Microsoft’s breaking-change lists that tests may not cover.
- Generated migrations and any schema or data change.
- Packages that cannot move yet because a dependency has not published a compatible version.
- Runtime and hosting configuration (containers, CI images, deployment targets).
Common pitfalls
- A thin test suite means a passing build proves less — add characterization tests around critical paths first.
- Pinned SDK versions in
global.jsonand CI images must match the new target.
Documentation to review
Read the official notes for the versions you’re crossing alongside the pull request UpgradePilot produces.
.NET upgrade FAQ
Does it support Central Package Management?
Yes. Package bumps work with both per-project PackageReference versions and Central Package Management.
How are target versions chosen?
From dotnet list package --outdated, then verified with dotnet restore. A caller can override the result by hand.
What about multi-project solutions?
Every .csproj in the solution is handled, not just the startup project.
Related stacks
ABP FrameworkASP.NET Zero.NET + React/Next.jsAll documentation