ソース ジェネレーターとインターセプターに関連するエラーと警告

コンパイル中にコンパイラがソース ジェネレーターまたはインターセプターを読み込むと、次のエラーが発生します。

  • CS9137: "インターセプター" 機能は、この名前空間では有効になっていません。プロジェクトに <Features>InterceptorsPreview</Features> を追加します。
  • CS9138: メソッド 'method' は、その包含型に型パラメーターがあるため、インターセプターとして使用できません。
  • CS9139: インターセプトできません: コンパイルにパスを含むファイルが含まれていません。
  • CS9140: インターセプトできません: コンパイルにはパス 'path' を持つファイルが含まれていません。パス 'candidatePath' を使用するつもりでしたか?
  • CS9141: 指定された行と文字番号は、インターセプト可能なメソッド名ではなく、トークン 'token' を参照します。
  • CS9142: 指定されたファイルに n 行があり、指定された行番号 mよりも少なくなります。
  • CS9143: 指定された行が c 文字の長さであり、指定された文字番号 nよりも少なくなります。
  • CS9144: シグネチャが一致しないため、インターセプター MでメソッドVをインターセプトできません。
  • CS9145: インターセプトできません: パスがマップ解除されています。マップされたパスが必要です。
  • CS9146: インターセプター メソッドは通常のメンバー メソッドである必要があります。
  • CS9147: 指定された行と文字番号は、トークン 'token' の先頭を参照しません。行 'n' と文字 'c' を使用することを意味しましたか?
  • CS9148: インターセプターには、パラメーターに一致する this パラメーターが必要です。
  • CS9149: メソッドに this パラメーターがないため、インターセプターに this パラメーターを指定することはできません。
  • CS9150: インターセプターは、 null ファイル パスを持つことはできません。
  • CS9151: メソッド名 M 呼び出されていないため、インターセプトできません。
  • CS9152: コンパイル内の複数のファイルにこのパスがあるため、パス 'path' を持つファイル内の呼び出しをインターセプトできません。
  • CS9153: 指定された呼び出しが複数回インターセプトされます。
  • CS9155: M内でアクセスできないため、Vで呼び出しをインターセプトできません。
  • CS9156: 'scoped' 修飾子またはM属性の違いにより、Vを使用して[UnscopedRef]の呼び出しをインターセプトできません。
  • CS9157: InterceptsLocationAttributeに指定する行番号と文字番号は正である必要があります。
  • CS9160: nameof 演算子をインターセプトできません。
  • CS9161: インターセプターを UnmanagedCallersOnlyAttributeでマークすることはできません。
  • CS9177: メソッド 'method' は非ジェネリックであるか、'target' に一致するアリティ 'arity' である必要があります。
  • CS9178: メソッド 'method' は、'target' と一致する非ジェネリックである必要があります。
  • CS9206: インターセプターをグローバル名前空間で宣言することはできません。
  • CS9207: 通常のメンバー メソッドの呼び出しではないため、'method' をインターセプトできません。
  • CS9231: InterceptsLocationAttribute のデータ引数が正しい形式ではありません。
  • CS9232: インターセプター形式のバージョン 'version' はサポートされていません。サポートされている最新バージョンは '1' です。
  • CS9233: コンパイル内の他の場所で重複しているため、ファイル 'file' の呼び出しをインターセプトできません。
  • CS9234: コンパイルで一致するファイルが見つからなかったため、ファイル 'file' の呼び出しをインターセプトできません。
  • CS9235: InterceptsLocationAttribute のデータ引数は、ファイル 'file' 内の無効な位置を参照します。

