参考:StyleCopSDK.chm与 Byeah的 编写StyleCop自定义规则教程(一)---编写中文备注的简单校验规则

1.建立“类库”类型的C#项目

2.加入 Microsoft.StyleCop.dll 与 Microsoft.StyleCop.CSharp.dll 的引用

3.增加一个类,继承于:SourceAnalyzer,并带有 [SourceAnalyzer(typeof(CsParser))] 标题头。

4.重写AnalyzeDocument方法

5.使用WalkDocument遍历代码,并执行指定的方法

6.建立与类同名的XML文件

编译,生成 DLL
放到C:\Program Files\Microsoft StyleCop 4.3
打开VS2008,即可让规则生效

编号定义:飞鹏替换规则为 FP+原编号,飞鹏新规则为 FPN+100开始的编号

已生效的,VS2008 打开的情况下,就不能删除了。(以前认为已生效的,要失效一次,再生效一次,是不是CACHE造成的误解)

如何调试?
生成,拷贝到stylecop目录,启动VS2008,执行 StyleCop
在生成后事件命令行输入如下内容会方便很多:
copy "$(TargetDir)$(TargetName).*" "C:\Program Files\Microsoft StyleCop 4.3" /y

element 这个对象必须非常熟悉

代码如果没有变更,检测也是假的,调试不会中断。要把使用 cache 关掉

=====跟踪

[证明是错的]如果已被系统检查了,就不会产生中断了。(例如 SA1623开启时,FP1623就不会中断)

VS2008打开时,原来注册的,现在却无法取消

VS产生的XML文件格式与记事本产生的有一些不同(都是 UTF-8)

XML是包含在DLL的资源中,而不是分成两个文件

代码分析:

执行 WalkDocument 时,StyleCop 调用 CodeWalker<T>.Start(静态方法)
(反射工具有一个错误:查找 CodeWalker.Start 的 User By 时,只找到 CSharp.Expression.WalkExpression 调用它,实际上 CsDocument类 的 WalkDocument 方法也有调用)
Start时,创立一个 CodeWalker 实例。
创立实例时,又执行 this.WalkElement
WalkElement里面代码如下:
private bool WalkElement(CsElement element, CsElement parentElement, T context)
{
    if (element != null)
    {
        // 元素不为空时
        // 第一次调用时,context 为空
        T local = context;
        if (!this.VisitElement(element, parentElement, ref local))
        {
            // 查看元素,返回 false 时
            return false;
        }

foreach (Statement statement in element.ChildStatements)
        {
            // 对元素的每一个表达式进行检查
            if (!this.WalkStatement(statement, null, null, element, local))
            {
                return false;
            }
        }

foreach (CsElement element2 in element.ChildElements)
        {
            // 对元素的每一个子类进行检查
            if (!this.WalkElement(element2, element, local))
            {
                return false;
            }
        }
    }

// 返回 true,让下一个子类检查得以继续
    return true;
}
第一次进入时,元素即 CsDocument.RootElement(Namespace{}),
VisitElement里面代码如下:
private bool VisitElement(CsElement element, CsElement parentElement, ref T context)
{
    if (this.elementCallback != null)
    {
        return this.elementCallback(element, parentElement, context);
    }

return true;
}
elementCallback 就是我们自己写的子程序了。

现在的担心,如果我们写的代码没有像原规则那样考虑那么多问题,怎么办?
不过,反射工具可以提供内部所有代码:
装载 Microsoft.StyleCop.CSharp.Rules.dll
先搜索 AnalyzeDocument (它的做法与我们的做法是一样的)找到DocumentationRules的那个(因为 SA1603在DocumentationRules中)
Microsoft.StyleCop.CSharp.DocumentationRules.AnalyzeDocument(CodeDocument) : Void
里面有一个代码:
this.CheckElementDocumentation(document2);
中间也是用 WalkDocument
    document.WalkDocument<AnalyzerSettings>(new CodeWalkerElementVisitor<AnalyzerSettings>(this.CheckDocumentationForElement), context);
注册的内容为:CheckDocumentationForElement,点下去,
对于属性,它有:this.CheckHeader(element, settings, false);
接着对于有头内容的,它执行: this.ParseHeader(element, element.Header, element.LineNumber, partialElement);
ParseHeader,对属性的处理代码如下:
        else if (element.ElementType == ElementType.Property)
        {
            this.CheckPropertyValueTag(element, doc);
            this.CheckPropertySummaryFormatting(element as Property, doc);
        }
