はじめに
C# で出来ること一覧 2026年版(.NET 10) という記事を読んで、後半で紹介されていた「.NET Frameworkから.NETへの移行」を実際に手を動かして試してみることにしました。
自分は過去にVB6→C#移行の案件に関わったこともあり、この手の移行話には割と反応してしまいます。ただし今回は縛りが一つあって、Visual Studioを入れていない環境(WSL2 + DevContainer + VS Code派)でどこまでできるか、というのを試してみました。
結論から言うと、最後は「移行ツールそのものが2026年に入って非推奨になっていた」という、狙って書けないオチにたどり着きました。
使ったサンプル
Microsoft公式が移行チュートリアル用に公開している、WinFormsのサンプルアプリ「Matching Game」を使いました。タイルをめくって同じ絵柄を揃える、いわゆる神経衰弱です。MatchingGame(UI)とMatchingGame.Logic(ロジック)の2プロジェクト構成で、UIにはMetroFrameworkというモダン風の見た目にするNuGetパッケージが使われています。
git clone --depth 1 https://github.com/dotnet/samples.git dotnet-samples-tmp
upgrades\matching-game-netframework\winforms 以下がお目当てのフォルダです。
VS無しでビルド環境を整える
.NET Frameworkプロジェクトをビルドするには、対応するMSBuildが必要です。フルのVisual Studio IDEは入れたくなかったので、コマンドラインだけの軽量版「Build Tools for Visual Studio」を使いました。
winget install --id Microsoft.VisualStudio.2022.BuildTools --override "--add Microsoft.VisualStudio.Workload.MSBuildTools;includeRecommended --add Microsoft.Net.Component.4.8.SDK --add Microsoft.Net.Component.4.8.TargetingPack --quiet"
これでIDE無しでもmsbuildコマンドが使える状態になります(ただし後述の通り、思わぬところで足を引っ張ることになりました)。
つまずきポイント①:対象バージョンの参照アセンブリが無い
早速ビルドしてみると、こんなエラーが出ました。
error MSB3644: .NETFramework,Version=v4.5.2 の参照アセンブリが見つかりませんでした。
サンプルは.NET Framework 4.5.2をターゲットにしていましたが、こちらが入れたTargeting Packは4.8のみ。実は公式の移行手順でも「まず.NET Framework 4.7.2以降にretargetする」のが最初のステップとして案内されています。今回は素直に4.8へ上げることにしました。
.csproj内の該当行を書き換えます。
<!-- Before -->
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<!-- After -->
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
MatchingGame.csprojとMatchingGame.Logic.csprojの両方を直したところ、MatchingGame.Logicはビルドが通りました。
つまずきポイント②:packages.config形式のパッケージが復元できない
MatchingGame本体の方は別のエラーで止まりました。
error CS0246: 型または名前空間の名前 'MetroFramework' が見つかりませんでした
このプロジェクトはpackages.configという古い形式でNuGet参照を管理していました。今どきのmsbuild /t:restoreはPackageReference形式向けのコマンドなので、packages.config形式には効きません。nuget.exe本体で復元する必要がありました。
Invoke-WebRequest -Uri "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -OutFile "nuget.exe"
.\nuget.exe restore MatchingGame.sln
これでようやくビルドが通り、実際にアプリも起動できました。地味に懐かしい神経衰弱で、MetroFrameworkのフラットなUIが確認できました。
つまずきポイント③:.NET Upgrade Assistantがクラッシュする
ここからが本題の移行作業です。.NET Upgrade AssistantというCLIツールをインストールして、分析(analyze)を試しました。
dotnet tool install -g upgrade-assistant
upgrade-assistant analyze MatchingGame.sln
対話式のウィザードでターゲットフレームワーク(.NET 10.0)やレポート形式などを選んでいき、いざ実行すると以下の例外で落ちました。
Microsoft.CodeAnalysis.MSBuild.RemoteInvocationException: An exception of type
System.TypeLoadException was thrown: アセンブリ 'Microsoft.Build, Version=15.1.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' からの型
'Microsoft.Build.Experimental.ProjectCache.ProjectCacheService' にあるメソッド 'DisposeAsync'
に実装が含まれていません。
ツールを最新化(dotnet tool uninstall → installし直し)しても症状は変わらず、バージョンは1.0.518.26217のままでした。
ここで調べてみたところ、原因が判明しました。
.NET Upgrade Assistant は2026年に入って正式に非推奨(deprecated)になっていました。 後継となるのが「GitHub Copilotアップグレード(GitHub Copilot upgrade for .NET)」です。Copilot Chat上で
@upgradeエージェントとして呼び出す形で、.NETのバージョンアップや、.NET Frameworkからの移行を支援してくれます。
つまり、今回のTypeLoadExceptionはこちらの設定ミスではなく、開発の止まったツールと、新しめのBuild Tools環境(MSBuild 17.14系)との組み合わせで起きた互換性問題だった可能性が高いです。奇しくも自分が用意したビルド環境自体が、このツールにとっては「新しすぎた」わけです。
GitHub Copilotアップグレードは、Visual StudioだけでなくVisual Studio Code拡張機能としてもインストールできます。自分は最初「Visual Studio専用の機能だろう」と思い込んでいたのですが、これは誤りでした。普段使っているVS Code環境でも、Visual Studioを別途入れなくてもそのまま続きが試せそうです。
わかったこと
- .NET Framework → .NET 10への移行は、VS無し・CLIだけでもある程度は進められる(ビルド環境の構築、retarget、パッケージ復元まで)
- ただし
packages.config形式のプロジェクトはnuget.exeが別途必要になるなど、地味な足かせがいくつかある - CLI版の.NET Upgrade Assistantは2026年時点で非推奨。これから移行を試すなら、公式が推しているのは「GitHub Copilotアップグレード」の方(Visual StudioだけでなくVS Code拡張機能としても利用可能)
- 逆に言うと、VSを使わない縛りだと今の公式ツールチェーンにはうまく乗れないポイントがある、というのも実際に触ってみて初めてわかったこと
次回予告
GitHub Copilotアップグレードの方は、VS Code拡張機能版でそのまま続きを試す予定です。Visual Studio自体は不要そうなので、そちらは別記事にまとめます。
先に、記事後半で紹介されていたもう一つのテーマ「Microsoft Agent Framework / Microsoft.Extensions.AI」を触ってみようと思います。
追記(2026-08-11): 記事公開後にコメントで、.NET Framework移行に使える「GitHub Copilotアップグレード」というツールと、それがVisual Studio Code拡張機能としてもインストールできる点をご指摘いただきました。本文を修正済みです。ご指摘ありがとうございました。