FIELD NOTEBOOK  /  LEGACY .NET MIGRATION
DotNet Forward
VOL. 01 · p.03
PROJECT No. NET-10
STATUS · OPEN FOR Q3

Entry · the brief  ·  .NET Framework 4.x → .NET 10 (LTS)

Legacy .NET, moved to .NET 10. With tests that prove nothing changed.

I take an aging .NET Framework application onto current, supported .NET, and hand back a test suite that demonstrates the new code behaves exactly as the old one did. One senior engineer runs the whole job and signs their name to it. The price is fixed.

01

.NET Framework is past its useful life, and every quarter you wait makes the move more expensive, not less.

Three things are usually true at once by the time someone calls. The runtime is unsupported, which your security and compliance people already treat as a problem. Hiring anyone who wants to maintain a decade-old stack has quietly become impossible. And the obvious alternative, a from-scratch rewrite, is a six-figure bet that breaks behaviour nobody on the team fully remembers building.

Migration is the narrow path between those. Done properly it keeps everything that works and changes only what the platform forces.

02

One service, and deliberately nothing around it. That narrow line is what lets me quote a fixed price and hold it.

IN SCOPE

  • Project files to SDK-style; packages.configPackageReference
  • Dependency upgrades, dead packages flagged with a proposed replacement
  • Platform transforms: System.Web → ASP.NET Core, WCF → CoreWCF/gRPC
  • Web Forms → ASP.NET Core, as a tests-first UI rewrite: .aspx pages and code-behind moved to Razor, behaviour locked by characterization and Playwright tests before anything moves
  • A parity test suite matched to the app: unit and characterization tests, Playwright end-to-end checks for web UIs, and k6 load tests where throughput has to hold

OUT OF SCOPE

  • ×New features, redesigns, or refactors the move doesn’t require

AVAILABLE SEPARATELY

  • Cloud architecture, CI/CD, containerisation, deployment
  • Database schema migration or re-platforming
before · net48
after · net10.0
<TargetFramework>net48</>
packages.config · 86 deps
System.Web.Mvc
build · 6 obsolete APIs
tests · none, unverified
<TargetFramework>net10.0</>
PackageReference · mapped
Microsoft.AspNetCore.Mvc
build · succeeded, 0 warnings
tests · 342 passed, parity ok
FIG. 1 · the same project file, before and after. The right-hand column is what lands in your repository.
03

“Isn’t AI-generated migration risky?”

It would be, if the AI had the final say. It doesn’t. The honest answer is structural, and it comes in three parts.

  1. i.
    AI does the mechanical work. The repetitive 80%, project conversions, dependency mapping, the rote API transforms, is what tooling is good at. That is where the speed, and the lower price, come from.
  2. ii.
    Tests decide whether it’s correct. Before I change a line, I write tests that capture how your app behaves today. The migrated code has to reproduce that exactly. The tests are the judge, not my opinion and not the model’s.
  3. iii.
    A named person owns every change. I review each commit and I’m accountable for the result. No rotating team, no offshore black box, no “the tool did it.”
04

Six steps, run in this order every time. I sell the method, not the hours.

  1. 01
    Inventory. An automated scan of every project, dependency and framework target, risks flagged up front.
  2. 02
    Pin the target. Lock to .NET 10 LTS and map each dependency to a modern equivalent, or a replacement where none exists.
  3. 03
    Characterize. Write the tests that lock in today’s behaviour, before touching the code.
  4. 04
    Migrate. AI-accelerated transforms, reviewed by me, committed in small steps you can read.
  5. 05
    Prove parity. The full suite runs green against the migrated code. Acceptance is that result, not a feeling.
  6. 06
    Handoff. A building repository, a migration report, a readable changelog, and a walkthrough call. Then your team deploys.
05

Phased, because honest fixed pricing means reading the code first.

A blind fixed bid on legacy .NET is how people lose money: the hidden COM interop, the undocumented logic, the Web Forms surprise. So I don’t guess. A small fixed-price assessment reads your actual code and produces the migration quote.

The assessment is $2,500 to $5,000, takes two to four days, and the whole fee is credited against the migration if you proceed. If it doesn’t give you a clear, actionable plan, you don’t pay for it.

Then the migration itself, fixed illustrative
Small line-of-business app or library$8k to $20k
Medium, MVC or Web API with services$20k to $45k
Large or multi-project solution$45k+

Your real number comes from the assessment. Half to start, half on acceptance, where acceptance means the test suite is green and the agreed checklist is met. You own all the resulting code.

06

I’d rather show you than tell you. There’s a public sample migration: a real open-source .NET Framework app, taken end to end, every commit and the full passing test suite out in the open. No client permission needed, nothing to take on faith.

$ dotnet test ./SampleMigration
14 projects · 86 dependencies upgraded
Passed!  Failed: 0   Passed: 342   Skipped: 0
parity verified, 0 behaviour changes

Read the full writeup in the field notebook →

07
your photo

The point of this service is that it isn’t a team, and it isn’t a tool you operate yourself. It’s one engineer who has done this enough times to keep the scope narrow, who reviews every change the tooling proposes, and whose name is on the result. That accountability is as much the product as the migrated code.

Jaime
SOLUTION DEVELOPER & ENGINEERING MANAGER
Q&A
Will my app behave exactly the same?

Yes, and it’s something I can show rather than promise. The characterization tests capture current behaviour first, and the migrated code has to pass them. That is the definition of done.

Does my source code get sent to an AI provider?

A plain-English data-handling statement belongs here: private repositories only, an NDA before any review, and the option to work inside your environment for sensitive code. (Final wording to confirm before launch.)

Do you do Web Forms?

Yes. Web Forms has no like-for-like equivalent on modern .NET, so I’m honest that the UI tier is a rewrite, not a transform — .aspx pages and code-behind become Razor. What keeps it safe is the same thing as the rest: characterization and Playwright tests capture how each page behaves today, and the rewritten UI has to reproduce that exactly. It’s more work than a class library, so it’s priced accordingly, but it’s the same method, not a separate gamble.

Who owns the resulting code?

You do. IP is assigned to you on final payment, liability is capped at fees paid, and there are no strings on what you build next.

Find out what your migration would actually cost.

Twenty minutes, no pitch. I’ll tell you whether your app is a fit, roughly what the path looks like, and whether it’s even worth doing. If it isn’t, I’ll say that too.

An unhandled error has occurred. Reload Dismiss

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please reload the page.