GitHub Copilotモダン化を使用してWPF アプリを.NETにアップグレードする

この記事では、GitHub Copilot モダン化エージェントを使用して、WPF デスクトップ アプリを.NETにアップグレードする手順について説明します。 エージェントはエディターで実行され、プロジェクトが分析され、評価、計画、実行という 3 段階のワークフローが実行されます。

この例では、メイン プロジェクトとクラス ライブラリで構成される小さな .NET Framework WPF アプリである Matching Game サンプルを使用しています。

前提条件

ヒント

開始する前に、ソース管理やコピーなどのコードのバックアップを作成してください。

ソリューションを開く

照合ゲーム プロジェクトは、.NET Framework 4.5 を対象としています。 Visual Studio、ソリューションを開くときに、サポートされているバージョンの .NET Framework にプロジェクトを再ターゲットするように求められます。

  1. Visual Studioで MatchingGame ソリューションを開きます。
  2. Visual Studio、ターゲット フレームワークがインストールされていないダイアログが表示されます。
  3. [ターゲットを .NET Framework 4.8 に更新する (推奨)]、[続行] の順に選択します。
  4. [Git の変更] ウィンドウを開き、再ターゲットの変更をコミットします。

Visual Basicに関する重要な注意事項

GitHub Copilotモダン化エージェントは、Visual Basic .NET プロジェクトを完全にサポートしていません。 エージェントには、C# プロジェクトが確実にアップグレードされるように特別に設計されたガードレールが含まれており、これらのガードレールが VB プロジェクトの分析と実行を妨げている。 ソリューションに VB プロジェクトが含まれている場合は、代わりに次のいずれかの方法を使用します。

  • GitHub Copilot (標準エージェント):通常のCopilot エージェント (最新化エージェントを使用しない) を使用して、アップグレードを対話形式でガイドします。
  • .NET Upgrade Assistant をインストール: VB をサポートする専用の移行ツールです。

ヒント

ソリューションに C# プロジェクトと VB プロジェクトの両方が含まれている場合でも、C# プロジェクトにモダン化エージェントを使用できます。 上記の代替手段のいずれかを使用して、VB プロジェクトを個別にアップグレードします。

標準のCopilot エージェントを使用するか、手動でアップグレードする場合は、次の手順に従います。

  1. プロジェクトがサポートされていないバージョンの .NET Framework を対象とする場合は、最初に .NET Framework 4.8 に再ターゲットします。 Visual Studio、ソリューションを開いたときにこれを行うか、プロジェクトのプロパティで変更するかを確認するメッセージが表示されます。

  2. 古い NuGet パッケージを最新の互換性のあるバージョンに更新します。

  3. Visual Studio テンプレートまたはdotnet new wpf -lang vbを使用して、新しい VB WPF プロジェクトを作成します。 テンプレートによって SDK スタイルのプロジェクト ファイルと設定が生成され、.NET Framework から変更されます。

  4. .vbソース ファイルを古いプロジェクト フォルダーから新しいプロジェクト フォルダーにコピーします。

  5. app.config.settings ファイル、イメージ、アイコン、その他の埋め込みリソースなど、プロジェクトが依存するコード以外のファイルをコピーします。

  6. 古いプロジェクト ファイル (または packages.config) を開き、すべての NuGet パッケージ参照を書き留めます。 NuGet パッケージ マネージャーまたはdotnet add package <name>を使用して、同じパッケージを新しいプロジェクトに追加します。

  7. プロジェクトがソリューション内の他のプロジェクトを参照している場合は、それらの参照を新しいプロジェクトに再追加します。

  8. ソリューションのビルドを試みます。 エラーをまだ修正しないでください。ビルド出力により、Copilotで動作する問題の具体的な一覧が表示されます。

  9. Copilot が変更を加える前にクリーンなベースラインを確保できるよう、現在の状態をソース管理にコミットしておきましょう。

  10. GitHub Copilot Chatを開き、残りの問題を解決するように依頼します。 例えば次が挙げられます。

    このVisual Basic WPF プロジェクトは、.NET Framework 4.8 から .NET 10 に移行されました。 プロジェクト ファイルとソース ファイルは配置されていますが、ソリューションはコンパイルされません。 ビルド エラーを確認し、API の非互換性、不足している参照、および構成移行の問題を修正します。

  11. Copilot が提案した変更を確認し、その後プロジェクトをリビルドしてテストしてください。

アップグレードを開始する