这时,进入关键的代码:CheckPropertySummaryFormatting
这个就是网页中(http://www.cnblogs.com/Byeah/archive/2011/06/27/2091222.html)体现的代码,放心了,我们的代码就是抄它的。

自定义StyleCop规则的更多相关文章

  1. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  2. struts2 自定义校验规则

    自定义校验规则:(了解) 在Struts2自定义校验规则: 1.实现一个Validator 接口. 2.一般开发中继承ValidatorSupport 或者 FieldValidatorSupport ...

  3. yii2中自定义验证规则rules

    作者:白狼 出处:www.manks.top/article/yii2_custom_rules 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  4. CI 框架中的自定义路由规则

    在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...

  5. easyui的validatebox重写自定义验证规则的几个实例

    validatebox已经实现的几个规则: 验证规则是根据使用需求和验证类型属性来定义的,这些规则已经实现(easyui API): email:匹配E-Mail的正则表达式规则. url:匹配URL ...

  6. 自定义 Lint 规则简介

    上个月,笔者在巴黎 Droidcon 的 BarCamp 研讨会上聆听了 Matthew Compton 关于编写自己的 Lint 规则的讲话.深受启发之后,笔者想就此话题做进一步的探索. 定义 如果 ...

  7. 在ubuntu16.04中安装apache2+modsecurity以及自定义WAF规则详解

    一.Modsecurity规则语法示例 SecRule是ModSecurity主要的指令,用于创建安全规则.其基本语法如下: SecRule VARIABLES OPERATOR [ACTIONS] ...

  8. Scarpy 起始url 自定义代理 自定义去重规则

    - start_urls - 内部原理 """ scrapy引擎来爬虫中去起始的URL: 1. 调用start_requests并获取返回值 2. v = iter(返回 ...

  9. zabbix添加对自定义无规则的关键日志文件的监控

    zabbix添加对自定义无规则日志文件的监控 项目背景及思路: zabbix自带有针对日志文件的监控,自带的监控只能监控到指定文件或者正则匹配的固定日志文件,但当需要监控的文件名没有规律的时候自带监控 ...

随机推荐

  1. Orchard Oracle 支持

    Orchard v1.7发布了,非常不错的一个升级,为了支持Oracle,基本上和v1.6版差不多,只是工作流相关的表有名字超长问题,改个名就可以了,作了个patch包,发布在: https://or ...

  2. [Xamarin] 關於Internal Storage ,存取App內部使用資料 (转帖)

    最近在開發App,會使用到必須要處理一些App所使用的資料,上網路查一下Android 得作法,包含我自己也實作了一下,可能是因為對Java || Android 不是很孰悉,常常錯在 java.la ...

  3. Kali linux系列之 zmap 安装

    Kali linux系列之 zmap 安装 官方文档地址:https://zmap.io/ 准备:保证有比较顺畅的更新源,可以更新系统,下载安装包. 安装 第一步:sudo apt-get insta ...

  4. VR设备

    我本来想亲自介绍下我最近特别感兴趣的VR(虚拟现实)设备,但我发现我不会插入图片,所以我只好特意去找了一篇介绍虚拟现实现状设备的文章. 虚拟现实现状设备篇:http://www.cnblogs.com ...

  5. 一页纸商业计划书 (Business Plan) 模板(转载)

    本文转载自:https://blog.eood.cn/business-plan 假如你也有一个 idea ,但是还处于想法阶段,这个商业计划书模板能够帮你理清思路. 这个一页 BP 模板简单实用,分 ...

  6. Jenkins + GitHub + fir-cli 一行命令从源码到fir.im

    上周简书作者宣X_x  分享了一篇文章--用Jenkins+GitHub+Xcode+fir搭了一个持续集成环境,整个记录见(传送门). _______ 其实fir.im为我们提供了一个更简单的方式: ...

  7. 配置JDK时环境变量path和JAVA_HOME的作用

    1.PATH环境变量.作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.需要把jdk安装目录下的bin目录增 ...

  8. Android Error Message

    JAVA_HOME error. Add environment variable ANDROID_STUDIO, which is the same as %JAVA_HOME%, but one ...

  9. Android视觉规范-间距规范与文字规范单位换算(dip、sp与px)

    http://blog.csdn.net/shimiso/article/details/29826073 1.dip与px Android工程师在写页面时,margin值的单位是dip,而视觉设计师 ...

  10. SQL SERVER 2008中输入汉字乱码的问题

    搭建服务器时,系统是英文版windows server 2008 ,安装的中文语言包.安装SqlServer2008 后,数据库中文显示乱码. baidu 后,说是 排序规则 的问题.修改为 Chin ...