最近研究了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定义成嵌入的资源。
<?
xml version="1.0" encoding="utf-8"
?>
<
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
>
[email protected]
</
Email
>
<
MessageLevel
Certainty
="80"
>
Warning
</
MessageLevel
>
<
FixCategories
>
NonBreaking
</
FixCategories
>
<
Owner
>
skylin
</
Owner
>
</
Rule
>
</
Rules
>
2、在内库项目中引用Microsoft.Cci.dll和FxCopSdk.dll两个dll文件。添加一个类FunctionParametersCheck。继承BaseIntrospectionRule。
'
功能: 参数命名请采用Camel命名规范
'
创建人: 朱祁林
'
创建时间: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
=
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(
, 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#。
代码:http://files.cnblogs.com/zhuqil/MyRules.rar
原文链接: http://www.cnblogs.com/zhuqil/archive/2010/12/07/FxCop.html