Matching Game ソリューションには、 MatchingGame アプリと MatchingGame.Logic クラス ライブラリが含まれています。 エージェントはプロジェクト グラフを単独で把握するため、ソリューション レベルでアップグレードを開始します。

  1. ソリューション エクスプローラーで、ソリューションを右クリックし、[最新化] を選択します。

    GitHub Copilot Chat ウィンドウが開き、モダン化エージェントとの会話が開始されます。

  2. 厳密な推論とコーディング機能を備えたモデルを選択します。

  3. 実行する操作をエージェントに伝えます。 例えば次が挙げられます。

    すべてを .NET 10 にアップグレードします。

    エージェントは、コードベースの現在の状態と、実行する予定を報告します。

    • ターゲット フレームワーク: エージェントがプロジェクトを .NET 10 にアップグレードすることを示します。
    • フロー モード: 既定値は [自動] です。 複雑なアプリの場合は、エージェントに ガイド付き モードに切り替えてください。
    • ソース管理: エージェントが新しい作業ブランチを作成することを示します。

    エージェントは、リポジトリ内の .github/upgrades/scenarios/dotnet-version-upgrade/ に作業を書き込みます。 そのフォルダーが以前の試行から既に存在する場合、エージェントは、続行するか、新たに開始するかを確認します。

  4. アップグレード プロセスを開始するようにエージェントに start に指示します。

評価を確認する

評価ステージでは、エージェントはプロジェクトの構造、依存関係、およびコード パターンを調べて、変更する必要がある内容を特定します。 assessment.md.github/upgrades/scenarios/dotnet-version-upgrade/に結果を書き込みます。

Copilot が評価を完了したら、会話の出力結果を確認します。 一般に、次のような内容から始まります。

Assessment Complete

I've analyzed the solution and created a full assessment — see .github/upgrades/scenarios/dotnet-version-upgrade/assessment.md.

Solution: MatchingGame.slnx → target: net10.0

Compatibility Statistics:

- Projects: 2 (both currently on net48, legacy project format)
- Issues: 100 (Mandatory: 91, Potential: 9, Optional: 0)
- Affected Files: 6
- Affected Technologies: WPF (61 issues), Legacy Configuration System (2 issues)

Projects:

| Project                                      | Current TFM | Type                  |
|----------------------------------------------|-------------|-----------------------|
| MatchingGame.Logic\MatchingGame.Logic.csproj | net48       | Classic Class Library |
| MatchingGame\MatchingGame.csproj             | net48       | Classic WPF           |

Key issues found:

- Both projects use legacy (non-SDK-style) project format → must be converted to SDK-style
- Both project target frameworks need to change to net10.0
- WPF project (MatchingGame.csproj) has binary/source/behavioral API incompatibilities and Legacy Configuration System usage

No security vulnerabilities were detected, and no NuGet packages are referenced — this is a self-contained WPF + library solution.
Proceeding to planning now. You can ask me to pause and switch to Guided mode at any time.

アップグレード オプションを確認する

評価後、エージェントはアップグレード戦略の決定を提示し、upgrade-options.md.github/upgrades/scenarios/dotnet-version-upgrade/に保存します。 照合ゲームのサンプルでは、エージェントは次のオプションを選択します。

特徴 決定 理由
アップグレード戦略 ボトムアップ。 MatchingGame が依存しているため、エージェントはまず MatchingGame.Logic をアップグレードし、次に進む前に各層を検証します。
プロジェクトの進め方 インプレース。 他の.NET Framework プロジェクトで使用されないため、両方のプロジェクトが一緒に移行されます。
サポートされていない API の処理 インラインで修正します。 .NETのほとんどのWPF API の変更は機械的であり、個別の計画パスは必要ありません。
Windows ネイティブ API Windows 互換機能パック アプリはレジストリを使用し、本質的にWindows専用です。
Null 許容参照型 無効のままにします。 エージェントは、移行後に null 許容の有効化を別の作業として扱います。

エージェントは、注意すべきリスクについても指摘します。 提案されたオプションを確認し、変更する内容をエージェントに伝えます。 たとえば、null 許容参照型を有効にするか、互換性のないパッケージの処理方法を変更するようにエージェントに指示します。 完了したら、 confirm に返信して選択内容をロックし、計画に進みます。

プランを確認する

計画段階では、エージェントは評価と確認されたオプションを詳細な仕様に変換します。 結果を plan.md に書き込み、アップグレードの基本設定、決定、およびカスタム指示を格納する scenario-instructions.md ファイルを作成します。

Important

フロー モード[自動] の場合、エージェントは確認する時間なしでプランの実行を開始します。

このプランでは、プロジェクト間のアップグレード順序、各プロジェクトのターゲット フレームワーク モニカー (WPF プロジェクトのnet10.0-windows)、パッケージの更新パス、評価で見つかった破壊的変更のリスク軽減などの項目について説明します。

