Modernizing a .NET Framework application without a full rewrite
A full rewrite is the most tempting answer to an aging .NET Framework application, and usually the riskiest one. It pauses feature delivery, concentrates risk into a single cutover, and often underestimates the business logic buried in code nobody has touched in years.
A staged modernization path is typically safer. It starts with identifying which parts of the system are safe to leave alone for now and which parts are actively blocking the business, whether that's a hosting limitation, a security gap, or a dependency that's no longer supported.
From there, the practical sequence is usually: separate the application into layers if it isn't already, introduce automated tests around the business logic that will be touched, port shared libraries to .NET Standard where possible, and migrate one deployable unit at a time rather than the whole application at once.
Database and infrastructure dependencies often turn out to be the real blocker, not the application code itself. It's worth mapping those dependencies early, since they frequently determine the realistic order of migration more than the code does.
The end state doesn't have to be a single 'modern' stack decided on day one. It's fine for the migration to take longer than expected if each stage leaves the system in a working, deployable state.