{"id":257033,"date":"2026-08-21T10:00:45","date_gmt":"2026-08-21T17:00:45","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/visualstudio\/?p=257033"},"modified":"2026-08-20T21:00:29","modified_gmt":"2026-08-21T04:00:29","slug":"today-i-will-modernize-a-net-application","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/visualstudio\/today-i-will-modernize-a-net-application\/","title":{"rendered":"Today I will&#8230; Modernize a .NET application"},"content":{"rendered":"<p><!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\">\n  Today I will modernize a .NET Framework application to .NET 10 using the GitHub Copilot modernization tooling built-in to Visual Studio.\n<\/div>\n<p>\u00a0<\/p>\n<div class=\"scriptor-paragraph\">\n  The tooling helps us upgrade applications running on legacy versions of .NET and also migrate them to Azure. Today we&#8217;re going to focus on the upgrade portion.\n<\/div>\n<p>\u00a0<\/p>\n<div class=\"scriptor-paragraph\">\n  And, the tooling will do all the work for us! But it doesn&#8217;t do everything at once, and that&#8217;s good. It introduces checkpoints into the .NET upgrade process to tell us what it has been up to we can then guide it towards the outcome we want. And at each of those checkpoints it creates a markdown file that we can check in to source control &#8211; in other words, a record of both what came out of and what went in to the upgrade process.\n<\/div>\n<h2>The app we&#8217;re modernizing<\/h2>\n<p><!--ScriptorStartFragment--><\/p>\n<p><a href=\"https:\/\/github.com\/microsoft\/dotnet-modernization-for-beginners\/tree\/main\/shared-legacy-app\"><span role=\"link\">BookCatalog<\/span><\/a> is a simple .NET Framework forms-over-data app. You can list books, add one, edit, delete.<!--ScriptorEndFragment--><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-01-bootcatalog.webp\"><img decoding=\"async\" class=\"alignnone wp-image-257034 size-large\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-01-bootcatalog-1024x670.webp\" alt=\"screenshot of the book catalog application\" width=\"1024\" height=\"670\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-01-bootcatalog-1024x670.webp 1024w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-01-bootcatalog-300x196.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-01-bootcatalog-768x503.webp 768w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-01-bootcatalog.webp 1311w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a> <!--ScriptorStartFragment--><\/p>\n<h2>Step 1: Open the sample<\/h2>\n<div class=\"scriptor-paragraph\">\n  Clone the <a href=\"https:\/\/github.com\/microsoft\/dotnet-modernization-for-beginners\"><span role=\"link\">repo<\/span><\/a> and open BookCatalog.sln from <code class=\"language-PlainText\">shared-legacy-app\/<\/code>.\n<\/div>\n<ol class=\"scriptor-listCounterlist!list-2bab310a-235b-4c4b-be7f-70f909639dae0 scriptor-listCounterResetlist!list-2bab310a-235b-4c4b-be7f-70f909639dae0\">\n<li class=\"scriptor-listItemlist!list-2bab310a-235b-4c4b-be7f-70f909639dae0\">\n    <code class=\"language-PlainText\">git clone https:\/\/github.com\/microsoft\/dotnet-modernization-for-beginners.git<\/code>\n  <\/li>\n<li class=\"scriptor-listItemlist!list-2bab310a-235b-4c4b-be7f-70f909639dae0\">\n    Open BookCatalog.sln in Visual Studio 2022+ from the shared-legacy-app in the folder you cloned.\n  <\/li>\n<\/ol>\n<p><!--ScriptorStartFragment--><\/p>\n<h2>Step 2: Start modernization<\/h2>\n<div class=\"scriptor-paragraph\">\n  In Visual Studio, right-click the project or solution and select Modernize. You can also start from Visual Studio with <code class=\"language-PlainText\">@Modernize<\/code>.\n<\/div>\n<p><!--ScriptorEndFragment--><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-02-solution.webp\"><img decoding=\"async\" class=\"alignnone size-full wp-image-257035\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-02-solution.webp\" alt=\"Screenshot howing the option to start the modernize agent\" width=\"669\" height=\"228\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-02-solution.webp 669w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-02-solution-300x102.webp 300w\" sizes=\"(max-width: 669px) 100vw, 669px\" \/><\/a> <!--ScriptorStartFragment-->That opens the GitHub Copilot chat window with a customized modernization agent \/ experience loaded up. This agent is specifically tuned to go through the process of modernizing applications.<\/p>\n<p><!--ScriptorEndFragment--><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-03-chat.webp\"><img decoding=\"async\" class=\"alignnone wp-image-257036 size-medium\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-03-chat-285x300.webp\" alt=\"Screenshot of the GitHub Copilot chat experience for the modernization agent\" width=\"285\" height=\"300\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-03-chat-285x300.webp 285w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-03-chat-768x808.webp 768w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-03-chat-24x24.webp 24w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-03-chat.webp 898w\" sizes=\"(max-width: 285px) 100vw, 285px\" \/><\/a> <!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\">\n  It provides several sample prompts, but you can also tell it what to do in natural language.\n<\/div>\n<div>\n<\/div>\n<div class=\"scriptor-paragraph\">\n  But for today, pick the top suggested prompt <strong>Upgrade to a newer version of .NET.<\/strong><!--ScriptorEndFragment-->\n<\/div>\n<div>\n<\/div>\n<div>\n  The agent will then ask you 2 questions. The first is which target framework to upgrade to &#8211; pick\u00a0<strong>.NET 10<\/strong>.\n<\/div>\n<div>\n  <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-05-target.webp\"><img decoding=\"async\" class=\"alignnone size-full wp-image-257038\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-05-target.webp\" alt=\"screenshot of the agent asking which .NET target framework to upgrade to\" width=\"872\" height=\"397\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-05-target.webp 872w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-05-target-300x137.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-05-target-768x350.webp 768w\" sizes=\"(max-width: 872px) 100vw, 872px\" \/><\/a>\n<\/div>\n<div>\n  <!--ScriptorStartFragment--><\/p>\n<div>\n  <\/div>\n<div class=\"scriptor-paragraph\">\n    And then the flow mode. Remember when I said the modernization process would stop at checkpoints along the way &#8211; well, it&#8217;ll only do that if we pick <strong>Guided<\/strong> so pick that.\n  <\/div>\n<p>  <!--ScriptorEndFragment-->\n<\/div>\n<div>\n  <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-06-target.webp\"><img decoding=\"async\" class=\"alignnone size-full wp-image-257039\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-06-target.webp\" alt=\"Screenshot of the modernization agent asking the type of flow mode to use\" width=\"869\" height=\"357\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-06-target.webp 869w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-06-target-300x123.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-06-target-768x316.webp 768w\" sizes=\"(max-width: 869px) 100vw, 869px\" \/><\/a>\n<\/div>\n<div>\n<div>\n  <\/div>\n<div class=\"scriptor-paragraph\">\n    What Guided is going to do is it will pause and let you check its work.\n  <\/div>\n<\/div>\n<div>\n<\/div>\n<div>\n<\/div>\n<div>\n<div class=\"scriptor-paragraph\">\n    The agent will first assess our project and create a report. The guided mode allows us to review that report and make any changes to it. And &#8230; we can check that report in to source control. (It looks good &#8211; show it to your boss you&#8217;ll look super productive! \ud83d\ude09)\n  <\/div>\n<\/div>\n<div>\n<\/div>\n<div>\n<\/div>\n<div>\n<div class=\"scriptor-paragraph\">\n    Then it will create a plan to fix any issues and do the upgrade. Guided mode lets us review and update that plan should we want to. Guided mode shows us a step-by-step execution of the upgrade itself. You get the picture.\n  <\/div>\n<div>\n<h2>\n      Step 3: Review the assessment\n    <\/h2>\n<div class=\"scriptor-paragraph\">\n      The first thing it rolls through is the assessment. The assessment helps separate blockers, warnings, and informational findings before the upgrade itself starts to run.\n    <\/div>\n<div>\n      <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-07-assess-review.webp\"><img decoding=\"async\" class=\"alignnone size-full wp-image-257040\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-07-assess-review.webp\" alt=\"Screenshot of reviewing the assessment\" width=\"1919\" height=\"1031\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-07-assess-review.webp 1919w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-07-assess-review-300x161.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-07-assess-review-1024x550.webp 1024w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-07-assess-review-768x413.webp 768w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-07-assess-review-1536x825.webp 1536w\" sizes=\"(max-width: 1919px) 100vw, 1919px\" \/><\/a>\n    <\/div>\n<div>\n    <\/div>\n<div>\n    <\/div>\n<div>\n      The assessment helps you understand what must change first. In this sample, the modernization work includes moving from System.Web.Mvc patterns toward ASP.NET Core equivalents and moving the data layer from Entity Framework 6 to EF Core.\n    <\/div>\n<div>\n      <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-08-assess-approve.webp\"><img decoding=\"async\" class=\"alignnone size-full wp-image-257041\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-08-assess-approve.webp\" alt=\"Screenshot of the way to approve the assessment and continue\" width=\"870\" height=\"218\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-08-assess-approve.webp 870w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-08-assess-approve-300x75.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-08-assess-approve-768x192.webp 768w\" sizes=\"(max-width: 870px) 100vw, 870px\" \/><\/a>\n    <\/div>\n<div>\n<h2>\n        Step 4: Review the upgrade plan\n      <\/h2>\n<div class=\"scriptor-paragraph\">\n        Once you approve the assessment, the agent will start to create a plan on how it will do the upgrade and it&#8217;ll present you with some options on how it can do it.\n      <\/div>\n<\/p><\/div>\n<div>\n      <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-09-upgrade-options.webp\"><img decoding=\"async\" class=\"alignnone size-large wp-image-257042\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-09-upgrade-options-1024x476.webp\" alt=\"Screenshot of the upgrade options window for modernization\" width=\"1024\" height=\"476\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-09-upgrade-options-1024x476.webp 1024w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-09-upgrade-options-300x139.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-09-upgrade-options-768x357.webp 768w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-09-upgrade-options-1536x714.webp 1536w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-09-upgrade-options.webp 1598w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a>\n    <\/div>\n<div>\n    <\/div>\n<div>\n    <\/div>\n<div>\n      We could modify the options of how the agent creates the upgrade plan, but we&#8217;ll take the default.\n    <\/div>\n<div>\n      <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-10-upgrade-options-2.webp\"><img decoding=\"async\" class=\"alignnone size-large wp-image-257043\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-10-upgrade-options-2-1024x279.webp\" alt=\"screenshot of accepting the default options for upgrading.\" width=\"1024\" height=\"279\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-10-upgrade-options-2-1024x279.webp 1024w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-10-upgrade-options-2-300x82.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-10-upgrade-options-2-768x209.webp 768w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-10-upgrade-options-2.webp 1306w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a>\n    <\/div>\n<div>\n    <\/div>\n<div>\n      Then it produces the plan. It&#8217;s a good idea to read that through. This forms the basis of how the agent will upgrade the app.\n    <\/div>\n<div>\n    <\/div>\n<div>\n      <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-11-upgrade-options.webp\"><img decoding=\"async\" class=\"alignnone size-full wp-image-257044\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-11-upgrade-options.webp\" alt=\"Screenshot of the upgrade plan\" width=\"1001\" height=\"616\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-11-upgrade-options.webp 1001w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-11-upgrade-options-300x185.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-11-upgrade-options-768x473.webp 768w\" sizes=\"(max-width: 1001px) 100vw, 1001px\" \/><\/a>\n    <\/div>\n<\/p><\/div>\n<\/div>\n<div>\n  <!--ScriptorStartFragment--><\/p>\n<h3>\n    Step 5: Upgrade!<!--ScriptorEndFragment-->\n  <\/h3>\n<p>  <!--ScriptorStartFragment-->Approve the plan and the agent starts working through the tasks one at a time.<\/p>\n<p>  <!--ScriptorEndFragment--><\/p>\n<p>  <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-12-upgrade.webp\"><img decoding=\"async\" class=\"alignnone size-full wp-image-257045\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-12-upgrade.webp\" alt=\"screenshot of approving the plan in the github copilot chat window\" width=\"889\" height=\"805\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-12-upgrade.webp 889w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-12-upgrade-300x272.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-12-upgrade-768x695.webp 768w\" sizes=\"(max-width: 889px) 100vw, 889px\" \/><\/a> \u00a0 <!--ScriptorStartFragment-->Guided mode will pause between the tasks so you can check on its work.<\/p>\n<p>  <!--ScriptorEndFragment--><\/p>\n<p>  <!--ScriptorEndFragment--><\/p>\n<p>  <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-13-upgrade-process.webp\"><img decoding=\"async\" class=\"alignnone size-full wp-image-257046\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-13-upgrade-process.webp\" alt=\"Screenshot of ugided mode in copilot stopping to ask questions during the upgrade\" width=\"975\" height=\"403\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-13-upgrade-process.webp 975w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-13-upgrade-process-300x124.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-13-upgrade-process-768x317.webp 768w\" sizes=\"(max-width: 975px) 100vw, 975px\" \/><\/a> \u00a0 <!--ScriptorStartFragment-->Five tasks later, it&#8217;s done!<\/p>\n<p>  <!--ScriptorEndFragment--><\/p>\n<p>  <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-14-upgrade-complete.webp\"><img decoding=\"async\" class=\"alignnone size-full wp-image-257047\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-14-upgrade-complete.webp\" alt=\"Screenshot of GitHub Copilot reporting the upgrade process is finished\" width=\"1001\" height=\"901\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-14-upgrade-complete.webp 1001w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-14-upgrade-complete-300x270.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-14-upgrade-complete-768x691.webp 768w\" sizes=\"(max-width: 1001px) 100vw, 1001px\" \/><\/a> <\/p>\n<h2>\n    Verify it\n  <\/h2>\n<p>  <a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-15-complete.webp\"><img decoding=\"async\" class=\"alignnone size-large wp-image-257048\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-15-complete-1024x549.webp\" alt=\"Screenshot of the newly upgraded application running\" width=\"1024\" height=\"549\" srcset=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-15-complete-1024x549.webp 1024w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-15-complete-300x161.webp 300w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-15-complete-768x412.webp 768w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-15-complete-1536x824.webp 1536w, https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2026\/08\/modernize-15-complete.webp 1919w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a> <!--ScriptorStartFragment--><\/p>\n<div>\n  <\/div>\n<div class=\"scriptor-paragraph\">\n    F5 the application and it should start up. Now, of course AI did the work. And it may not have worked the first time through. You never get the same thing twice with AI. In that case, use Visual Studio&#8217;s GitHub Copilot debugging features and you should get it up and running very quickly.\n  <\/div>\n<div>\n  <\/div>\n<div class=\"scriptor-paragraph\">\n    And once the app does start up&#8230; it looks exactly the same! The modernization agent doesn&#8217;t upgrade the UX for you &#8211; that&#8217;s for you to vibe on your own.\n  <\/div>\n<h2>\n    Wrap-up\n  <\/h2>\n<p>  <!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\">\n    The app is upgraded to .NET 10. If you want you can use the GitHub Copilot modernization for .NET tooling to migrate it to Azure too.\n  <\/div>\n<p>  <!--ScriptorEndFragment--><\/p>\n<p>  <!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\">\n    We&#8217;ve created a course : <a href=\"https:\/\/github.com\/microsoft\/dotnet-modernization-for-beginners\"><span role=\"link\">.NET Modernization for Beginners<\/span><\/a> that goes more in-depth into both the upgrade and migration flows. Check it out. And of course, leave some comments on this post to let us know your experiences.\n  <\/div>\n<p>  <!--ScriptorEndFragment--><div  class=\"d-flex justify-content-center\"><a class=\"cta_button_link btn-primary mb-24\" href=\"https:\/\/github.com\/microsoft\/dotnet-modernization-for-beginners\" target=\"_blank\">View the .NET Modernization for Beginners course!<\/a><\/div> <\/p>\n<p>  <!--ScriptorEndFragment-->\n<\/div>\n<div>\n<div>\n<div>\n    <\/div>\n<\/p><\/div>\n<\/div>\n<p><!--ScriptorEndFragment--><\/p>\n<p><!--ScriptorEndFragment--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today I will modernize a .NET Framework application to .NET 10 using the GitHub Copilot modernization tooling built-in to Visual Studio. \u00a0 The tooling helps us upgrade applications running on legacy versions of .NET and also migrate them to Azure. Today we&#8217;re going to focus on the upgrade portion. \u00a0 And, the tooling will do [&hellip;]<\/p>\n","protected":false},"author":569,"featured_media":255385,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[6888,7041,155],"tags":[6924,6995],"class_list":["post-257033","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-copilot","category-modernization","category-visual-studio","tag-github-copilot","tag-modernization"],"acf":[],"blog_post_summary":"<p>Today I will modernize a .NET Framework application to .NET 10 using the GitHub Copilot modernization tooling built-in to Visual Studio. \u00a0 The tooling helps us upgrade applications running on legacy versions of .NET and also migrate them to Azure. Today we&#8217;re going to focus on the upgrade portion. \u00a0 And, the tooling will do [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/posts\/257033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/users\/569"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/comments?post=257033"}],"version-history":[{"count":1,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/posts\/257033\/revisions"}],"predecessor-version":[{"id":257082,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/posts\/257033\/revisions\/257082"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/media\/255385"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/media?parent=257033"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/categories?post=257033"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/tags?post=257033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}