靜態代碼審查工具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反編譯得來,期間可能會遇到很多錯誤。這就需要我們不斷的去嘗試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM