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

C#自定义CodeFixProvider未触发?Analyzer正常运行问题排查

问题

我正在开发Analyzer和CodeFixProvider,目前处于测试验证功能及调试阶段。已通过Visual Studio模板创建了Analyzer、CodeFix、Package、VSIX及单元测试项目,未修改初始配置。

在测试中调用VerifyCodeFix时,可确认Analyzer正常运行并正确报告Diagnostic错误,但CodeFixProvider仅触发FixableDiagnosticIds数组的getter方法(返回的DiagnosticId与Analyzer一致),RegisterCodeFixesAsync方法从未执行,测试在Analyzer结束后失败。

Analyzer代码(已确认可触发)

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class MissingDependsOnAttributeAnalyzer : DiagnosticAnalyzer
{
    private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Error, isEnabledByDefault: true, description: Description);

    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }

    // ... 省略其他代码

    var properties = new Dictionary<string, string>
    {
        ["FullName"] = namedTypeSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat).Replace("global::", string.Empty)
    }.ToImmutableDictionary();

    context.ReportDiagnostic(Diagnostic.Create(Rule, context.Node.GetLocation(), properties, namedTypeSymbol.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat)));
}

CodeFixProvider代码

[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(MissingDependsOnAttributeCodeFixProvider)), Shared]
public class MissingDependsOnAttributeCodeFixProvider : CodeFixProvider
{
    public sealed override ImmutableArray<string> FixableDiagnosticIds
    {
        get { return ImmutableArray.Create(MissingDependsOnAttributeAnalyzer.DiagnosticId); }
    }

    public sealed override FixAllProvider GetFixAllProvider()
    {
        return WellKnownFixAllProviders.BatchFixer;
    }

    public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
    {
         // ... 省略其他代码
    }
}

可能的原因及解决办法

  • Diagnostic属性字典与CodeFix预期不匹配:你在报告Diagnostic时添加了自定义属性FullName,如果RegisterCodeFixesAsync中对context.Diagnostics有额外过滤逻辑(比如仅处理包含特定属性的Diagnostic),可能导致匹配失败。检查CodeFix中的过滤逻辑,确保属性传递符合预期。
  • 测试项目未正确引用CodeFix程序集:右键测试项目→添加→项目引用,确认已勾选CodeFix项目,避免因引用丢失导致测试无法加载CodeFixProvider。
  • DiagnosticId拼写/大小写不一致:仔细核对MissingDependsOnAttributeAnalyzer.DiagnosticId的定义,确保CodeFix返回的ID与Analyzer完全一致(字符串匹配区分大小写)。
  • CodeFix导出特性配置错误:检查ExportCodeFixProvider特性的LanguageNames是否为CSharp,Name是否与类名一致,同时确认Shared特性已正确应用,避免实例化异常。
  • 测试代码未关联Analyzer和CodeFix:调用VerifyCodeFix时需同时传入Analyzer和CodeFix实例,示例如下:
    var analyzer = new MissingDependsOnAttributeAnalyzer();
    var codeFix = new MissingDependsOnAttributeCodeFixProvider();
    await VerifyCodeFixAsync(analyzer, codeFix, originalCode, fixedCode);
    
    若仅传入Analyzer,CodeFix不会被加载执行。
  • Diagnostic Severity过滤问题:确认测试框架未对Diagnostic的Severity做额外限制(比如仅处理Warning级别),你当前设置的DiagnosticSeverity.Error需能被测试识别。

内容的提问来源于stack exchange,提问作者TomH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:52:51