通过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定义成嵌入的资源。

复制代码
 
 
<? 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 > 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。

复制代码
 
 
' 功能: 参数命名请采用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 = 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#。

代码:http://files.cnblogs.com/zhuqil/MyRules.





本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/12/07/FxCop.html,如需转载请自行联系原作者


相关文章
|
11月前
|
开发框架 安全 .NET
[牛腩]如何关闭.net framework4.0的请求验证
[牛腩]如何关闭.net framework4.0的请求验证
77 0
|
小程序 安全 API
.NET企业微信回调配置(数据回调URL和指令回调URL验证)(一)
.NET企业微信回调配置(数据回调URL和指令回调URL验证)
808 0
.NET企业微信回调配置(数据回调URL和指令回调URL验证)(一)
|
开发框架 JSON 前端开发
ASP.NET MVC5----常见的数据注解和验证
ASP.NET MVC5----常见的数据注解和验证
301 0
ASP.NET MVC5----常见的数据注解和验证
|
安全
.NET 6新新东西--nuget包验证
.NET 6新新东西--nuget包验证
173 0
|
缓存 JSON 安全
从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之五 || Swagger的使用 3.3 JWT权限验证,两种方法
群友反馈: 群里有小伙伴反馈,在Swagger使用的时候报错,无法看到列表,这里我说下如何调试和主要问题: 1、如果遇到问题,这样的:   请在浏览器 =》 F12 ==》 console 控制台 ==》点击错误信息地址 或者直接链接http://localhost:xxxxx/swagger/v1/swagger.
3651 0
|
前端开发 数据安全/隐私保护
net MVC中的模型绑定、验证以及ModelState
net MVC中的模型绑定、验证以及ModelState 模型绑定 模型绑定应该很容易理解,就是传递过来的数据,创建对应的model并把数据赋予model的属性,这样model的字段就有值了。
1654 0