通過FxCop來驗證.NET編碼規范
最近研究了fxcop,有些心得,寫出來分享一下。
FxCop介紹:
FxCop是一個代碼分析工具,它依照微軟.NET框架的設計規范對托管代碼assembly進行檢查。它使用基于規則的引擎,來檢查出你代碼中不合規范的部分;你也可以定制自己的規則加入到這個引擎。
還有一款很流行的代碼檢測工具叫做StyleCop。之所以選擇使用FxCop有兩個原因,首先是StyleCop不支持VB.Net,而我們用VB.Net做后臺開發的。第二是FxCop有非常強大的定制規則引擎的能力,這方面的能力StyleCop不如FxCop。
FxCop使用:
1、下載FxCop
最新版本的是FxCop 10.0。我是使用FxCop 1.36版的。FxCop 10.0可以到微軟的官網下載。FxCop 1.36可以到床上等你上下載。微軟的1.36這個版本的下載鏈接好像失效了。
2、安裝:略
3、運行界面:
1)、打開FxCop程序,單擊“Project”|“Add Targets”命令,添加待檢查的程序集,可添加多個。
2)、打開FxCop程序,單擊“Project”|“Add Rules”命令,添加自定義的規則,可添加多個。
3)、單擊工具欄上的“Analyze”按鈕,FxCop將自動執行檢測,檢測完畢后,結果將在右側的列表中顯示。單擊某個列表項,FxCop下方將顯示該結果的詳細信息。如圖上圖所示。
這里使用的都是微軟自帶的規則,你還可以自定義規則,見下一節。
FxCop自定義引擎:
FxCop能實現自定義的引擎規則,這里我用個例子來說明。例子是參數命名使用Camel命名規范,格式為:對象類型+對象描述。
1、用vs2008創建一個 class library。fxcop還需要一個定義規則的XML文件。TypeName表示定義一規則的類名。Description表示錯誤信息。將此xml定義成嵌入的資源。
<Rules FriendlyName="自定義規則">
<Rule TypeName="FunctionParametersCheck" Category="參數命名規范" CheckId="C10001">
<Name>參數命名請采用Camel命名規范</Name>
<Description>
參數命名請采用Camel命名規范,格式為:對象類型+對象描述。
</Description>
<Url>www.cnblogs.com/zhuqil</Url>
<Resolution>
函數{0}的參數{1}命名不符合Camel命名規范,格式為:對象類型+對象描述。
Integer int intQuantity
String str strFname
</Resolution>
<Email>zhuqi0@126.com</Email>
<MessageLevel Certainty="80">Warning</MessageLevel>
<FixCategories>NonBreaking</FixCategories>
<Owner>skylin</Owner>
</Rule>
</Rules>
2、在內庫項目中引用Microsoft.Cci.dll和FxCopSdk.dll兩個dll文件。添加一個類FunctionParametersCheck。繼承BaseIntrospectionRule。
'創建人: 朱祁林
'創建時間:2010-12-07
'修改人: 朱祁林
'修改時間:2010-12-07
Imports Microsoft.FxCop.Sdk
Imports System
Namespace MySoftRules
Public Class FunctionParametersCheck
Inherits BaseIntrospectionRule
' Methods
Public Sub New()
MyBase.New("FunctionParametersCheck", "CustomRules.CustomXMLRules", GetType(FunctionParametersCheck).Assembly)
End Sub
Public Overrides Function Check(ByVal member As Member) As ProblemCollection
Dim method As Method = TryCast(member, Method)
If ((Not method Is Nothing) AndAlso (method.DeclaringMember Is Nothing)) Then
Dim i As Integer
For i = 0 To method.Parameters.Count - 1
'true:找到不符合規范的參數,false表示沒有找到不符合規范的參數
Dim blnFoundAddString As Boolean = False
Dim strFullType As String = method.Parameters.Item(i).Type.FullName
Dim strType As String = strFullType.Substring((strFullType.LastIndexOf(".") + 1), ((strFullType.Length - strFullType.LastIndexOf(".")) - 1))
Dim strName As String = method.Parameters.Item(i).Name.Name
If strType.ToLower() = "string" Then
blnFoundAddString = CheckField(strName, "str")
ElseIf strType.ToLower() = "int32" Then
blnFoundAddString = CheckField(strName, "int")
End If
If blnFoundAddString Then
Dim resolu As Resolution = MyBase.GetResolution(method.ToString, strName)
MyBase.Problems.Add(New Problem(resolu))
End If
Next i
End If
Return MyBase.Problems
End Function
'檢查命名規范
Private Function CheckField(ByVal strName As String, ByVal strAbbreviation As String) As Boolean
Dim intLength As Integer = strAbbreviation.Length
Try
If (strName.Substring(0, intLength) <> strAbbreviation) Then
Return True
End If
If Char.IsLower(strName.Chars(strAbbreviation.Length)) Then
Return True
End If
Catch obj1 As Exception
Return True
End Try
Return False
End Function
End Class
End Namespace
從上面代碼可以看出,在類的構造函數中,關聯了開始定義的XML文件。為了簡便起見,這里只對string和int兩種類型說明。
得到CustomRules.dll這個最終的輸出。
使用:有兩種方法使用。
1、使用fxcop工具,見前文
2、與vs2008集成,將這個dll放置到:VS2008安裝路徑\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop\Rules\目錄下。選擇一個項目,鼠標右鍵點擊“運行代碼分析”。
分析結果將顯示在”錯誤列表”的”警告”標簽頁中。雙擊其中一項,即可定位到不符合規范的源代碼行,即可進行代碼調整。
將不符合規范的代碼:
調整為:
調試:可以看到我們建立的是類庫項目,那么如何進行調試來進行開發呢。
1、修改類庫項目的屬性,將啟動外部程序改成安裝的FxcopCmd.exe:
2、將命令行參數修改成:out:"results.xml" /file:"C:\MyRules\TestProject\bin\Debug\TestProject.dll" /rule:"CustomRules.dll" /D:"C:\Program Files\Microsoft FxCop 1.36"
3、這樣就可以調試了。
總結:本文詳細介紹了FxCop的使用過程,并通過一個示例來進行說明。FxCop是對中間語言進行檢測的,所以這里的代碼同樣適用于C#。
留言列表