本演练演示如何使用 GitHub Copilot 将其升级到最新的 MSVC 生成工具来现代化 Hilo 示例项目。 你将使用现代化代理来识别和解决问题,然后使用调试器代理修复运行时问题。
关于 Hilo
Hilo 是 2012 年Microsoft开发的示例项目,演示如何使用“新式”C++、XAML 和Windows 运行时创建面向Windows 8的应用程序。 Hilo 应用程序是一个照片浏览应用程序,还包括批注和共享功能。 我们已在 2015 中停止更新示例,并将此示例的源代码和其他以前发布的 C++ 示例存档在 VCSamples GitHub 存储库。
现代化挑战
在升级 Hilo 以使用较新的 MSVC 生成工具版本后,代理会发现并解决几个问题。 以下是使用 Microsoft C++ (MSVC) 生成工具版本 14.51 时出现的问题。
- 类
std::tr1::is_base_of模板在多个位置使用,但在 MSVC 的 C++ 标准库中不再可用,因为is_base_of类模板已提升为完整标准的一部分。 这是一个阻塞性错误。 - 函数
ID2D1Factory::GetDesktopDpi已弃用。 -
[uuid(_string_)]类型上的 ATL 属性的语法已弃用。 - 有一个项目,设置助手无法升级。 如果没有安装 v120 MSVC 生成工具(可能),则这是阻止错误。
- 窗口处理代码中有一个指针截断,导致运行时内存访问异常。
有一些其他警告可能与升级不严格相关,但代理可以选择修复。 这些警告包括:
- 缩小多字节字符串和宽字符字符串的警告范围。
- 自定义生成步骤中输出文件的名称拼写错误。
Setup
安装开发工具
若要完成本演练,你需要按照 GitHub Copilot 适用于 C++ 的现代化代理安装说明进行操作。
克隆存储库
打开Visual Studio,然后从“开始”窗口中选择Clone 存储库。 如果未显示“开始”窗口,可以通过 文件>启动窗口打开它。
对于存储库位置,请输入: https://github.com/microsoft/VCSamples.git 在系统上选择适当的路径以克隆存储库,然后单击“ 克隆 ”按钮
开始升级
在 Visual Studio 中加载Hilo.sln
克隆存储库后,在 <repo-root>/VC2013Samples/Hilo/C++/Hilo.sln 处加载解决方案文件。 在本演练中,我们将使用 Visual Studio 2013 附带的版本。
使用设置助手升级项目文件
如果没有安装 v120 工具,Visual Studio应启动“设置助手”窗口,指导你处理缺少的组件。 看到此窗口时,应选择“ 全部重定目标 ”,然后单击“ 应用”。 如果该窗口未显示,可以通过在“文件”菜单中单击 Project>重新定向解决方案 打开它。
启动Copilot现代化代理
设置助理重新定位项目后,应会收到一条信息栏消息,其中包含用于启动现代化代理的链接。 单击 Run GitHub Copilot modernization for C++ 链接将启动升级过程。
如果未显示信息栏,可以通过右键单击 解决方案资源管理器 中的解决方案并单击 Modernize 来启动代理。 如果转到该路由,可以通过将提示I just updated MSVC Build Tools. Resolve any upgrade issues.发送到Copilot 对话助手来启动升级。
与代理协作
如何与代理交互以获取最佳结果
.NET现代化代理与 C++ 代理共享相同的基础交互模型。 关于 .NET 的“使用现代化代理”文档详细介绍了通用模式。 请记住,那篇文章中的示例和场景是 .NET 特有的,不能直接应用于 C++。
对于 C++ 升级,其他一些提示可帮助代理性能良好:
- 请明确说明范围。 与其要求代理一次升级所有内容,不如告诉代理要关注哪些项目、库或诊断。 例如:“修复
NetworkClient项目中的 C4996 弃用警告。” - 描述您希望代理修复的诊断信息。 如果知道工具集升级引入的特定警告或错误代码,请提前告知代理。 这些附加说明有助于代理确定优先级,并避免在无关问题上花费时间。
- 确保已启用 C/C++ 代码编辑工具。 在开始之前,请验证设置中是否提供了所需的工具。 有关详细信息,请参阅 C/C++ 代码编辑工具。
- 使用自定义指令编入编码规范。 将命名约定、首选 API 或应避免的模式等准则写入 自定义说明 中。 代理在整个升级过程中读取并遵循这些说明。 有用的 C++ 示例包括以下约定,例如 “在类型明显时,优先使用
auto” 和 “遵循零法则(或者在资源所有权需要时遵循三法则/五法则)。”
预期行为
Note
由于基于 LLM 的 AI 代理的性质,代理采用的步骤及其生成的输出可能与此处所示的步骤不同。
预评估
代理首先确定其在其中运行的环境,例如源代码管理系统,并了解其目标。 在本例中,它会检测到你正在尝试升级项目以使用最新的 MSVC 并初始化相应的方案。 它创建一个 scenario.md 文件和一个 scenario-instructions.md 文件来包含有关方案的元数据。
这些文件包含诸如代理是否应在 自动 模式或 引导 模式下操作、提交提交策略以及影响代理 应如何 继续的其他信息等信息。 如果在代理操作过程中稍后表达任何首选项,代理可能会将这些首选项添加到 scenario-instructions.md 该文件。
Assessment
初始化后,代理会通过对项目执行一次干净重建并检查构建输出中的错误和警告,对项目进行评估。 使用该信息以及代理从存储库中收集的上下文,它会生成一个 assessment.md 文件,描述它发现的问题,以及它是否将其视为升级任务的范围或范围外的问题。
如果代理以 引导 模式运行,代理会在此停止,并请求你审核该评估。 通过提示代理或直接编辑 Markdown 文件,然后继续进入 规划 阶段,进行任何所需的更改。 如果代理以 自动 模式运行,代理会自动继续执行下一阶段。 若要更改某些内容,需要在Copilot聊天窗口中键入提示“恢复”来停止代理,按取消按钮、进行更改并恢复代理。
该评估指出了前面的演练过程中提到的几个问题。 某些问题直到以后才会出现,因为它们被现有错误隐藏。 别担心,稍后会发现它们。 如果你希望代理在发现任何较晚发现的问题时暂停,以便获得你的批准,可以在你的 scenario-instructions.md 文件中指定这些说明。
Planning
代理启动计划阶段后,它会对范围内的问题进行更深入的分析,并在生成的 plan.md 文件中提出可能的解决方案。 它还会生成一个 tasks.md 文件,该文件提供用于执行该计划的更多结构化步骤和说明。
与评估一样,代理会执行什么操作,取决于它是在 引导式 模式还是 自动 模式下运行。 如果以 引导 模式运行,代理将有机会引导它以某些方式解决问题,甚至要求它拿出其他选项,并更详细地说明权衡。 还可以为某些问题指定其他约束,例如编码约定或特殊验证步骤。
执行
批准计划(或者在 “自动 ”模式下完成计划后),代理将移动到执行阶段。 在这里,它开始处理眼前的任务,并根据执行过程中发现的新信息进行调整。 通过仔细观察,你将看到代理发现以前隐藏的问题并相应地调整其计划。
执行阶段的最终成果是:你的代码仓库中会有一系列提交记录,用于解决既定范围内的问题,并且项目现在能够成功构建。 但是,干净编译只是升级项目的步骤之一。 它还需要正常运行。
使用调试器代理解决运行时问题
启动浏览器
在 解决方案资源管理器 中,右键单击 Browser 项目,然后单击 Set 作为启动项目。 然后,通过按 F5 或从文件菜单中选择 “调试>开始调试 ”来启动 Hilo 浏览器的调试程序会话。
调试会话在未处理的内存访问异常上应几乎立即中断。
检查内存读访问异常
我们将使用调试器代理分析此异常并实现修补程序。 单击异常信息窗口中的 Analyze with Copilot 按钮,以启动调试器代理。
调试器代理使用调试和程序状态信息来确定运行时错误的根本原因,然后分析源代码以实现解决方案。 在这种情况下,代理识别出,无效内存访问是由一次不当的类型转换操作导致的,该操作将一个 64 位指针截断为仅 32 位。 该指针现在无效,指向无效的内存位置,这会导致异常。 它提出了另一种获得正确类型的方法,从而避免截断。
应用更改
接受建议的更改,按 Shift + F5*停止调试会话,然后按 F5 启动新会话。 项目使用更改重新编译,Visual Studio启动更新的应用程序。 现在应会看到 Hilo 浏览器窗口出现。
如果在探索应用程序时花费时间,可能会发现更多的运行时问题。 我们将其他问题留作读者练习。 只需记住使用新的代理工具更快地实现最终目标。
Summary
本演练演示了GitHub Copilot代理如何显著加快旧 C++ 项目的现代化。 现代化代理和调试器代理可以协同工作,以简化从初始评估到运行时验证的升级过程。
主要优势
- 自动化问题检测:智能体会系统地识别出升级过程中出现的破坏性变更、弃用项和兼容性问题。
- 智能解决方案:代理无需手动修复,而是分析代码上下文,并建议针对代码库定制的相应解决方案。
- 效率:原本可能需要数天或数周的手动工作,如今只需几小时即可完成,智能体还能处理构建错误和运行时问题。
- 引导模式或自动模式:根据舒适级别和项目要求在动手指南或完全自动化执行之间进行选择。
- 学习和适应:代理在进展过程中发现隐藏的问题,并相应地调整方法,确保全面覆盖。