使用 GitHub Copilot 对 .NET 应用进行现代化升级

GitHub Copilot 应用现代化是 Visual Studio 中由 AI 提供支持的代理,可帮助你将 .NET 项目升级到较新版本并将应用程序迁移到 Azure。 本文指导你完成使用此工具实现 .NET 应用程序现代化的过程,从初始评估到最终验证。

新式化代理分析项目和依赖项,创建升级计划,并在整个过程中协助代码修复。 它支持从旧版 .NET 升级到最新版本,包括从 .NET Framework 迁移到新式 .NET。

先决条件

在开始之前,请确保满足以下要求:

启动升级过程

升级的第一步是通过与 GitHub Copilot 交互来生成计划。 按照以下步骤启动升级:

  1. 在 Visual Studio 中打开 .NET 项目或解决方案。

  2. 使用以下方法之一访问 GitHub Copilot 应用现代化代理:

    右键单击 解决方案资源管理器 中的解决方案或项目,然后选择 “现代化”。

    —或—

    打开 GitHub Copilot 聊天 窗口,然后键入 @modernize 升级或迁移请求。

  3. 请向代理告知您要升级或迁移的内容。

生成升级计划

该过程启动后,Copilot 会分析项目及其依赖项,然后询问有关升级的一系列问题。 回答这些问题后,会以 Markdown 文件的形式编写升级计划。

若要生成和自定义您的计划,请执行以下步骤:

  1. 回答 Copilot 关于升级要求和首选项的问题。
  2. 在 Markdown 文件中查看生成的升级计划。
  3. (可选)编辑 Markdown 文件以更改升级步骤或添加更多上下文。
  4. 如果对计划感到满意,请告知 Copilot 继续升级。

注意

计划基于项目的依赖关系生成。 如果以无法完成迁移路径的方式修改计划,则升级不会成功。 例如,如果 项目 A 依赖于 项目 B 并从升级计划中删除 项目 B ,升级 项目 A 可能会失败。

以下代码片段演示了计划的结构:

# .NET 9.0 Upgrade Plan

## Execution Steps

1. Validate that an .NET 9.0 SDK required for this upgrade is installed on the machine and if not, help to get it installed.
2. Ensure that the SDK version specified in global.json files is compatible with the .NET 9.0 upgrade.
3. Upgrade projects to .NET 9.0.
  - 3.1. Upgrade RazorMovie.csproj
  - 3.2. Upgrade RazorMovie.Tests.csproj
4. Run unit tests to validate upgrade in the projects listed below:
  - RazorMovie.Tests.csproj

## Settings

This section contains settings and data used by execution steps.

### Aggregate NuGet packages modifications across all projects

NuGet packages used across all selected projects or their dependencies that need version update in projects that reference them.

| Package Name                                     | Current Version     | New Version | Description              |
|:-------------------------------------------------|:-------------------:|:-----------:|:-------------------------|
| HtmlSanitizer                                    | 7.1.542             | 9.0.884     | Security vulnerability   |
| Microsoft.Data.SqlClient                         | 4.0.5               | 6.0.2       | Deprecated               |
| Microsoft.EntityFrameworkCore.Design             | 6.0.0-rtm.21467.1   | 9.0.5       | Recommended for .NET 9.0 |
| Microsoft.EntityFrameworkCore.SqlServer          | 6.0.0-rc.1.21452.10 | 9.0.5       | Recommended for .NET 9.0 |
| Microsoft.EntityFrameworkCore.Tools              | 6.0.0-rc.1.21452.10 | 9.0.5       | Recommended for .NET 9.0 |
| Microsoft.VisualStudio.Web.CodeGeneration.Design | 6.0.0-rc.1.21464.1  | 9.0.0       | Recommended for .NET 9.0 |

...

执行升级

升级计划准备就绪后,请告知 Copilot 开始升级。 升级过程启动后,Copilot 会让你知道它在聊天窗口中执行的作,并打开 “升级进度详细信息” 文档,其中列出了每个步骤的状态。 如果遇到问题,Copilot 会暂停并询问你的方向或帮助解决这些问题。

升级过程中的每个主要步骤都提交到本地 Git 存储库。

查看升级结果

升级完成后,将生成描述升级的每个步骤的报告。 该工具为升级过程的每个部分创建 Git 提交,以便可以轻松回滚更改或获取有关更改的详细信息。 报告包含 Git 提交哈希,并提供后续 步骤 部分,描述升级完成后应执行的步骤。

以下示例显示了包含测试失败的已完成升级的报告:

# .NET 9 Upgrade Report

## Project modifications

| Project name     | Old Target Framework | New Target Framework | Commits            |
|:-----------------|:--------------------:|:--------------------:|--------------------|
| RazorMovie       | net6.0               | net9.0               | af8cf633, aa61a18d |
| MvcMovie         | net6.0               | net9.0               | cc8c9015           |
| WpfMovie         | net6.0-windows       | net9.0-windows       | 9c4b13f9           |
| RazorMovie.Tests | net6.0               | net9.0               | b8d85e97           |
| MvcMovie.Tests   | net6.0               | net9.0               | b8d85e97           |
| WpfMovie.Tests   | net6.0-windows       | net9.0-windows7.0    | b8d85e97           |

## NuGet Packages

| Package Name                                     | Old Version         | New Version | Commit Id |
|:-------------------------------------------------|:-------------------:|:-----------:|-----------|
| HtmlSanitizer                                    | 7.1.542             | 9.0.884     | af8cf633  |
| Microsoft.Data.SqlClient                         | 4.0.5               | 6.0.2       | bf8deeac  |
| Microsoft.EntityFrameworkCore.Design             | 6.0.0-rtm.21467.1   | 9.0.5       | bf8deeac  |
| Microsoft.EntityFrameworkCore.SqlServer          | 6.0.0-rc.1.21452.10 | 9.0.5       | bf8deeac  |
| Microsoft.EntityFrameworkCore.Tools              | 6.0.0-rc.1.21452.10 | 9.0.5       | bf8deeac  |
| Microsoft.VisualStudio.Web.CodeGeneration.Design | 6.0.0-rc.1.21464.1  | 9.0.0       | bf8deeac  |

## All commits

| Commit ID | Description                                             |
|:----------|:--------------------------------------------------------|
| af8cf633  | Update HtmlSanitizer package in RazorMovie.csproj       |
| aa61a18d  | Upgrade target framework in RazorMovie.csproj           |
| cc8c9015  | Upgrade to .NET 9 and update dependencies               |
| bf8deeac  | Update package references in MvcMovie.csproj            |
| 9c4b13f9  | Update WpfMovie.csproj to target .NET 9.0               |
| b8d85e97  | Update test projects to .NET 9 and enhance dependencies |

## Test Results

| Project Name           | Passed | Failed | Skipped |
|:-----------------------|:------:|:------:|:-------:|
| RazorMovie.Tests       |   0    |   0    |    0    |
| MvcMovie.Tests         |   2    |   0    |    0    |
| WpfMovie.Tests         |   6    |   1    |    0    |

## Next steps

- Review the test results and address the single failing test in `WpfMovie.Tests`.
- Ensure all updated NuGet packages are compatible with your application.
- Leverage new features and improvements in .NET 9.0 for your projects.

后续步骤

完成升级过程后:

  • 查看生成的升级报告和任何测试结果。
  • 解决可能仍然存在的任何失败的测试或编译错误。
  • 确保所有更新的 NuGet 包都与应用程序兼容。
  • 彻底测试应用程序,验证升级是否成功。
  • 应用升级后的 .NET 版本中提供的新功能和改进。