You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:25:37