Roslyn DiagnosticSuppressor API的执行顺序及实现细节咨询
Roslyn DiagnosticSuppressor API 常见问题解答
1. 是否可使用诊断抑制器抑制自定义诊断?是否有相关实现示例?
可以。前提是定义自定义诊断时,需将其IsSuppressible属性设置为true,让诊断抑制器能够识别并处理它。
简单实现示例
自定义诊断定义
internal static class MyCustomDiagnostics { public static readonly DiagnosticDescriptor MyRule = new( id: "MY001", title: "自定义诊断", messageFormat: "触发自定义诊断", category: "Custom", defaultSeverity: DiagnosticSeverity.Warning, isEnabledByDefault: true, description: "这是一个可被抑制的自定义诊断", isSuppressible: true); // 关键:开启可抑制标记 }
诊断抑制器实现
[DiagnosticAnalyzer(LanguageNames.CSharp)] public class MyDiagnosticSuppressor : DiagnosticSuppressor { public override ImmutableArray<SuppressionDescriptor> SupportedSuppressions => ImmutableArray.Create(SuppressionDescriptor.Create( id: "SUPPRESS_MY001", suppressedDiagnosticId: "MY001", justification: "符合特定条件时抑制该诊断")); public override void ReportSuppressions(SuppressionAnalysisContext context) { foreach (var diagnostic in context.ReportedDiagnostics) { // 添加自定义判断逻辑,根据代码上下文决定是否抑制 if (ShouldSuppress(diagnostic, context)) { context.ReportSuppression(Suppression.Create( SupportedSuppressions[0], diagnostic)); } } } private bool ShouldSuppress(Diagnostic diagnostic, SuppressionAnalysisContext context) { // 示例:诊断关联的语法节点为特定标识符时抑制 var syntaxNode = context.GetSyntaxNode(diagnostic.Location.SourceSpan); return syntaxNode is IdentifierNameSyntax name && name.Identifier.Text == "AllowSuppress"; } }
2. 诊断抑制器是否同时支持IDE与独立控制台工具,还是仅在IDE中生效?
两者都支持。无论是Visual Studio、Rider等基于Roslyn的IDE,还是dotnet build、dotnet analyze这类控制台工具,只要运行环境依赖Roslyn进行代码分析,诊断抑制器都会在诊断流程中生效,自动处理符合条件的诊断抑制。
3. 诊断抑制器能否以NuGet包形式分发并安装?
可以。诊断抑制器属于Roslyn分析器的扩展类型,可将其项目打包为标准NuGet包,打包方式与普通分析器包一致。其他项目安装该NuGet包后,抑制器会自动集成到项目的代码分析流水线中,无需额外配置。
4. 诊断抑制器在编译器操作中的执行顺序如何?是否在编译结束操作之后执行?
诊断抑制器的执行时机是所有诊断生成完成之后,编译结束操作之前。
根据Roslyn的分析器动作语义规则:
- 编译开始操作最先执行,随后是各类符号、语法节点的分析动作,生成所有诊断。
- 当所有分析器完成诊断输出后,Roslyn会调用DiagnosticSuppressor的
ReportSuppressions方法,处理诊断抑制逻辑。 - 待所有抑制操作完成后,才会执行编译结束操作。
需注意,除文档明确规定的顺序外,其他无顺序保证的动作不会影响诊断抑制器的执行时机,它始终在诊断全量生成后、编译结束前运行。
内容的提问来源于stack exchange,提问作者SENya
相关产品推荐
相关产品推荐

