攻略:升級 Microsoft C++(MSVC)Hilo 範例專案的建置工具

這份攻略展示了如何使用 GitHub Copilot 將 Hilo 範例專案現代化,升級到最新的 MSVC 建置工具。 你會用現代化代理程式來識別並解決問題,然後用除錯器代理程式來修復執行時的問題。

關於希洛

Hilo 是 Microsoft 於 2012 年開發的一個範例專案,旨在展示如何使用「現代」C++、XAML 及 Windows 執行階段 來開發針對 Windows 8 的應用程式。 Hilo 應用程式是一款照片瀏覽應用程式,同時包含註解與分享功能。 我們於 2015 年停止更新範例,並將此範例及其他先前發佈的 C++ 範例的原始碼存檔於 VCSamples GitHub repository

Hilo 主應用程式視窗的截圖,顯示使用者的 Pictures 資料夾內容。

現代化挑戰

代理程式在升級 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。 如果開始視窗沒有出現,你可以透過 檔案>開始視窗開啟它。

Visual Studio 開始視窗的截圖,克隆的儲存庫連結被標示出來。

儲存庫位置請輸入: https://github.com/microsoft/VCSamples.git。 在系統上選擇適合的路徑來複製儲存庫,然後點擊 複製 按鈕

Visual Studio「複製存放庫」視窗的螢幕擷取畫面,其中已填妥必要欄位,且「複製」按鈕已反白顯示。

開始升級

Visual Studio載入Hilo.sln

複製儲存庫後,載入解決方案檔案。<repo-root>/VC2013Samples/Hilo/C++/Hilo.sln 這次攻略使用的是隨 Visual Studio 2013 附帶的版本。

使用設定助理來升級專案檔案

如果你還沒安裝 v120 工具,Visual Studio 應該會啟動設定助理視窗,引導你處理缺少的元件。 當你看到這個視窗時,應該選擇「 全部重新投放 」並點選 套用。 如果視窗沒有出現,你可以從檔案選單點擊 Project>Retarget solution 開啟。

Setup Assistant 視窗的螢幕擷圖,顯示 Hilo 專案。所有專案皆已選取以重新指定目標,且「套用」按鈕已反白顯示。

啟動 Copilot 現代化代理程式

設定助理重新定位專案後,你應該會收到一個資訊列訊息,裡面有啟動現代化代理的連結。 點擊 Run GitHub Copilot modernization for C++ 連結即可啟動升級流程。

Visual Studio 中啟動現代化代理時資訊欄訊息的截圖。

如果資訊列沒有出現,你可以在 方案總管 中右鍵點擊解決方案,然後點選 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

scenario-instructions.md 檔案內容的截圖。

Assessment

初始化後,代理程式會對專案進行乾淨重建,並檢查建置輸出是否有錯誤與警告。 利用這些資訊及代理從儲存庫收集的上下文,它會產生 assessment.md 一個檔案,描述它發現的問題,以及是否認為這些問題屬於升級任務的範圍內或外範圍。

一張渲染後的 assessment.md 檔案內容截圖。

若代理人處於 引導式 模式,則會在此停止,並請您檢閱評估結果。 透過提示代理或直接編輯 Markdown 檔案來進行任何想要的變更,然後繼續進入 規劃 階段。 若代理處於 自動 模式,則自動進入下一階段。 如果你想變更內容,必須按下取消按鈕來停止代理程式,完成變更後,再於 Copilot 聊天視窗中輸入提示詞 "Resume",以恢復代理程式。

評估指出了前述導覽中提到的幾個問題。 有些問題因為被現有錯誤掩蓋,直到後期才會出現。 別擔心,這些東西後來會被發現。 如果你希望代理人暫停等待你批准任何晚發現的問題,可以在檔案 scenario-instructions.md 中註明這些指示。

Planning

一旦代理人開始規劃階段,會對範圍內的問題進行更深入的分析,並在生成 plan.md 的檔案中提出可能的解決方案。 它也會產生 tasks.md 一個檔案,提供更結構化的步驟與執行計畫的指示。

plan.md 檔案渲染內容的截圖。

就像評估一樣,代理的操作取決於它是在 引導 模式還是 自動 模式運作。 若以 引導 模式運行,代理會讓你以特定方式指示它解決問題,甚至要求它提出更詳細的取捨描述的替代方案。 你也可以指定其他限制,例如編碼慣例或針對某些議題的特殊驗證步驟。

處決

當你核准計畫(或在 自動 模式下完成規劃後),代理人會進入執行階段。 在這裡,它開始處理眼前的任務,並根據執行過程中發現的新資訊進行調整。 只要仔細觀察,你會發現代理人發現先前隱藏的問題,並相應調整計畫。

特工在執行階段中對新發現問題做出反應的截圖。

執行階段的最終成果,是你存放庫中一系列可解決既定範圍內問題的提交紀錄,以及一個現在可以成功建置的專案。 然而,乾淨的編譯只是升級專案的其中一個步驟。 它也必須正常運作。

使用 Debugger agent 來解決執行時的問題

啟動瀏覽器

方案總管,右鍵點擊 Browser 專案,點選 Set as startup project。 接著按下 F5 或從檔案選單中選擇 「除錯>開始除錯 」,啟動 Hilo 瀏覽器的除錯器會話。

除錯工作階段幾乎應該會立刻因未處理的記憶體存取異常而中斷。

這是首次啟動 Hilo 瀏覽器時記憶體讀取異常的截圖。

檢查記憶體讀取存取例外狀況

我們將使用 Debugger 代理程式分析這個例外並實作修正。 點擊例外資訊視窗中的 Analyze with Copilot 按鈕即可啟動除錯器代理程式。

Hilo 瀏覽器例外視窗的螢幕擷圖,其中「使用 Copilot 分析」按鈕已醒目標示。

除錯器代理利用除錯與程式狀態資訊來判斷執行時錯誤的根本原因,然後分析原始碼以實作解決方案。 在此情況下,代理會發現無效記憶體存取是因為一個不正確的鑄造操作,導致一個 64 位元指標被截斷成僅 32 位元。 該指標現在已經失效,並指向一個無效的記憶體位置,因此導致例外。 它提出了另一種取得正確型別的方法,並可避免截斷。

套用變更

接受它建議的變更,按下 Shift + F5* 停止除錯工作階段,然後按 F5 開啟新工作階段。 專案會隨變更重新編譯,Visual Studio 啟動更新後的應用程式。 你現在應該會看到 Hilo 瀏覽器視窗出現。

Hilo 主應用程式視窗的截圖,顯示使用者的 Pictures 資料夾內容。

如果你花時間探索這個應用程式,可能會發現更多執行時的問題。 其他議題我們留給讀者作為練習。 只要記得善用你的新代理工具,更快達成最終目標就好。

總結

本次導覽展示了 GitHub Copilot 代理如何大幅加速舊有 C++ 專案的現代化。 現代化代理程式與除錯代理程式可協同運作,簡化從初始評估到執行時驗證的升級流程。

主要優點

  • 自動問題偵測:代理程式系統性地識別因升級而產生的破壞性變更、棄用性及相容性問題。
  • 智慧解決方案:代理程式不需手動修正,而是分析程式碼上下文,並提出適合你程式碼庫的解決方案。
  • 效率:可能需要數天甚至數週的手動工作,能在數小時內完成,代理程式同時處理建置錯誤與執行時問題。
  • 導引式或自動模式:根據您的舒適度與專案需求,選擇實務指導或全自動執行。
  • 學習與適應:代理人在進展過程中發現隱藏問題,並相應調整策略,確保全面保障。