• 静态代码审查工具FxCop插件开发(c#)


            FxCop是一款微软官方提供的.net平台代码审查工具,目的是检查我们编写的程序集的代码是否符合规范。FxCop默认提供的是微软默认的审查规则,而且该规则符合《Framework DesignGuidelines》里面大部分的设计规范。因为FxCop默认提供的规范比较严格所以对开发人员的要求也比较高, 而且每个公司都有自己的一套规范,所以默认的规范并不能满足我们的要求,这就需要我们自己开发插件来进行自定义规则,而且FxCop已经集成到了Visual Stduio中,所以我们开发的插件也能在Visual Stduio运行。

           附:MSDN关于FxCop的介绍:http://msdn.microsoft.com/en-us/library/bb429476(v=vs.80).aspx

                  FxCop10.0官方下载地址:        http://www.microsoft.com/en-us/download/details.aspx?id=6544

                 官方需要安装几百兆的SDK ,这里提供了FxCop10.0 独立安装包 :http://download.csdn.net/detail/zhengwen12/7061639

    一、使用FxCop

         1.FxCop软件使用非常简单,开发人员只需要3分钟就可以搞定(其中2分钟是下载软件时间)。

                    3

    注意:1.上图中Rules 选项卡的内容代表的是工具提供的默认规则,规则描述单击鼠标就能看见。

              2. 如果在实际开发中使用工具提供的默认规则 最好去掉(如果无区域文化等特殊要求) Globalization Rules 这个审查规则。

    二、开发FxCop 插件

        由于目前官方文档没有介绍自定义规则和相关的API,所以只能靠“猜” ,这是目前找到的关于开发vb.net自定义规则的文章:http://www.cnblogs.com/zhuqil/archive/2010/12/07/FxCop.html

        所有的规则都是以dll的形式存在,其中默认规则是在FxCop的安装目录下 如:”D:Program Files (x86)Microsoft Fxcop 10.0Rules”  所以我们需要什么规则 ,只要找到默认规则的DLL反编译 然后改改就可 以了。例如:所有接口的命名 必须以“I”开头。下面就以此为例进行讲解。

      1. 在VS中新建名为 MyRules的c#类库 ,在FoxCop的安装目录找到Microsoft.Cci.dll和FxCopSdk.dll 并添加到项目引用 ,添加一个名为MyCheckRules的类 并继承自BaseIntrospectionRule基类 并覆盖   public override ProblemCollection Check(TypeNode type)方法。代码如下:

    using Microsoft.FxCop.Sdk;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyRules
    {
        public class  InterfacesNamingStandard : BaseIntrospectionRule
        {
            public InterfacesNamingStandard()
                : base("InterfacesNamingStandard", "MyRules.InterfacesNamingStandardDesign", typeof(InterfacesNamingStandard).Assembly)
            {
            }
    
            public override ProblemCollection Check(TypeNode type)
            {
                if (type == null)
                {
                    return null;
                }
                if ((type is InterfaceNode))
                {
                    if (type.ToString().StartsWith("I"))
                    {
                        return null;
                    }
                    Problem item = new Problem(base.GetResolution(new object[] { type }));
                    base.Problems.Add(item);
                }
                return base.Problems;
            }                        
        }
    }
    

               注意:1.基类构造函数第一个参数为当前定义的类名 (InterfacesNamingStandard) ,第二个参数为 程序集名+XML的文件名(XML文件在第2步定义)

    2.添加一个名为InterfacesNamingStandardDesign的XML文件,并将属性"生成操作" 改为 “嵌入的资源” 。该XML文件表示的是 当FxCop代码审查未通过时显示的相关提示信息 如未通过的原因,解决方案等。文件内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <Rules FriendlyName="自定义规则">
      <Rule TypeName="InterfacesNamingStandard" Category="Microsoft.Design" CheckId="C0001">
        <Name>
          Interface must be Started With "I"
        </Name>
        <Description>
          Interface must be Started With "I"
        </Description>
        <Url>
          http://www.cnblogs.com/
        </Url>
        <Resolution>
          Define a new interface to replace {0}.
        </Resolution>
        <Email />
        <MessageLevel Certainty="90">
          Warning
        </MessageLevel>
        <FixCategories>
          Breaking
        </FixCategories>
        <Owner />
      </Rule>
    </Rules>

    注意:1.Rule节点的TypeName属性值必须为第1步定义的类名 .

    3.使用FxCop加载生成的DLL 如下图:

    21

    4.Visual Stduio 2013中使用开发好的FxCop插件
      ①最简单的使用方法是:找到Visual Stduio 2013 中FxCop目录 例如:“D:Program Files (x86)Microsoft Visual Studio 12.0Team ToolsStatic Analysis ToolsFxCopRules”
      删除里面的所有的DLL  然后加入自己开发的插件MyRules.dll. 然后选择项目属性->代码分析->运行此规则集->选择Microsoft的所有规则,设置完成后运行代码分析,如下图:

    8

       ②如果想保留默认的规则 需要我们根据 D:Program Files (x86)Microsoft Visual Studio 12.0Team ToolsStatic Analysis ToolsRule Sets 下的规则集文件格式进行定义,该方法目前还没有进行尝试。

    5.关于调试FxCop插件

    ①可以使用附加到FxCop进程的方式。
    ②使用FxCop提供的命令行工具 在VS里设置为外部启动项 具体参考 http://www.cnblogs.com/zhuqil/archive/2010/12/07/FxCop.html

    最后,由于这方面资料比较少,所以一些规则和API使用方式都是通过Reflector反编译得来,期间可能会遇到很多错误。这就需要我们不断的去尝试。

  • 相关阅读:
    MFC自绘框架窗口客户区
    命令行下创建mysql数据库
    linux重置mysql root密码的6种方
    xampp修改mysql默认密码详解
    Java常用包装类
    Java异常处理
    Java数组
    Java流程控制
    Java基本数据类型
    golang https server分析
  • 原文地址:https://www.cnblogs.com/zw369/p/3609869.html
Copyright © 2020-2023  润新知