コンパイル時にコンパイラがソース ジェネレーターまたはインターセプターを読み込むと、次の警告が発生します。

  • CS8032: アナライザー 'アナライザー' のインスタンスを 'assembly' から作成できません: 'reason'。
  • CS8033: アセンブリ 'assembly' にアナライザーが含まれていません。
  • CS8034: アナライザー アセンブリ 'assembly' を読み込めません: 'reason'
  • CS8040: ReflectionTypeLoadException : 'exception' が発生したため、アナライザー アセンブリ 'assembly' 内の一部の型をスキップしています。
  • CS8700: 複数のアナライザー構成ファイルを同じディレクトリ ('directory') に含めることはできません
  • CS8784: ジェネレーター 'ジェネレーター' の初期化に失敗しました。出力には影響せず、結果としてコンパイル エラーが発生する可能性があります。例外の種類が "exception" で、メッセージ 'message' が含まれます。
  • CS8785: ジェネレーター 'ジェネレーター' がソースの生成に失敗しました。出力には影響せず、結果としてコンパイル エラーが発生する可能性があります。例外の種類が "exception" で、メッセージ 'message' が含まれます。
  • CS8850: 型 'type' を含むアセンブリ 'assembly' は、サポートされていない .NET Framework を参照しています。
  • CS9057: アナライザー アセンブリ 'assembly' は、現在実行中のバージョン 'currentVersion' よりも新しいバージョン 'version' のコンパイラを参照しているため、使用できません。
  • CS9067: アナライザー参照 'reference' が複数回指定されています
  • CS9154: インターセプター Mを使用してVの呼び出しをインターセプトしますが、署名が一致しません。
  • CS9158: 戻り値の型での参照型の Null 許容がインターセプト可能なメソッドと一致しません。
  • CS9159: パラメーターの型での参照型の Null 許容がインターセプト可能なメソッドと一致しません。
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' はサポートされていません。代わりに、これらの属性の 'InterceptableLocation' ベースの生成に移動します。 (https://github.com/dotnet/roslyn/issues/72133)

これらのエラーと警告は、次のテーマに従います。

ソース ジェネレーターの障害

  • CS8784: ジェネレーター 'ジェネレーター' の初期化に失敗しました。出力には影響せず、結果としてコンパイル エラーが発生する可能性があります。例外の種類が "exception" で、メッセージ 'message' が含まれます。
  • CS8785: ジェネレーター 'ジェネレーター' がソースの生成に失敗しました。出力には影響せず、結果としてコンパイル エラーが発生する可能性があります。例外の種類が "exception" で、メッセージ 'message' が含まれます。

これらの警告は、ソース ジェネレーターがコンパイル中に未処理の例外をスローしたことを示します。 ソース ジェネレーターはビルド パイプラインの一部として実行され、エラーが発生すると、ジェネレーターがコンパイルに出力を提供できなくなります。 ソース ジェネレーターの実装の詳細については、「 ソース ジェネレーター」を参照してください。

これらの警告を修正するには、次のガイダンスに従います。

  • ビルド出力の完全な例外の詳細を調べて、根本原因 (CS8784CS8785) を特定します。 警告メッセージには、例外の種類、メッセージ、スタック トレースが含まれています。これは、ユーザーまたはジェネレーターの作成者がエラーを診断するのに役立ちます。
  • ソース ジェネレーターに必要なすべての依存関係がプロジェクトで使用可能であることを確認します (CS8784)。 多くの場合、初期化エラーは、ジェネレーターが起動時に必要なアセンブリまたはリソースを見つけることができない場合に発生します。 ジェネレーターの NuGet パッケージが正しくインストールされ、推移的な依存関係がすべて解決されていることを確認します。
  • サード パーティのジェネレーター コード (CS8784CS8785) で例外が発生した場合、ソース ジェネレーターのメンテナーにエラーを報告します。 バグ レポートにビルド出力の例外の詳細をすべて含めます。
  • ソース ジェネレーターを作成した場合は、 Initialize または Execute メソッド内に例外処理を追加して、エラーを適切にキャッチして報告します (CS8784CS8785)。

アナライザーとソース ジェネレーターの互換性

  • CS8032: アナライザー 'アナライザー' のインスタンスを 'assembly' から作成できません: 'reason'。
  • CS8033: アセンブリ 'assembly' にアナライザーが含まれていません。
  • CS8034: アナライザー アセンブリ 'assembly' を読み込めません: 'reason'
  • CS8040: ReflectionTypeLoadException: 'exception' が発生したため、アナライザー アセンブリ 'assembly' の一部の型をスキップします。
  • CS8700: 複数のアナライザー構成ファイルを同じディレクトリ ('directory') に含めることはできません
  • CS8850: 型 'type' を含むアセンブリ 'assembly' は、サポートされていない .NET Framework を参照しています。
  • CS9057: アナライザー アセンブリ 'assembly' は、現在実行中のバージョン 'currentVersion' よりも新しいバージョン 'version' のコンパイラを参照しているため、使用できません。
  • CS9067: アナライザー参照 'reference' が複数回指定されました