プランを確認してカスタマイズするには:

  1. plan.md.github/upgrades/scenarios/dotnet-version-upgrade/を開きます。
  2. アップグレード戦略と依存関係の更新を確認します。
  3. プランを編集してステップを調整するか、必要に応じてコンテキストを追加します。
  4. 実行ステージに移動するようにエージェントに指示します。

Caution

計画はプロジェクト間の依存関係に依存します。 アップグレード パスの完了を妨げる方法でプランを変更しても、アップグレードは成功しません。 たとえば、 MatchingGameMatchingGame.Logic に依存していて、そのプランから MatchingGame.Logic を削除すると、 MatchingGame のアップグレードが失敗する可能性があります。

アップグレードの実行

実行ステージでは、エージェントは検証基準を持つ計画を順次具体的なタスクに分割します。 エージェントはタスク リストを書き込んで .github/upgrades/scenarios/dotnet-version-upgrade/tasks.md し、そのファイルの全体的な進行状況を追跡します。 エージェントは、タスクごとに、タスクを記述する Markdown ファイルとタスクの進行状況を報告するマークダウン ファイルを含むフォルダーを .github/upgrades/scenarios/dotnet-version-upgrade/tasks/ の下に作成します。

Matching Game サンプルのタスク リストには、通常、 MatchingGame.Logic の最初のアップグレード、 MatchingGame のアップグレード、パッケージの復元、ソリューションのビルド、変更のコミットが含まれます。

アップグレードを実行するには:

  1. アップグレードを開始するようにエージェントに指示します。
  2. エージェントがタスクの状態を更新する tasks.md を確認して、進行状況を監視します。 タスクの説明と詳細な進行状況レポートの tasks/ の下にあるタスクごとのフォルダーを開きます。
  3. エージェントで解決できない問題が発生した場合は、要求されたヘルプを提供してください。 たとえば、エージェントから、2 つの代替 API から選択するか、非推奨のパッケージを保持するかどうかを確認するように求められる場合があります。
  4. エージェントは、応答に基づいて、その戦略を残りのタスクに適応させ、続行します。

エージェントは、初期化前に構成した Git 戦略 (タスクごと、タスクのグループごと、または最後) に従って変更をコミットします。

Visual Basic プロジェクトに関する注意事項

.NET Framework 上のVisual Basic WPF プロジェクトでは、多くの場合、System.Configuration設定ファイルや、MyMy.Computerなどの拡張機能My.User使用されます。 .NETでMy拡張機能が削除されました。 エージェントは、評価中にこれらのパターンにフラグを設定し、実行中に修正を提案しますが、ガイド付き実行中に個々の変更を確認する必要がある場合があります。

エージェントがプロジェクトを移行してもコンパイルされない場合は、プロジェクト ファイルがWindowsを対象とし、WPF参照していることを確認します。 <PropertyGroup>要素は、次のスニペットのようになります。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net10.0-windows</TargetFramework>
    <UseWPF>true</UseWPF>
    <OutputType>WinExe</OutputType>
    <MyType>Windows</MyType>

    <!-- Other settings removed for brevity. -->
  </PropertyGroup>
</Project>

アップグレードを確認する

アップグレードが完了すると、エージェントはチャット応答の次の手順を推奨します。 エージェントに対して、"変更レポートの生成" を使用して包括的な変更レポートを生成するように求めるメッセージが表示されます。

tasks.mdの最後のタスクの状態を確認し、すべての手順が完了していることを確認します。

アップグレードを確認するには:

  1. ソリューションをビルドし、コンパイル エラーに対処します。
  2. アプリを実行し、ウィンドウとビューが読み込まれており、期待どおりに動作することを確認します。 .NET Framework と .NET の XAML コントロールとカスタム コントロールの視覚的または動作上の違いを確認します。
  3. ソリューションで単体テストを実行し、エラーを修正します。
  4. 更新された NuGet パッケージがアプリと互換性があることを確認します。
  5. アプリを十分にテストして、アップグレードが成功したことを確認します。

ヒント

プロジェクトが実行せず、デバッガーをアタッチできない場合は、Visual Studio再起動してみてください。 .NET Framework から .NET にプロジェクト ファイルを移行すると、再起動せずにWPF デザイナーが混乱する可能性があります。

WPF照合ゲーム サンプルが .NET 10 にアップグレードされました。

アップグレード後のエクスペリエンス

.NET Framework から.NETにアプリを移植した場合は、アップグレードした .NET Framework アプリを最新化して、appsettings.json構成、依存関係の挿入、クラウド サービスなどの新しいパターンの導入に関するアイデアを確認してください。 これらのパターンの採用は、.NETへのアップグレードとは別であり、アップグレードを完了する必要はありません。