使用Roslyn API实现的C#自定义诊断规则未生效求助
自定义Roslyn诊断规则不生效的排查与解决
核心排查方向及修复方案
1. 分析器注册逻辑校验
- 确认
DiagnosticAnalyzer的SupportedDiagnostics属性正确返回自定义诊断实例,诊断ID、类别、默认严重级别必须配置无误:public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(MyCustomRule.Descriptor); - 检查
Initialize方法是否正确注册了对应接收器:- 语法分析需调用
context.RegisterSyntaxNodeAction,指定目标语法节点类型(如InvocationExpressionSyntax); - 语义分析需调用
context.RegisterSymbolAction或context.RegisterCompilationAction。
- 语法分析需调用
2. 分析器引用方式检查
- 必须将自定义分析器打包为NuGet包,再引用到测试项目中——普通项目引用无法让Roslyn编译器加载分析器。
- 验证测试项目的
Dependencies > Analyzers下是否显示自定义分析器名称,确认包已正确安装。
3. .editorconfig配置验证
- 确保.editorconfig中正确启用规则并设置触发编译错误的级别:
dotnet_diagnostic.[你的规则ID].severity = error - 确认.editorconfig放置在项目根目录,且IDE已识别(可通过Visual Studio右下角的.editorconfig状态指示器确认)。
4. 项目编译配置检查
- 打开测试项目的
csproj文件,确认已启用代码分析:<EnableNETAnalyzers>true</EnableNETAnalyzers> <AnalysisLevel>latest</AnalysisLevel> - 检查Visual Studio设置:
工具 > 选项 > 文本编辑器 > C# > 代码分析 > 常规,确保勾选“生成时运行代码分析”。
5. 分析器业务逻辑调试
- 附加调试器到
VBCSCompiler.exe进程,在分析器代码中设置断点,验证逻辑是否正确命中目标代码。 - 检查分析逻辑中的条件判断是否过于严苛,导致漏识别符合规则的代码(比如方法名匹配、符号类型判断是否准确)。
内容的提问来源于stack exchange,提问作者Mojtaba Khooryani
相关产品推荐
相关产品推荐