これらの警告とエラーは、アナライザーおよびソース ジェネレーター アセンブリの読み込み、インスタンス化、または構成に関する問題を示しています。 ソース ジェネレーターはアナライザー アセンブリとして読み込まれるため、これらの診断はアナライザーとソース ジェネレーターの両方に適用されます。

これらの問題を修正するには、次のガイダンスに従います。

  • .NET SDK またはコンパイラのバージョンをアナライザーの要件に合わせてアップグレードするか、現在のコンパイラと互換性のある古いバージョンのアナライザー パッケージ (CS9057) を使用します。 このエラーは、アナライザー アセンブリが、実行中のコンパイラが提供するより新しい Roslyn API バージョンを対象とする場合に発生します。
  • プロジェクトから重複するアナライザー参照を削除します (CS9067)。 プロジェクト ファイルで、異なるパスを介して同じアナライザー アセンブリを含む <Analyzer> または <PackageReference> 要素が繰り返し存在することを確認します。 推移的なパッケージの依存関係によって、重複が発生する可能性もあります。
  • アナライザー アセンブリが有効な.NET アセンブリであり、破損していないことを確認します (CS8034)。 アセンブリをまったく読み込めなかった場合は、ファイルが参照先のパスに存在し、互換性のあるターゲット フレームワーク用にビルドされていることを確認します。 NuGet パッケージをリビルドまたは再インストールして、新しいコピーを取得します。
  • アナライザーの型にパブリック パラメーターなしのコンストラクター (CS8032) があることを確認します。 コンパイラは、既定のコンストラクターを呼び出してアナライザーをインスタンス化します。 コンストラクターが例外をスローした場合、またはパラメーターが必要な場合、アナライザーを作成できません。
  • 参照先アセンブリがアナライザーまたはソース ジェネレーターの種類 (CS8033) を実際にエクスポートするかどうかを確認します。 アナライザーとして参照されるアセンブリには、 DiagnosticAnalyzer または ISourceGenerator/IIncrementalGeneratorを実装する型が含まれている必要があります。 アセンブリがアナライザーではなくランタイムの依存関係である場合は、代わりに通常のプロジェクトまたはパッケージ参照として参照します。
  • アナライザー アセンブリ内の型読み込みの問題を解決するには、すべての依存関係が使用可能であることを確認します (CS8040)。 ReflectionTypeLoadException は通常、そのアセンブリが見つからない別のアセンブリ内の型を参照していることを意味します。 必要なすべての依存関係がアナライザーの NuGet パッケージに含まれていることを確認します。
  • アナライザー構成ファイル (.editorconfig または .globalconfig) がディレクトリごとに一意であることを確認します (CS8700)。 コンパイラでは、優先順位規則があいまいになるため、同じディレクトリ内の複数のアナライザー構成ファイルは許可されません。 ファイルをマージするか、重複を削除します。
  • .NET Framework (CS8850) ではなく、.NET Standard またはモダン .NETをターゲットにするようにアナライザーまたはソース ジェネレーターを更新します。 .NET Framework を参照するアセンブリは、最新の.NET コンパイラ ツールチェーンではサポートされていません。 アナライザーを維持する場合は、 netstandard2.0に再ターゲットします。 サード パーティ製パッケージの場合は、最新の.NETをサポートするバージョンにアップグレードします。

インターセプターは試験的

  • CS9137: "インターセプター" 機能は、この名前空間では有効になっていません。プロジェクトに <Features>InterceptorsPreview</Features> を追加します。

インターセプターを使用するには、<Features>InterceptorsPreview</Features> セクション (<PropertyGroup>) 内のプロジェクト ファイルに要素を追加します。 インターセプターは試験段階の機能であり、既定では有効になっていません。 この明示的なオプトインは、インターセプター機能が今後のリリースで破壊的変更または削除の対象となるために必要です。 コンパイラは、使用を許可する前に、リスクを理解していることを確認する必要があります。 インターセプターとその機能の詳細については、C# 12 の機能に関するドキュメントの インターセプター を参照してください。

署名の不一致

次のエラーと警告は、インターセプター メソッドとインターセプト可能なメソッドの間の不一致を示しています。

  • CS9144: シグネチャが一致しないため、インターセプター MでメソッドVをインターセプトできません。
  • CS9148: インターセプターには、パラメーターに一致する this パラメーターが必要です。
  • CS9149: インターセプターには、this パラメーターがないため、this パラメーターを持つ必要はありません。
  • CS9155: M内でアクセスできないため、Vで呼び出しをインターセプトできません。
  • CS9156: 'scoped' 修飾子またはM属性の違いにより、V[UnscopedRef]の呼び出しをインターセプトできません。
  • CS9177: メソッド 'method' は非ジェネリックであるか、'target' に一致するアリティ 'arity' である必要があります。
  • CS9178: メソッド 'method' は、'target' と一致する非ジェネリックである必要があります。

さらに、次の警告は、インターセプターとインターセプト可能なメソッドのシグネチャの不一致を示しています。

  • CS9154: インターセプター Mを使用してVの呼び出しをインターセプトしますが、署名が一致しません。
  • CS9158: 戻り値の型での参照型の Null 許容がインターセプト可能なメソッドと一致しません。
  • CS9159: パラメーターの型での参照型の Null 許容がインターセプト可能なメソッドと一致しません。
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' はサポートされていません。代わりに、これらの属性の 'InterceptableLocation' ベースの生成に移動します。 (https://github.com/dotnet/roslyn/issues/72133)

これらの問題を修正するには、インターセプター メソッドがインターセプト可能なメソッドのシグネチャとアクセスの要件と一致していることを確認します。

  • インターセプター メソッドシグネチャがインターセプト可能なメソッド (CS9144CS9154) と正確に一致していることを確認します。 パラメーターの型、修飾子、順序、戻り値の型は同じである必要があります。 両方のメソッド宣言を確認し、シグネチャを調整します。
  • インターセプト可能なメソッドがインスタンス メソッド (this) の場合は、インターセプターに パラメーターを追加するか、インターセプト可能なメソッドが静的な場合は this パラメーターを削除します (CS9149)。 インスタンス インターセプターには宣言型の this パラメーターが必要ですが、静的インターセプターにはパラメーターを含めてはなりません。
  • インターセプターは、インターセプト可能なメソッドにアクセスできる場所 (CS9155) で宣言します。 インターセプト可能なメソッドが internal場合、インターセプターは同じアセンブリ内にある必要があります。 privateの場合、インターセプターは同じ型または入れ子になった型である必要があります。
  • 対応するscoped パラメーター ([UnscopedRef]) 上の ref 修飾子と 属性を一致させます。 インターセプター内の各 ref パラメーターには、メモリの安全性を確保するために、インターセプト可能なメソッドの対応するパラメーターと同じ有効期間注釈が必要です。
  • 両方のメソッドに一致するジェネリック アリティ (CS9177CS9178) があることを確認します。 インターセプト可能なメソッドが非ジェネリックの場合、インターセプターも非ジェネリックである必要があります。 インターセプト可能なメソッドに型パラメーターがある場合、インターセプターは互換性のある制約を持つ同じ数の型パラメーターを持つ必要があります。
  • 戻り値の型 (CS9158) とパラメーター型 (CS9159) の null 許容注釈を一致させてください。 プロジェクトで null 許容参照型を有効にし、インターセプターの null 許容注釈がインターセプト可能なメソッドと正確に一致するようにして、型の安全性を維持します。
  • 非推奨のInterceptableLocation コンストラクター (InterceptsLocationAttribute) ではなく、更新された(string, int, int)ベースの生成をに使用します。 新しい形式では、ツールのサポートとコンパイル時の検証が向上します。 移行ガイダンスについては、 GitHub の問題 を参照してください。

不適切なマッピング

