エラーの発生状況
最近、クリーンな Windows Server 2022 インスタンスに小さな WPF(Windows Presentation Foundation)ユーティリティをデプロイした際に、この問題に遭遇しました。.NET 8 SDK は既にインストールされていたにもかかわらず、アプリケーションが起動しませんでした。期待していた UI が表示される代わりに、CLI エラーと、互換性のあるフレームワークのバージョンが見つからないというポップアップダイアログが表示されました。
It was not possible to find any compatible framework version.
The framework 'Microsoft.WindowsDesktop.App', version '8.0.0' (x64) was not found.
これは、.NET がその構成をいくつかの「フレーバー(種類)」に分けているために起こります。「Base」ランタイムはコンソールアプリや Web バックエンドを処理し、「Desktop」ランタイムには WinForms や WPF 用の特定の UI ライブラリが含まれています。標準のランタイムや SDK だけをインストールした場合、ウィンドウやボタンを描画するために必要な特定の DLL がシステムに不足していることになります。
なぜ不足しているのか?
通常、この問題は次の 3 つの一般的な障害のいずれかに集約されます。
- ランタイムの種類の誤り: Windows 固有の追加コンポーネントを含む「.NET Desktop Runtime」(通常 55MB 以上)ではなく、汎用的な「.NET Runtime」(約 25MB 〜 30MB)をインストールした可能性があります。
- アーキテクチャの不一致: アプリが 32 ビット(x86)システム向けにコンパイルされている可能性があります。64 ビット(x64)ランタイムしかインストールされていない場合、アプリはそれを認識できません。
- バージョンの詳細: アプリケーションが 6.0.25 などの特定のマイナーバージョンを探している場合があります。6.0.0 しかインストールされておらず、「ロールフォワード」ポリシーが有効でない場合、アプリの起動は失敗します。
クイックフィックス:Desktop Runtime をインストールする
最も直接的な解決策は、特定の Desktop Runtime インストーラーをダウンロードすることです。Microsoft のサイトで最初に目に入る「ダウンロード」リンクをクリックするのは避けてください。それはサーバー専用バージョンを指していることが多いからです。
- 公式の .NET ダウンロードページにアクセスします。
- エラーに記載されているバージョン(例:.NET 6.0 や .NET 8.0)を選択します。
- **「デスクトップ アプリを実行する (Run desktop apps)」**というタイトルの列に注目してください。
- ほとんどの最新 PC では x64 インストーラーをダウンロードします。エラーメッセージに
(x86)と明記されている場合は、そちらのバージョンをダウンロードしてください。 .exeを実行します。再起動は不要です。アプリケーションを再起動するだけで完了です。
より良いデプロイ戦略
1. インストール済みランタイムの確認
インストーラーを増やす前に、システムが実際に何を認識しているかを確認しましょう。PowerShell を開き、次のコマンドを実行します。
dotnet --list-runtimes
デスクトップアプリを実行できる正常な状態であれば、リストにベースアプリとデスクトップアプリの両方が表示されるはずです。Microsoft.WindowsDesktop.App が欠けているなら、それが原因です。正しい出力は以下のようになります。
Microsoft.NETCore.App 8.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 8.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
2. アーキテクチャの不一致を解決する
64 ビットの Windows インストールには 64 ビットのランタイムだけが必要だと思い込まないでください。レガシーアプリが x86 向けにコンパイルされている場合、x64 ランタイムは認識されません。Desktop Runtime の x86 バージョンと x64 バージョンの両方を並行してインストールすることができます。これは、最新の 64 ビット標準に更新されていない古い企業向けツールではよく必要になります。
3. 開発者向け:自己完結型パブリッシュの使用
ランタイム不足に関するユーザーからの苦情に疲れていませんか? .exe の中に .NET ランタイム全体を同梱することができます。これによりファイルサイズは大きくなります(多くの場合 200KB から 60MB 以上に増加します)が、どのマシンでも即座にアプリが動作することを保証できます。
単一の独立したファイルをビルドするには、次のコマンドを使用します。
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
4. ロールフォワードポリシーの強制
アプリがバージョン 6.0.2 を要求しているのに、手元には 6.0.28 がある場合、新しいバージョンを使用するように強制できます。アプリフォルダー内にある appname.runtimeconfig.json ファイルを探します。rollForward 設定を追加することで、.NET に対してマイナーバージョンの違いを許容するように指定できます。
{
"runtimeOptions": {
"tfm": "net6.0",
"framework": {
"name": "Microsoft.WindowsDesktop.App",
"version": "6.0.0"
},
"rollForward": "LatestFeature"
}
}
修正の確認
最後にもう一度 dotnet --list-runtimes を実行し、Desktop App フレームワークが存在することを確認します。アプリを起動すると、すぐに GUI が開くはずです。それでも何も起こらずに失敗する場合は、Windows の イベント ビューアー(Windows ログ > アプリケーション)をチェックして、別の DLL がクラッシュの原因になっていないか確認してください。

