GitHub Copilot を使って Windows フォーム アプリを .NET にモダナイズする

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

この例では、メイン プロジェクトとクラス ライブラリで構成される小さな.NET Framework Windows フォーム アプリである 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 エージェント (最新化エージェントを使用しない) を使用して、アップグレードを対話形式でガイドします。
  • アップグレード アシスタント: VB をサポートする専用の移行ツール。

ヒント

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

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

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

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

  3. Visual Studio テンプレートまたはdotnet new winforms -lang vbを使用して、新しい VB Windows フォーム プロジェクトを作成します。 テンプレートによって 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 Windows フォーム プロジェクトは、.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 summary:
• Target: net48 → net10.0
• Projects: 2
• MatchingGame.Logic (Class Library)
• MatchingGame (Windows Forms)
• Issues: 883 (673 mandatory, 210 potential)
• Affected Technologies: Windows Forms (666), GDI+ / System.Drawing (208), Legacy Configuration System (2)

Key concerns:
• Both projects are legacy-format .csproj files — need conversion to SDK-style
• MatchingGame.csproj has API incompatibilities (binary + source) and an incompatible NuGet package
• WinForms remains supported on .NET 10 (Windows-only TFM)
• No reported security vulnerabilities

評価の内訳

Copilot、Visual Studio エディターで.github/upgrades/scenarios/dotnet-version-upgrade/assessment.md ファイルを開きます。 MatchingGame\MatchingGame.csproj セクションまで下にスクロールして、問題の表を表示します。

テクノロジ 課題 パーセンテージ 移行パス
レガシ構成システム 2 0.2% .NET Core のより柔軟な構成モデルに置き換えられた従来の XML ベースの構成システム (app.config/web.config)。 以前のシステムは、厳格で XML ベースでした。 JSON と環境変数を使用する Microsoft.Extensions.Configuration に移行し、必要に応じて暫定的な橋渡しとして System.Configuration.ConfigurationManager NuGet パッケージを使用します。
GDI+ / System.Drawing 208 23.7% NuGet パッケージ System.Drawing.Common を介して使用できる 2D グラフィックス、イメージング、および印刷用の System.Drawing API。 注: Windows依存関係が原因のサーバー シナリオでは推奨されません。新しいコードには SkiaSharp や ImageSharp などのクロスプラットフォームの代替手段を検討してください。
Windows フォーム 621 76.0% Windows フォーム Windows の.NETで使用できる従来のフォーム ベースの UI を使用してWindowsデスクトップ アプリケーションを構築するための API です。 Windows フォーム サポートを有効にする: オプション 1 (推奨): ターゲット フレームワークを net10.0-windows にする; オプション 2: <UseWindowsForms>true</UseWindowsForms> を追加する; オプション 3 (レガシー): Microsoft.NET.Sdk.WindowsDesktop SDK を使用する。

これらの問題のほとんどは実際の問題ではありません。 208 の問題を一覧表示する GDI+ 行の [移行パス] 列を確認します。 これらの API は、.NET Framework では使用できますが、.NETでは使用できないため、評価によってフラグが設定されます。 この列では、 NuGet パッケージを追加して API を復元する修正プログラムについて説明します。

Windows フォーム行には、同じ理由で 621 個の API の問題が一覧表示されます。 Windows フォーム API は既定では.NETで使用できませんが、net10.0-windowsやプロジェクト ファイルで<UseWindowsForms>true</UseWindowsForms>を設定するなどのWindows固有のフレームワークをターゲットにして復元します。 オプション 3 では、正しくないオプションが提案されます。 以前のバージョンの.NETでは、Microsoft.NET.Sdk.WindowsDesktop SDK を具体的にターゲットとするWindows フォーム プロジェクトが必要でしたが、<UseWindowsForms>true</UseWindowsForms>が設定されると自動的に参照されるようになりました。

ヒント

オプションの詳細については、Copilotに詳細とコンテキストを確認してください。

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

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

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

エージェントは、注意すべきリスクについても指摘します。 Matching Game サンプルでは、MetroFramework パッケージは .NET Framework でのみ使用できるため、エージェントによってフラグが設定されます。 結果として、MetroFrameworkが削除され、標準のWindows フォーム コントロールに戻り、アプリのビジュアル スタイルが変更される可能性があります。

提案されたオプションを確認し、変更する内容をエージェントに伝えます。 たとえば、null 許容参照型を有効にするように、またはまず MetroFramework の置換についていったん作業を止めて話し合うように、エージェントに指示します。 完了したら、 confirm に返信して選択内容をロックし、計画に進みます。

プランを確認する

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

Important

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

このプランでは、プロジェクト間のアップグレード順序、各プロジェクトのターゲット フレームワーク モニカー (Windows フォーム プロジェクトの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 Windows フォーム プロジェクトでは、多くの場合、System.ConfigurationMyなどのMy.Computer設定ファイルとMy.User拡張機能が使用されます。 .NETでMy拡張機能が削除されました。 エージェントは、評価中にこれらのパターンにフラグを設定し、実行中に修正を提案しますが、ガイド付き実行中に個々の変更を確認する必要がある場合があります。

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

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

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

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

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

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

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

  1. ソリューションをビルドし、コンパイル エラーに対処します。

  2. アプリを実行し、フォームが読み込み、期待どおりに動作することを確認します。

    Windows フォームの既定のフォント.NET Framework と.NETの間で変更されるため、フォームとカスタム コントロールでレイアウトの違いを確認します。

  3. ソリューションで単体テストを実行し、エラーを修正します。

  4. 更新された NuGet パッケージがアプリと互換性があることを確認します。

  5. アプリを十分にテストして、アップグレードが成功したことを確認します。

ヒント

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

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

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

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