インターセプターには、インターセプト可能なメソッドとインターセプター メソッドをマップするソース マッピングが必要です。 次のエラーは、マッピングに関する問題を示しています。

  • CS9139: インターセプトできません: コンパイルにパスを含むファイルが含まれていません。
  • CS9140: インターセプトできません: コンパイルにはパス 'path' を持つファイルが含まれていません。パス 'candidatePath' を使用するつもりでしたか?
  • CS9141: 指定された行と文字番号は、インターセプト可能なメソッド名ではなく、トークン 'token' を参照します。
  • CS9142: 指定されたファイルに n 行があり、指定された行番号 mよりも少なくなります。
  • CS9143: 指定された行が c 文字の長さであり、指定された文字番号 nよりも少なくなります。
  • CS9145: インターセプトできません: パスがマップ解除されています。マップされたパスが必要です。
  • CS9147: 指定された行と文字番号は、トークン 'token' の先頭を参照しません。行 'n' と文字 'c' を使用することを意味しましたか?
  • CS9150: インターセプターは、 null ファイル パスを持つことはできません。
  • CS9157: InterceptsLocationAttributeに指定する行番号と文字番号は正である必要があります。

マッピング エラーを修正するには、 InterceptsLocationAttribute に有効なファイル パスと正確な位置情報が含まれていることを確認します。

  • ファイル パスがコンパイル内のファイルと正確に一致するかどうかを確認します (CS9139CS9140)。 正しい大文字と小文字の区別やディレクトリ区切り記号など、プロジェクトに表示される正確なパスを使用します。 コンパイラが代替パスを提案する場合は、そのパスを使用するように属性を更新します。
  • ファイル パスを変換するソース ジェネレーターを使用する場合は、マップされたファイル パスを使用します (CS9145)。 ソース ジェネレーターは、多くの場合、生成されたファイルのパスを再マップします。また、元のソース パスではなく、コンパイラが認識するマップされたパスを使用する必要があります。
  • ファイル パスがnullでないことをInterceptsLocationAttribute (CS9150) で確認します。 インターセプトのたびに、インターセプトの呼び出しを含むソース ファイルを識別する有効な null 以外のファイル パスを指定する必要があります。
  • 正の 1 から始まる行番号と文字番号を指定します (CS9157)。 行番号と文字位置は、0 ではなく 1 から始まる必要があります。 位置を計算するときに、ソース ジェネレーターで 1 ベースのインデックス作成が使用されていることを確認します。
  • メソッド名トークン CS9141CS9147 の正確な開始位置を示します。 行番号と文字番号は、空白、演算子、またはその他のトークンではなく、呼び出しのメソッド名の最初の文字を識別する必要があります。 コンパイラが代替座標を提案する場合は、それらを使用して正しいトークンの開始をターゲットにします。
  • ファイルの境界内 (CS9142CS9143) 内に留めます。 行番号が合計行数を超えていないことを確認し、文字数が行の長さを超えていないことを確認します。 属性が生成されてからソース ファイルが変更された場合は、位置を再計算します。

インターセプター宣言が正しくありません

次のエラーは、インターセプター宣言の問題 ( InterceptsLocationAttribute 形式の問題やインターセプター 規則の違反など) を示しています。

  • CS9138: メソッド 'method' は、その包含型に型パラメーターがあるため、インターセプターとして使用できません。
  • CS9146: インターセプター メソッドは通常のメンバー メソッドである必要があります。
  • CS9151: メソッド名 M 呼び出されていないため、インターセプトできません。
  • CS9152: コンパイル内の複数のファイルにこのパスがあるため、パス 'path' を持つファイル内の呼び出しをインターセプトできません。
  • CS9153: 指定された呼び出しが複数回インターセプトされます。
  • CS9160: nameof 演算子をインターセプトできません。
  • CS9161: インターセプターを UnmanagedCallersOnlyAttributeでマークすることはできません。
  • CS9206: インターセプターをグローバル名前空間で宣言することはできません。
  • CS9207: 通常のメンバー メソッドの呼び出しではないため、'method' をインターセプトできません。
  • CS9231: InterceptsLocationAttribute のデータ引数が正しい形式ではありません。
  • CS9232: インターセプター形式のバージョン 'version' はサポートされていません。サポートされている最新バージョンは '1' です。
  • CS9233: コンパイル内の他の場所で重複しているため、ファイル 'file' の呼び出しをインターセプトできません。
  • CS9234: コンパイルで一致するファイルが見つからなかったため、ファイル 'file' の呼び出しをインターセプトできません。
  • CS9235: InterceptsLocationAttribute のデータ引数は、ファイル 'file' 内の無効な位置を参照します。

