静态代码审查工具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.0\Rules”  所以我们需要什么规则 ,只要找到默认规则的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.0\Team Tools\Static Analysis Tools\FxCop\Rules”
  删除里面的所有的DLL  然后加入自己开发的插件MyRules.dll. 然后选择项目属性->代码分析->运行此规则集->选择Microsoft的所有规则,设置完成后运行代码分析,如下图:

8

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

5.关于调试FxCop插件

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

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

posted @ 2014-03-18 23:48  Mao先生  阅读(4437)  评论(1编辑  收藏  举报