SonarQube7.6实现C#自定义规则

SonarQube7.6实现C#自定义规则

前言

基于项目需要,我们在SonarQube7.6部署完成之后开始实现代码规则自定义。

C#规则项目创建和验证

首先,打开SonarQube7.6,确认系统运行正常

打开Visual Studio创建规则分析器,通过搜索Analyzer找到项目模板。

创建代码规则项目Analyzer2

我们现在定义一个规则,不允许使用Form1_Load方法,在wpf程序中应该使用MVVM架构通过事件绑定实现窗体加载逻辑。

代码规则使用AI生成,如下:

复制代码
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;

namespace Analyzer1
{
    [DiagnosticAnalyzer(LanguageNames.CSharp)]
    public class WpfFormLoadAnalyzer : DiagnosticAnalyzer
    {
        public const string DiagnosticId = "S9002";

        private const string Title = "WinForms Form1_Load Method Usage";
        private const string MessageFormat = "WinForms项目不允许使用Form1_Load方法";
        private const string Description = "检测WinForms项目中是否使用了Form1_Load方法";
        private const string Category = "Usage";

        private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
            DiagnosticId,
            Title,
            MessageFormat,
            Category,
            DiagnosticSeverity.Error,
            true,
            Description);

        public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);

        public override void Initialize(AnalysisContext context)
        {
            context.RegisterSyntaxNodeAction(AnalyzeMethodDeclaration, SyntaxKind.MethodDeclaration);
        }

        private static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context)
        {
            var methodDeclaration = (MethodDeclarationSyntax)context.Node;

            // 检查方法名是否为Form1_Load
            if (methodDeclaration.Identifier.ValueText == "Form1_Load")
            {
                // 检查是否是WinForms项目
                var isWinForms = context.Compilation.ReferencedAssemblyNames
                    .Any(asm => asm.Name.Equals("System.Windows.Forms"));

                if (isWinForms)
                {
                    context.ReportDiagnostic(Diagnostic.Create(Rule, methodDeclaration.GetLocation()));
                }
            }
        }
    }
}

安全起见,将Microsoft.CodeAnalysis.CSharp改成2.1.0版本。避免兼容问题

新建一个winform项目,引用代码规则分析

可以看到规则生效:

规则配置

首先停止SonarQube7.6,打开规则插件

找到rule.xml

复制一条Rule标签,修改key,详细的描述可以后续修改,并使用中文以实现汉化。

确保修改成功,如图所示

通过复制原有的规则文件,生成规则文件,并压缩至压缩包

关键的一步:将Analyzer2.dll压缩至规则包中

重新运行SonarQube7.6,打开规则配置

找到S9002规则 并激活


到此,规则配置完成

实现规则分析

删除本C#项目的SonarQube配置

删除C:\Users\Administrator\AppData\Local\Temp下的Sonar配置

然后执行stat build end三个指令,这里需要安装VS2017

复制代码
"D:\Program Files\sonar-scanner-msbuild-4.3.1.1372-net46\SonarScanner.MSBuild.exe" begin /k:"winform" /d:sonar.host.url="http://127.0.0.1:9000" /d:sonar.login="050741d347e281e195485c79c21bd81dee435247"
MsBuild.exe /t:Rebuild
"D:\Program Files\sonar-scanner-msbuild-4.3.1.1372-net46\SonarScanner.MSBuild.exe" end /d:sonar.login="050741d347e281e195485c79c21bd81dee435247"

查看规则运用情况:

到此,规则自定义完成。

附1:SonarQube7.6的C#规则源码

首先提供SonarQube7.6的C#规则源码,有助于我们理解其运行规则。
https://github.com/SonarSource/sonar-dotnet
https://github.com/SonarSource/sonar-dotnet/tags?after=5.11.0.1756

附2:本文档涉及的相关源码

https://gitee.com/chenheze90/L33_SonarQube7.6

相关推荐
Agent产品评测局13 小时前
企业数据处理自动化落地,抓取分析全流程实现方案 —— 2026企业级智能体选型与技术路径深度解析
运维·人工智能·ai·自动化
牛奶咖啡1313 小时前
DevOps自动化运维实践_ansible-playbook的应用
自动化·云计算·ansible·devops·playbook·playbook的常见使用示例·playbook变量主机命令
Gofarlic_OMS13 小时前
装备制造企业Fluent许可证成本分点典型案例
java·大数据·开发语言·人工智能·自动化·制造
北京耐用通信14 小时前
无缝衔接·高效传输——耐达讯自动化CC-Link IE转Modbus TCP核心解决方案
网络·人工智能·物联网·网络协议·自动化·信息与通信
Agent产品评测局14 小时前
互联网行业自动化平台选型,运营全流程提效指南:2026企业级智能体架构与实战全解析
运维·人工智能·ai·chatgpt·架构·自动化
ZC跨境爬虫14 小时前
Scrapy工作空间搭建与目录结构解析:从初始化到基础配置全流程
前端·爬虫·python·scrapy·自动化
三思守心15 小时前
从 0 到 1 搭建自动化内容工厂:深度测评楼兰AI及其在全平台发帖中的表现
运维·服务器·自动化
ZKNOW甄知科技16 小时前
数智同行:甄知科技2026年Q1季度回顾
运维·服务器·人工智能·科技·程序人生·安全·自动化
跨境麦香鱼16 小时前
Playwright vs Puppeteer:2026自动化任务与爬虫工具如何选?
运维·爬虫·自动化
北京耐用通信16 小时前
不换设备、不重写程序:耐达讯自动化网关如何实现CC-Link IE转Modbus TCP的高效互通?
人工智能·科技·物联网·网络协议·自动化·信息与通信