インターセプター宣言エラーを修正するには、有効なインターセプター宣言と InterceptsLocationAttribute 使用に関する次の規則に従います。

  • InterceptsLocationAttributeデータ引数を正しく書式設定します (CS9231)。 この属性には、ファイル パスと位置情報をエンコードする、具体的に構造化されたデータが必要です。 ソース ジェネレーターが、現在のインターセプター仕様に一致する予想される形式でデータを生成することを確認します。
  • InterceptsLocationAttribute (CS9232) でバージョン '1' を使用します。これは、サポートされている最新のバージョンであるためです。 ソース ジェネレーターを、サポートされていないバージョン番号ではなく、バージョン 1 形式の属性を出力するように更新します。
  • コンパイルで一意のファイル パス (CS9233CS9234) を確認します。 コンパイルに重複するファイル パスが含まれている場合は、ファイルの名前を変更または再構成して、各パスを一意にします。 属性内のファイル パスが、コンパイルに実際に含まれるファイルと一致することを確認します。
  • 有効なコードの場所 (CS9235) に位置データ点を検証します。 行番号と文字番号は、指定されたファイル内の有効なインターセプト・ポイントを参照する必要があります。 ソース ファイルが変更された場合、または位置がファイルの境界外にある場合は、属性を再生成します。
  • 非ジェネリック型 (CS9138) で非ジェネリック インターセプター メソッドを宣言します。 インターセプターは、型パラメーターを持つ型では宣言できません。 ジェネリック メソッドをインターセプトする必要がある場合は、特定の構築された型で動作する非ジェネリック包含型に非ジェネリック インターセプターを作成します。
  • インターセプターを通常のメンバー メソッド (CS9146) にします。 インターセプターは、演算子、コンストラクター、ファイナライザー、プロパティ、またはインデクサーにすることはできません。 インターセプターを通常の静的メソッドまたはインスタンス メソッドとして宣言します。
  • 式ではなく、実際のメソッド呼び出しをインターセプトします (CS9151CS9207)。 呼び出される通常のメンバー メソッドの呼び出しのみをインターセプトできます。 呼び出されずに参照されるメソッド グループ、デリゲート、またはメソッドをインターセプトすることはできません。 インターセプト可能な場所が実際のメソッド呼び出しを識別していることを確認します。
  • 重複するインターセプト試行を削除します (CS9153)。 各メソッド呼び出しは 1 回しかインターセプトできません。 複数の InterceptsLocationAttribute インスタンスが同じ呼び出しを対象としている場合は、1 つを除くすべてを削除してあいまいさを解決します。
  • nameof演算子 (CS9160) をインターセプトしないでください。 nameof演算子は実行時にメソッドを呼び出さないため、インターセプトできません。 実行時に実行される実際のメソッド呼び出しのみをインターセプトします。
  • インターセプターから UnmanagedCallersOnlyAttribute を削除します (CS9161)。 インターセプターはマネージド コードから呼び出すことができる必要があり、 UnmanagedCallersOnlyAttributeでマークすることはできません。 インターセプター メソッドの宣言から属性を削除します。
  • 名前空間内でインターセプターを宣言します (CS9206)。 インターセプターはグローバル名前空間で宣言できないため、少なくとも 1 つの名前空間宣言内に含まれている必要があります。 インターセプター クラスを名前空間にラップします。
  • コンパイル レベル (CS9152) で重複するファイル パスを解決します。 コンパイルで複数のファイルが同じパスを共有している場合、コンパイラはインターセプトするファイルを特定できません。 ビルド構成で一意のファイル パスが生成されるようにするか、ソース ファイルに別の組織戦略を使用します。