はじめに
.netでクリーンアーキテクチャであれこれ開発してみたくなって、
githubからcloneしてきたソリューションをデバックしたところ、以下のようなエラーが発生。
あんまり見たことないので、せっかくなら記事にしちゃえ~の精神で、解決方法を探していきたいと思います。
何のエラー?
Github Copilot先輩は以下のように返答してくれました。
このエラーは、指定されたバージョンの .NET Core ランタイムまたは
ASP.NET Core ランタイムが見つからないために発生しています。具体的に
は、アプリケーションが .NET 6.0.0 ランタイムを必要としているが、
システムにはインストールされていないことが原因です。
なるほど👀。ようするに、いまランタイムで実行している.netのバージョンが違うので、動かそうにもできませんよと怒られてしまっている状態ですね。
今回私が用意したASP.NET Coreは.net6.0対応なので、まずはいま手元にあるバージョンを以下のコマンドで確認してみましょう。
.NET SDK のバージョン
dotnet --list-sdks
続いて、今回怒られているランタイムのバージョンも見てみましょう。
.NET ランタイムバージョン
dotnet --list-runtimes
とすると、SDKとランタイムとも.net9.0である(2025年最新版)であることがわかりました。
うーん?一番新しい.netで動かないのはなぜなんだろう...?下位互換性が機能しないものなのか...?という疑問が発生。
対応方法
上記についてとりあえず後述に回して、とりあえず.net6.0をダウンロードします。
Powershellで実施。
wget https://dotnet.microsoft.com/download/dotnet/thank-you/runtime-6.0.0-windows-x64-installer -OutFile dotnet-runtime-6.0.0-win-x64.exe
Start-Process -FilePath .\dotnet-runtime-6.0.0-win-x64.exe -ArgumentList '/quiet' -Wait
Remove-Item .\dotnet-runtime-6.0.0-win-x64.exe
そして、もう一度ビルドしてみると...
同じエラーが発生!!!Σ(・□・;)
詳しく調査すると、SDK・ランタイム両方とも.net6.0にする必要があるそうです。上記ではランタイムのみでしたのでSDKもインストールします。
すると...
無事起動されましたね!!
.netに下位互換性はないの?
先ほどぶち当たった問題です。6.0以上のバージョンがすでにあるにも関わらず、あえて下位のバージョンをインストールしなければならないのはなかなかに不条理。
これについて生成AIに文句を言うと、このように返答されました。
.NET実行環境には特別な互換性の仕組みがあります。新しいバージョン(9.0など)をインストールしても、古いバージョン(6.0など)のアプリケーションは自動的には動作しません。
これには主に以下の理由があります:
ランタイムの独立性:
各.NETバージョンは独自のランタイム環境を持ち、
アプリケーションはビルド時に特定のバージョンを対象に設計されます。
破壊的変更の可能性:
メジャーバージョン間では互換性のない変更が導入されることがあります。
ロールフォワードポリシー:
.NET 5以降は、適切に設定されていれば「ロールフォワード」機能で上位バージョンで動作させることは可能ですが、デフォルトでは厳格に指定されたバージョンのみ使用します。
ASP.NET Coreアプリケーションの場合は特に、フレームワーク依存として公開されていると、指定されたバージョンのランタイムが必要になります。
どうやら、ランタイムには特定バージョンに依ることが必要らしく、最新のSDKを入れたところで動きませんよってことなのですね。
なるほど、.netのバージョン引き上げが苦労するわけですね...。
自己完結型(self-contained)デプロイメントという概念も紹介されましたが、未知の事項なのでまたいずれ試してみたいですね。