這份攻略展示了如何使用 GitHub Copilot 將 Hilo 範例專案現代化,升級到最新的 MSVC 建置工具。 你會用現代化代理程式來識別並解決問題,然後用除錯器代理程式來修復執行時的問題。
關於希洛
Hilo 是 Microsoft 於 2012 年開發的一個範例專案,旨在展示如何使用「現代」C++、XAML 及 Windows 執行階段 來開發針對 Windows 8 的應用程式。 Hilo 應用程式是一款照片瀏覽應用程式,同時包含註解與分享功能。 我們於 2015 年停止更新範例,並將此範例及其他先前發佈的 C++ 範例的原始碼存檔於 VCSamples GitHub repository。
現代化挑戰
代理程式在升級 Hilo 以使用較新的 MSVC 建置工具版本後,發現並解決了幾個問題。 以下是使用 Microsoft C++(MSVC)建置工具版本 14.51 時遇到的問題。
- 類別
std::tr1::is_base_of範本在多個地方被使用,但由於is_base_of類別範本被推廣為完整標準的一部分,因此已不再在 MSVC 的 C++ 標準函式庫中提供。 這是封鎖性錯誤。 - 該
ID2D1Factory::GetDesktopDpi函式已被棄用。 - 用於型別的
[uuid(_string_)]ATL 屬性語法已遭淘汰。 - 有一個專案無法由 Setup Assistant 升級。 如果你沒有安裝 v120 MSVC 建置工具(很可能是),那就是阻塞錯誤。
- 視窗處理程式碼中有一個指標截斷會導致執行時記憶體存取異常。
還有一些其他警告,可能不完全與升級有關,但客服人員可以選擇性地修正。 這些警告包括:
- 針對多位元組字串和寬字串的警告範圍縮小。
- 在自訂建置步驟中,輸出檔名稱中出現的打字錯誤。
設定
安裝開發工具
為了完成本逐步解說,你需要依照 適用於 C++ 的 GitHub Copilot 現代化代理程式安裝指示操作。
複製存放庫
打開Visual Studio,從開始視窗選擇 Clone a repository。 如果開始視窗沒有出現,你可以透過 檔案>開始視窗開啟它。
儲存庫位置請輸入: https://github.com/microsoft/VCSamples.git。 在系統上選擇適合的路徑來複製儲存庫,然後點擊 複製 按鈕
開始升級
Visual Studio載入Hilo.sln
複製儲存庫後,載入解決方案檔案。<repo-root>/VC2013Samples/Hilo/C++/Hilo.sln 這次攻略使用的是隨 Visual Studio 2013 附帶的版本。
使用設定助理來升級專案檔案
如果你還沒安裝 v120 工具,Visual Studio 應該會啟動設定助理視窗,引導你處理缺少的元件。 當你看到這個視窗時,應該選擇「 全部重新投放 」並點選 套用。 如果視窗沒有出現,你可以從檔案選單點擊 Project>Retarget solution 開啟。
啟動 Copilot 現代化代理程式
設定助理重新定位專案後,你應該會收到一個資訊列訊息,裡面有啟動現代化代理的連結。 點擊 Run GitHub Copilot modernization for C++ 連結即可啟動升級流程。
如果資訊列沒有出現,你可以在 方案總管 中右鍵點擊解決方案,然後點選 Modernize 來啟動代理程式。 如果你走這條路,可以先把提示符 I just updated MSVC Build Tools. Resolve any upgrade issues. 發送給 Copilot Chat 來開始升級。
與經紀人合作
如何與客服人員互動以獲得最佳結果
.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 聊天視窗中輸入提示詞 "Resume",以恢復代理程式。
評估指出了前述導覽中提到的幾個問題。 有些問題因為被現有錯誤掩蓋,直到後期才會出現。 別擔心,這些東西後來會被發現。 如果你希望代理人暫停等待你批准任何晚發現的問題,可以在檔案 scenario-instructions.md 中註明這些指示。
Planning
一旦代理人開始規劃階段,會對範圍內的問題進行更深入的分析,並在生成 plan.md 的檔案中提出可能的解決方案。 它也會產生 tasks.md 一個檔案,提供更結構化的步驟與執行計畫的指示。
就像評估一樣,代理的操作取決於它是在 引導 模式還是 自動 模式運作。 若以 引導 模式運行,代理會讓你以特定方式指示它解決問題,甚至要求它提出更詳細的取捨描述的替代方案。 你也可以指定其他限制,例如編碼慣例或針對某些議題的特殊驗證步驟。
處決
當你核准計畫(或在 自動 模式下完成規劃後),代理人會進入執行階段。 在這裡,它開始處理眼前的任務,並根據執行過程中發現的新資訊進行調整。 只要仔細觀察,你會發現代理人發現先前隱藏的問題,並相應調整計畫。
執行階段的最終成果,是你存放庫中一系列可解決既定範圍內問題的提交紀錄,以及一個現在可以成功建置的專案。 然而,乾淨的編譯只是升級專案的其中一個步驟。 它也必須正常運作。
使用 Debugger agent 來解決執行時的問題
啟動瀏覽器
在 方案總管,右鍵點擊 Browser 專案,點選 Set as startup project。 接著按下 F5 或從檔案選單中選擇 「除錯>開始除錯 」,啟動 Hilo 瀏覽器的除錯器會話。
除錯工作階段幾乎應該會立刻因未處理的記憶體存取異常而中斷。
檢查記憶體讀取存取例外狀況
我們將使用 Debugger 代理程式分析這個例外並實作修正。 點擊例外資訊視窗中的 Analyze with Copilot 按鈕即可啟動除錯器代理程式。
除錯器代理利用除錯與程式狀態資訊來判斷執行時錯誤的根本原因,然後分析原始碼以實作解決方案。 在此情況下,代理會發現無效記憶體存取是因為一個不正確的鑄造操作,導致一個 64 位元指標被截斷成僅 32 位元。 該指標現在已經失效,並指向一個無效的記憶體位置,因此導致例外。 它提出了另一種取得正確型別的方法,並可避免截斷。
套用變更
接受它建議的變更,按下 Shift + F5* 停止除錯工作階段,然後按 F5 開啟新工作階段。 專案會隨變更重新編譯,Visual Studio 啟動更新後的應用程式。 你現在應該會看到 Hilo 瀏覽器視窗出現。
如果你花時間探索這個應用程式,可能會發現更多執行時的問題。 其他議題我們留給讀者作為練習。 只要記得善用你的新代理工具,更快達成最終目標就好。
總結
本次導覽展示了 GitHub Copilot 代理如何大幅加速舊有 C++ 專案的現代化。 現代化代理程式與除錯代理程式可協同運作,簡化從初始評估到執行時驗證的升級流程。
主要優點
- 自動問題偵測:代理程式系統性地識別因升級而產生的破壞性變更、棄用性及相容性問題。
- 智慧解決方案:代理程式不需手動修正,而是分析程式碼上下文,並提出適合你程式碼庫的解決方案。
- 效率:可能需要數天甚至數週的手動工作,能在數小時內完成,代理程式同時處理建置錯誤與執行時問題。
- 導引式或自動模式:根據您的舒適度與專案需求,選擇實務指導或全自動執行。
- 學習與適應:代理人在進展過程中發現隱藏問題,並相應調整策略,確保全面保障。