case studies · applications

Applications, move by move.

Old applications rarely fail on a schedule. Framework end-of-life, a mobile store policy change or a vendor API retiring usually forces the date. These are the rebuilds and upgrades we've done to keep apps shipping.

4 case studies3 modernizations1 upgrade10 platforms
featured case study

.NET Framework and .NET 8 to .NET 10

Told without the client's name or anything that could identify them.

what happened

A product engineering team ran a mix of .NET 8 services and older .NET Framework 4.x apps with WCF services and Web Forms pages, all on Windows Server VMs. With .NET 8 and 9 reaching end of support on 10 November 2026 and Framework 4.6.2 following on 12 January 2027, security scanners were about to flag both. We scanned the portfolio first and retargeted the .NET 8 and 9 apps to .NET 10 ahead of the November date. The Framework apps then moved library by library, with an ASP.NET Core front taking over endpoints one at a time and each WCF service moved to CoreWCF, gRPC or REST based on its callers.

what the client got
  • Every app targets a supported runtime.NET 8 and 9 apps now target net10.0, the LTS release supported to 14 November 2028, with package updates and breaking changes worked through behind tests.
  • Shared libraries serve old and new appsWe moved class libraries to .NET Standard 2.0 or multi-targeted them. Framework apps kept working the whole time the apps calling them were being ported.
  • Web endpoints moved over one at a timeAn ASP.NET Core app in front of the old ASP.NET app takes over routes incrementally, so each move ships with its own rollback.
Read the full case study
after / dotnet-framework-to-modern-dotnet delivered
before.NET Framework 4.x, .NET 8 and .NET 9 apps after.NET 10 LTS
01 · CLIENTS 02 · EDGE 03 · APPLICATIONS ON .NET 10 04 · HOSTING AND CI Browsers: same URLs Browsers same URLs Internal callers: updated clients Internal callers updated clients ASP.NET Core front: routes moved one at a time ASP.NET Core front routes moved one at atime CoreWCF: chosen per caller CoreWCF chosen per caller .NET 10 services: LTS to 14 November 2028 .NET 10 services LTS to 14 November2028 Remaining ASP.NET app: shrinking set of routes Remaining ASP.NETapp shrinking set ofroutes Shared libraries: .NET Standard 2.0 · multi-target Shared libraries .NET Standard 2.0 ·multi-target CI pipeline: builds net10.0 · runtime patches CI pipeline builds net10.0 ·runtime patches Linux containers or App Service: where dependencies allow Linux containers orApp Service where dependenciesallow
01 · CLIENTS02 · EDGE03 · APPLICATIONS ON .NET 1004 · HOSTING AND CI Browsers: same URLs Browsers same URLs Internal callers: updated clients Internalcallers updated clients ASP.NET Core front: routes moved one at a time ASP.NET Corefront routes moved oneat a time CoreWCF: chosen per caller CoreWCF chosen per caller .NET 10 services: LTS to 14 November 2028 .NET 10services LTS to 14November 2028 Remaining ASP.NET app: shrinking set of routes RemainingASP.NET app shrinking setof routes Shared libraries: .NET Standard 2.0 · multi-target Sharedlibraries .NET Standard2.0 ·multi-target CI pipeline: builds net10.0 · runtime patches CI pipeline builds net10.0 ·runtime patches Linux containers or App Service: where dependencies allow Linuxcontainers orApp Service where dependenciesallow © Cohash · cohash.com
what goes wrong

Risks that keep coming up

One risk from each of these moves, and the case study that shows how we handled it when it hit.

  1. System.Web and Web Forms

    ASP.NET Core has nothing that maps straight onto Web Forms. So those pages are either rewritten in Razor Pages or Blazor, or left on Framework with a date for dealing with them.

  2. Apps that write to local disk

    Anything an app writes to the server's disk, logs, uploads, caches, vanishes when a pod restarts. We find those in the assessment, not in production.

  3. Undocumented business rules

    Decades-old COBOL holds rules nobody wrote down. Parallel runs with output comparison are the only reliable way to prove a slice behaves the same.

  4. Abandoned native SDKs

    One analytics or payment SDK with no 16 KB build blocks the whole app. We find these in the audit, so there's time to replace them.

01Why does .NET 8 end support at the same time as .NET 9?

Microsoft's support policy page lists both ending on 10 November 2026, even though .NET 8 is an LTS release. .NET 10 is the LTS release to target, with support to 14 November 2028.

02Can .NET Framework apps run in containers?

Yes, as Windows containers on Windows nodes. A lot of teams do that first and port to modern .NET later, at which point Linux containers become an option.

03Do we need to upgrade z/OS first?

Not for the API work, but you need a supported release either way. z/OS 2.5 is in service extension, so we often plan the 3.x upgrade alongside.

04What happens if we miss the Google Play target API deadline?

Play won't accept new updates until the app meets the target level, apart from any extension you got. People who already have it keep using it. You just can't ship them a fix.

other areas

More case studies by area

The same approach, applied to other parts of the estate.

fact-checked Checked against vendor and official documentation last checked 2026-10-20 content fingerprint 23a31efa
  1. 01Book a 30-minute working sessionsenior engineer
  2. 02Talk to an engineer about your setupreply within 24 hours
  3. 03See how similar projects wentcase studies
Reviewed by the Cohash team Product names are trademarks of their owners. how we handle facts and data →
next step

Facing one of these moves?

Tell us what you're on now and where you need to be. We'll come back with how we'd run the move.

useful to bring
  • The platform and the version you're on
  • Where you need to get to, and by when
  • What's custom: rules, plugins, integrations
  • Any audit finding or deadline driving it