VS Code Live - Modernizing Legacy .NET applications with GitHub Copilot Modernization in VS Code
TL;DR
GitHub Copilot can take a legacy ASP.NET app from .NET Framework 4.8 to .NET 10 in about 23 minutes — Jorge upgraded the Contoso University sample live in VS Code, then ran it with
dotnet runon port 5000, preserving the app’s look and feel while removing old framework baggage.The real win is cutting weeks or months of tedious migration work down to one agent-driven workflow — Joel framed this as exactly the kind of repetitive upgrade project teams used to estimate at 15 story points or more, now handled through a prompt like “upgrade my project to .NET 10.”
The modernization stack works across VS Code, Visual Studio, GitHub Copilot CLI, and GitHub’s cloud agent — they demoed three paths live and called out a fourth, the Modernize CLI, which can assess and upgrade multiple repos in batch.
Under the hood, this isn’t just a generic chatbot — it’s powered by a .NET modernize agent with around 80+ skills — those skills cover things like SDK-style project conversion, MVC upgrades,
global.asaxremoval, SQL client migration, and replacing deprecated dependencies like MSMQ.It’s especially useful for portfolio-level cleanup, not just one app at a time — Jorge showed a prompt that scanned GitHub repos for .NET Framework projects, found two candidates, and opened issues to prep them for cloud-agent-driven migration.
The biggest caveat is still classic engineering discipline: tests matter — Jorge said the safest path is to improve unit and end-to-end coverage first, ideally with Playwright today, because even a lift-and-shift migration needs a harness to confirm nothing quietly broke.
The Breakdown
The setup: Contoso University, but make it 2025
Olivia opens with Jorge and Joel from Microsoft, and they jump straight into a very real problem: modernizing old .NET apps without turning it into a months-long slog. Their demo target is Contoso University, a deliberately creaky ASP.NET app running on .NET Framework 4.8, complete with jokes about selective admissions and Burke Holland as the “Dean of vibing.”
What the app looks like before the upgrade
They launch the original app in Visual Studio because it still depends on IIS, then poke around the UI adding courses like “Vibing Capstone” and a “.NET modernization” class. The point lands quickly: this thing feels 10 to 15 years old, relies on IIS and MSMQ, and is exactly the kind of line-of-business software lots of companies still have sitting around.
One prompt, multiple paths: VS Code, CLI, and cloud agent
In VS Code, Jorge installs the GitHub Copilot Modernization extension, selects the “modernize .NET” agent, turns on Autopilot, and sends a simple prompt: upgrade the project to .NET 10 and commit the changes. In parallel, he kicks off the same kind of migration through GitHub Copilot CLI and then through GitHub’s cloud agent on a forked repo, turning the stream into a slightly chaotic live race between three agent-driven workflows.
What the agent is actually doing behind the scenes
Jorge pauses to show that this is more than a magic black box: the modernization agent uses a Copilot plugin plus a library of skills for concrete upgrade tasks. He calls out examples like converting old project files to SDK style, removing global.asax, replacing MSMQ, and handling MVC and SQL client migration, and notes that there are roughly 81 skills available — plus the option to add your own.
The practical questions: Visual Studio, batch upgrades, and enterprise scale
They answer chat questions directly: yes, the same engine works in Visual Studio, where the modernize agent is built into Copilot chat. Jorge also shows the separate Modernize CLI for batch assessments and upgrades, then demos a prompt that scans GitHub for repos still on .NET Framework, creates issues for each one, and prepares them for cloud-agent migration — a much bigger story than just fixing one demo app.
The reality check: this works best with tests
Joel asks the obvious question: how do you know the migrated app still works? Jorge’s answer is old-school in the best way — improve test coverage first, especially end-to-end coverage, because this is a like-for-like migration and you want confidence that behavior stayed intact. He says Copilot makes that step dramatically faster now, especially with tools like Playwright, to the point where “there’s no longer excuse for not writing tests.”
The result: same app, modern runtime, much less pain
As the stream runs long and the machines struggle a bit, the VS Code path eventually finishes in about 23 minutes. Jorge shows a prior pull request with 61 files changed — web.config gone, global.asax deleted, .csproj converted to SDK format, target switched from .NET Framework 4.8 to .NET 10 — then runs the upgraded app with dotnet run and confirms the familiar Contoso University site still works, just faster and no longer tied to IIS or Windows.
The closing note: great for VB.NET, not magic for VB6
In the final Q&A, they clarify that VB.NET should be in scope, but classic VB6 is a different beast. Joel describes VB6 modernization as part software port, part business archaeology, because the code may contain critical side effects nobody has documented — a funny but honest reminder that AI helps a lot, but legacy systems still come with history attached.