Skip to content

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#コンパイラー)のバージョン不一致が原因で発生します。

主な発生パターン:

  1. 複数の.NET SDKバージョンが混在する環境
  2. プロジェクトが古いSDKバージョンを対象としているが、新しいプレビュー版SDKがインストールされている
  3. Visual Studioの更新不足
  4. ビルドシステムが最新SDKを優先的に使用している

効果的な解決方法

✅ Solution 1: global.jsonによるSDKバージョンの固定

プロジェクトルートにglobal.jsonファイルを作成し、特定のSDKバージョンを明示的に指定します。

  1. インストール済みSDKの確認:

    shell
    dotnet --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]
  2. global.jsonファイルの作成:

    shell
    # 使用するSDKバージョンを指定 (例: .NET 6)
    dotnet new globaljson --sdk-version 6.0.420
  3. 生成されるglobal.jsonの内容:

    json
    {
      "sdk": {
        "version": "6.0.420",
        "rollForward": "latestMinor"
      }
    }
    • rollForwardポリシー:
      • latestMinor: 指定メジャーバージョン内での最新マイナーバージョンを使用
      • disable: 厳密に指定バージョンのみ使用

推奨設定

一般的な開発環境ではlatestMinorを使用し、プロダクションビルドでは厳密なバージョン指定を推奨します。

✅ Solution 2: 競合するSDKのアンインストール

不要なプレビュー版SDKを削除して環境を整理します。

  1. Windowsの場合:

    • コントロールパネル → プログラムと機能
    • Microsoft .NET SDK <バージョン>を選択しアンインストール
  2. コマンドラインツールの使用:

    shell
    # SDK一覧確認
    dotnet --list-sdks
    
    # SDKアンインストール (管理者権限で実行)
    dotnet core uninstall --sdk 8.0.100-preview.6.23330.14

✅ Solution 3: Visual StudioとSDKの更新

最新の安定版に更新して問題を解決:

  1. Visual Studioの更新:

    • [ヘルプ] → [更新プログラムの確認]
  2. .NET SDKのダウンロード:

追加の対処法

ビルドオプションの設定

プロジェクトファイル(.csproj)にコンパイラーオプションを追加:

xml
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <BuildWithNetFrameworkHostedCompiler>true</BuildWithNetFrameworkHostedCompiler>
  </PropertyGroup>
</Project>

Azure DevOps ユーザーへの注意

パイプラインでVSBuildタスクを使用している場合:

yaml
- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '6.x' # 対象バージョンを指定

DotNetCoreCLIタスクに変更することで解決可能:

yaml
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    projects: '**/*.csproj'

Riderユーザーの場合

JetBrains Riderでの解決法:

  1. [設定] → [ビルド、実行、デプロイ] → [ツールセット]
  2. 正しい.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が重要な役割を果たします。