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实例,示例如下:
若仅传入Analyzer,CodeFix不会被加载执行。var analyzer = new MissingDependsOnAttributeAnalyzer(); var codeFix = new MissingDependsOnAttributeCodeFixProvider(); await VerifyCodeFixAsync(analyzer, codeFix, originalCode, fixedCode); - Diagnostic Severity过滤问题:确认测试框架未对Diagnostic的Severity做额外限制(比如仅处理Warning级别),你当前设置的
DiagnosticSeverity.Error需能被测试识别。
内容的提问来源于stack exchange,提问作者TomH
相关产品推荐
相关产品推荐

