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-sdks3.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が重要な役割を果たします。