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分钟是下载软件时间)。
注意: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 如下图:
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的所有规则,设置完成后运行代码分析,如下图:
②如果想保留默认的规则 需要我们根据 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反编译得来,期间可能会遇到很多错误。这就需要我们不断的去尝试。