このチュートリアルでは、最新の MSVC ビルド ツールにアップグレードして、GitHub Copilotを使用して 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クラス テンプレートはいくつかの場所で使用されますが、is_base_ofクラス テンプレートが完全な標準の一部に昇格されたため、MSVC の C++ 標準ライブラリでは使用できなくなりました。 これはブロック エラーです。 -
ID2D1Factory::GetDesktopDpi関数は非推奨です。 - 型の ATL 属性の
[uuid(_string_)]syntax は非推奨です。 - セットアップ アシスタントがアップグレードに失敗するプロジェクトがあります。 v120 MSVC ビルド ツールがインストールされていない場合 (おそらく)、これはブロック エラーです。
- ランタイム メモリ アクセス例外の原因となるウィンドウ処理コードにポインターの切り捨てがあります。
アップグレードに厳密に関連していない可能性がありますが、エージェントが必要に応じて修正できる警告がいくつかあります。 次の警告が表示されます。
- マルチバイト文字列とワイド文字列に関する警告の絞り込み。
- カスタム ビルド ステップでの出力ファイルの名前の入力ミス。
セットアップ
開発ツールのインストール
このチュートリアルを完了するには、C++ のGitHub Copilotモダン化エージェントの
リポジトリの複製
Visual Studioを開き、[スタート] ウィンドウで リポジトリを選択します。 スタート ウィンドウが表示されない場合は、 ファイル>スタート ウィンドウを使用して開くことができます。
リポジトリの場所として、「 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を優先する" や "ゼロの規則 (またはリソースの所有権が必要な場合は 3/5 の規則) に従う" などの規則があります。
予期される動作
Note
LLM ベースの AI エージェントの性質上、エージェントが実行する手順と生成される出力は、ここに示されているものとは異なる場合があります。
事前評価
エージェントはまず、ソース管理システムなど、実行されている環境を決定し、その目標を理解します。 ここでは、最新の MSVC を使用するようにプロジェクトをアップグレードしようとしていることを検出し、適切なシナリオを初期化します。 シナリオに関するメタデータを含む scenario.md ファイルと scenario-instructions.md ファイルが作成されます。
これらのファイルには、エージェントが 自動 モードまたは ガイド モードで動作するかどうか、コミットを行う方法、エージェントの進め 方 に影響するその他の情報などの情報が含まれています。 エージェントの操作中に後で任意の基本設定を表す場合、エージェントはそれらの基本設定を scenario-instructions.md ファイルに追加できます。
Assessment
初期化後、エージェントはプロジェクトのクリーン リビルドを実行し、ビルド出力でエラーと警告を検査することで、プロジェクトの評価を行います。 その情報とエージェントがリポジトリから収集するコンテキストを使用して、検出された問題と、アップグレード タスクのスコープ内またはスコープ外と見なされるかどうかを説明する assessment.md ファイルが生成されます。
エージェントが ガイド モードで動作している場合、エージェントはここで停止し、評価のレビューを要求します。 エージェントにメッセージを表示するか、Markdown ファイルを直接編集して必要な変更を行い、 計画 ステージに進みます。 エージェントが 自動 モードで動作している場合、エージェントは自動的に次のステージに進みます。 何かを変更する場合は、キャンセル ボタンを押してエージェントを停止し、変更を行い、Copilotチャット ウィンドウにプロンプト "Resume" を入力してエージェントを再開する必要があります。
この評価では、チュートリアルで前述したいくつかの問題を特定します。 一部の問題は、既存のエラーによって非表示になるため、後で表示されません。 心配はいりません。後で見つかります。 エージェントが後になって判明した問題について承認を求めるために一時停止するようにしたい場合は、その指示を scenario-instructions.md ファイルで指定できます。
計画
エージェントは、計画ステージを開始すると、スコープ内の問題をより深く分析し、生成された plan.md ファイルで考えられる解決策を提案します。 また、プランを実行するためのより構造化された手順と手順を提供する tasks.md ファイルも生成されます。
Assessment と同様に、エージェントの動作は、 ガイド付き モードまたは 自動 モードで動作するかどうかによって異なります。 ガイド付きモードで実行している場合、エージェントは、特定の方法で問題を修正するように指示したり、トレードオフのより詳細な説明を含む代替オプションを思い付くように依頼したりする機会を提供します。 また、コーディング規則や一部の問題に対する特別な検証手順など、他の制約を指定することもできます。
実行
プランを承認した後 (または 自動 モードで計画が完了した後)、エージェントは実行ステージに移動します。 ここでは、その前にあるタスクの処理を開始し、実行中に検出された新しい情報に適応します。 注意深く観察すると、エージェントが以前に隠されていた問題を検出し、それに応じてその計画を調整していることがわかります。
実行ステージの最終的な結果は、スコープ内の問題を解決するリポジトリへの一連のコミットと、正常にビルドできるプロジェクトです。 ただし、クリーン コンパイルは、プロジェクトをアップグレードするための手順の 1 つに過ぎません。 また、正しく実行する必要があります。
デバッガー エージェントを使用してランタイムの問題を解決する
ブラウザーを起動する
ソリューション エクスプローラーで、Browser プロジェクトを右クリックし、 スタートアップ プロジェクトとして設定をクリックします。 次に、F5 キーを押すか、ファイル メニューから [デバッグの開始]>を選択して、Hilo ブラウザーのデバッガー セッションを起動します。
デバッグ セッションは、ハンドルされないメモリ アクセス例外でほぼ即座に中断されます。
メモリ読み取りアクセスの例外を調べる
デバッガー エージェントを使用してこの例外を分析し、修正プログラムを実装します。 例外情報ウィンドウの Analyze with Copilot ボタンをクリックしてデバッガー エージェントを起動します。
デバッガー エージェントは、デバッグとプログラムの状態情報を使用してランタイム エラーの根本原因を特定し、ソース コードを分析してソリューションを実装します。 この場合、エージェントは、無効なメモリ アクセスが、64 ビット ポインターを 32 ビットのみに切り捨てた不適切なキャスト操作が原因であることを識別します。 このポインターは無効になり、無効なメモリ位置を指しているため、例外が発生します。 正しい型を取得する別の方法を提案し、切り捨てを回避します。
変更を適用する
提案された変更を受け入れ、 Shift + F5* キーを押してデバッグ セッションを停止し、 F5 キーを押して新しいセッションを開始します。 プロジェクトは変更と共に再コンパイルされ、Visual Studio更新されたアプリケーションが起動されます。 [Hilo Browser]\(Hilo ブラウザー\) ウィンドウが表示されます。
アプリケーションの探索に時間を費やすと、実行時の問題が増える可能性があります。 その他の問題は、読者の演習として残します。 新しいエージェント ツールを使用して、最終目標に迅速に到達することを忘れないでください。
まとめ
このチュートリアルでは、GitHub Copilot エージェントが古い C++ プロジェクトの最新化を大幅に促進する方法を示しました。 最新化エージェントとデバッガー エージェントは連携して、初期評価からランタイム検証までのアップグレード プロセスを合理化できます。
主な利点
- 自動問題検出: エージェントは、アップグレードによって発生する破壊的変更、非推奨、互換性の問題を体系的に特定します。
- インテリジェントなソリューション: エージェントは手動修正を必要とするのではなく、コード コンテキストを分析し、コードベースに合わせた適切なソリューションを提案します。
- 効率性: 手動作業に数日または数週間かかる場合がある作業は数時間で完了し、エージェントはビルド エラーと実行時の問題の両方を処理します。
- ガイド付きモードまたは自動モード: 快適レベルとプロジェクトの要件に基づいて、ハンズオン ガイダンスまたは完全に自動化された実行のいずれかを選択します。
- 学習と適応: エージェントは、進行状況に応じて隠れた問題を検出し、それに応じてアプローチを調整し、包括的なカバレッジを確保します。