zoukankan      html  css  js  c++  java
  • 通过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#。

    代码:https://files.cnblogs.com/zhuqil/MyRules.rar

    作者:朱祁林 出处:http://zhuqil.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。  
  • 相关阅读:
    高斯消元
    UVa12103
    UVa10294
    UVa11762
    牛客网算法工程师能力评估
    华为研发工程师编程题
    网易2017春招笔试真题编程题集合
    2017网易有道内推编程题
    2017网易雷火实习生招聘编程题
    数组---面试知识点整理
  • 原文地址:https://www.cnblogs.com/zhuqil/p/FxCop.html
Copyright © 2011-2022 走看看