Roslynコンパイラーバージョン不一致エラーの解決方法
エラー概要
.NETプロジェクトで以下のエラーが発生する場合
CS9057 The analyzer assembly '...' references version 'X.X.X.X' of the compiler, which is newer than the currently running version 'Y.Y.Y.Y'
問題の原因
このエラーは、プロジェクトで使用されているRoslynコンパイラー(C#コンパイラー)のバージョン不一致が原因で発生します。
主な発生パターン:
- 複数の.NET SDKバージョンが混在する環境
- プロジェクトが古いSDKバージョンを対象としているが、新しいプレビュー版SDKがインストールされている
- Visual Studioの更新不足
- ビルドシステムが最新SDKを優先的に使用している
効果的な解決方法
✅ Solution 1: global.jsonによるSDKバージョンの固定
プロジェクトルートにglobal.json
ファイルを作成し、特定のSDKバージョンを明示的に指定します。
インストール済みSDKの確認:
shelldotnet --list-sdks
3.1.426 [C:\Program Files\dotnet\sdk] 6.0.420 [C:\Program Files\dotnet\sdk] 7.0.306 [C:\Program Files\dotnet\sdk] 8.0.100 [C:\Program Files\dotnet\sdk]
global.jsonファイルの作成:
shell# 使用するSDKバージョンを指定 (例: .NET 6) dotnet new globaljson --sdk-version 6.0.420
生成されるglobal.jsonの内容:
json{ "sdk": { "version": "6.0.420", "rollForward": "latestMinor" } }
rollForward
ポリシー:latestMinor
: 指定メジャーバージョン内での最新マイナーバージョンを使用disable
: 厳密に指定バージョンのみ使用
推奨設定
一般的な開発環境ではlatestMinor
を使用し、プロダクションビルドでは厳密なバージョン指定を推奨します。
✅ Solution 2: 競合するSDKのアンインストール
不要なプレビュー版SDKを削除して環境を整理します。
Windowsの場合:
- コントロールパネル → プログラムと機能
Microsoft .NET SDK <バージョン>
を選択しアンインストール
コマンドラインツールの使用:
shell# SDK一覧確認 dotnet --list-sdks # SDKアンインストール (管理者権限で実行) dotnet core uninstall --sdk 8.0.100-preview.6.23330.14
✅ Solution 3: Visual StudioとSDKの更新
最新の安定版に更新して問題を解決:
Visual Studioの更新:
- [ヘルプ] → [更新プログラムの確認]
.NET SDKのダウンロード:
- 公式ダウンロードサイトから対象バージョンを取得
追加の対処法
ビルドオプションの設定
プロジェクトファイル(.csproj
)にコンパイラーオプションを追加:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<BuildWithNetFrameworkHostedCompiler>true</BuildWithNetFrameworkHostedCompiler>
</PropertyGroup>
</Project>
Azure DevOps ユーザーへの注意
パイプラインでVSBuild
タスクを使用している場合:
- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '6.x' # 対象バージョンを指定
DotNetCoreCLI
タスクに変更することで解決可能:
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
projects: '**/*.csproj'
Riderユーザーの場合
JetBrains Riderでの解決法:
- [設定] → [ビルド、実行、デプロイ] → [ツールセット]
- 正しい.NET SDKパスを選択 (
.../dotnet/sdk...
)
予防策とベストプラクティス
- プロジェクト作成時に
global.json
を追加し、SDKバージョンを固定 - プレビュー版SDKは開発用マシンのみにインストール
- CI/CD環境で明示的にSDKバージョン指定を行う
- 定期的に開発環境の
.NET SDK
を整理:shell# 不要なSDK/Runtime削除 dotnet core clean
根本原因の技術的背景
このエラーは、MSBuildプロセス内のコンパイラーバージョンとアナライザーが参照するコンパイラーの不一致で発生します。新しいSDKがインストールされると、MSBuildが最新SDKのアセンブリを使用しようとするため、ターゲットフレームワークの互換性問題が生じます。
[プロジェクトの対象ランタイム] (例: net6.0)
│
└─ [要求されるコンパイラー] (v4.6.0.0)
│
└─ [実際にロードされたコンパイラー] (v4.7.0.0) → 不一致エラー発生
.NETのバージョニングポリシー
では、常に最も新しいインストール済みSDKがデフォルトで使用されます。この挙動を制御するためにglobal.json
が重要な役割を果たします。