在VS2010中的FxCop行为,代码分析以及SuppressMessage。

4

我有一个像这样的类:

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Io")]
    public void ParaQueFalleCalidadCodigoUnoIo_ReglaCA1709()
    {

    }

    public void ParaQueFalleCalidadCodigoDosIo_ReglaCA1709()
    {

    }

我使用一个自定义的规则集文件 CustomRules.ruleset
<RuleSet Name="RulesNet" ToolsVersion="10.0">
  <RuleHintPaths>
    <Path>C:\Fxcop10.0\Rules</Path>
  </RuleHintPaths>
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">

    <Rule Id="CA1709" Action="Warning" />

  </Rules>
</RuleSet>

当我运行VS2010内置的代码分析工具时,我会收到如下警告:
CA1709: Microsoft.Naming:通过将“_Default.ParaQueFalleCalidadCodigoDosIo_ReglaCA1709()”中的成员名称“Io”的大小写更改为“IO”,纠正大小写。
现在,我可以在FxCopCmd.exe中使用相同的规则文件CustomRules.ruleset:
FxCopCmd.exe /gac /d:“C:\CompanyFramework\4.0.0.0”/f:“D:\TFS\Tests\WebApplication1\bin\WebApplication1.dll”/o:“resultsFxCop.xml”/ruleset:“=CustomRules.ruleset”/v
我得到了2个错误(FixCategory Breaking和Level Error)。

CA1709 - 通过将'_Default.ParaQueFalleCalidadCodigoUnoIo_ReglaCA1709()'中的'Io'更改为'IO',纠正成员名称中'Io'的大小写。

CA1709 - 通过将'_Default.ParaQueFalleCalidadCodigoDosIo_ReglaCA1709()'中的'Io'更改为'IO',纠正成员名称中'Io'的大小写。

  <Message Id="Io" TypeName="IdentifiersShouldBeCasedCorrectly" Category="Microsoft.Naming" CheckId="CA1709" Status="Active" Created="2013-02-05 10:24:01Z" FixCategory="Breaking">
             <Issue Name="Member" Certainty="85" Level="Error" Path="D:\TFS\Tests\WebApplication1" File="Default.aspx.cs" Line="21">Correct the casing of 'Io' in member name '_Default.ParaQueFalleCalidadCodigoUnoIo_ReglaCA1709()' by changing it to 'IO'.</Issue>
  </Message>

  <Message Id="Io" TypeName="IdentifiersShouldBeCasedCorrectly" Category="Microsoft.Naming" CheckId="CA1709" Status="Active" Created="2013-02-05 10:24:01Z" FixCategory="Breaking">
             <Issue Name="Member" Certainty="85" Level="Error" Path="D:\TFS\Tests\WebApplication1" File="Default.aspx.cs" Line="26">Correct the casing of 'Io' in member name '_Default.ParaQueFalleCalidadCodigoDosIo_ReglaCA1709()' by changing it to 'IO'.</Issue>
  </Message>

在resultsFxcop.xml中,我看到了CA1709:标识符应正确使用大小写规则的规则:
 <Rule TypeName="IdentifiersShouldBeCasedCorrectly" Category="Microsoft.Naming" CheckId="CA1709">
   <Name>Identifiers should be cased correctly</Name>
   <Description>Type, namespace, and... OMITED.</Description>
   <Resolution Name="Member">Correct the casing of '{0}' in member name {1} by changing it to '{2}'.</Resolution>
   <Owner />
   <Url>http://msdn.microsoft.com/library/ms182240(VS.100).aspx</Url>
   <Email>[none]</Email>
   <MessageLevel Certainty="85">Error</MessageLevel>
   <File Name="namingrules.dll" Version="10.0.0.0" />
  </Rule>

CA1709规则的MessageLevel:

   <MessageLevel Certainty="85">Error</MessageLevel>

两个问题:

  • 我收到错误,但CA1709规则的操作是警告
  • 使用FxCopcmd.exe忽略SuppressMessage

现在,我修改了CustomRules.ruleset并再次执行FxCopcmd.exe

<Rule Id="CA1709" Action="None" />

我没有收到任何错误提示。 我修改了CustomRules.ruleset文件后,再次执行FxCopcmd.exe。
<Rule Id="CA1709" Action="Ignore" />

我遇到了相同的2个错误。
我需要使用FxCopCmd.exe和自定义规则集。
- SuppressMessage在FxCopcmd.exe中起作用吗? - 如果Action是Warning,为什么会出现错误,使用Fxcopcmd.exe? - CA1709规则的MessageLevel Error是什么意思?比规则操作“警告”更优先吗?
有什么建议吗?
更新

http://social.msdn.microsoft.com/Forums/en/vstscode/thread/3f8931da-9a4d-47a6-b331-8b6b07aea8d6

http://social.msdn.microsoft.com/forums/en-US/vstscode/thread/3cb6c50c-7095-4551-a4e3-a3cbc7cb85be

默认的FxCop规则中,没有简单的方法来修改消息级别。

MessageLevel是消息的重要性,例如,如果您有数千条消息,最好从首先处理严重(感叹号)错误开始。

Certainty是规则编写者为每个规则分配的数字,它是消息导致代码更改的可能性。该数字是基于来自领域专家和客户的反馈以及规则中使用的启发式算法避免误报的程度而建立的。

Fix Category:这表示违规行为的修复是否会对二进制进行破坏,如果代码已经发布,则会出现这种情况。例如,您的库中有一个拼写错误,您已经将其发送给客户。现在开始在其上运行FxCop并看到拼写错误。 FxCop会告诉您这是一种破坏性的变化。如果您纠正了拼写错误并向客户发送新版本的库,则他们不能在不更改和重新编译其代码的情况下使用该库。因此,您可能希望忽略此API上的FxCop违规行为。另一方面,如果您从未发布过,则完全可以修复FxCop违规行为。
1个回答

4

SuppressMessage对FxCopcmd.exe有效吗?

是的。您需要使用定义了CODE_ANALYSIS编译符号进行编译,以便在程序集中包含SuppressMessage属性。一旦它们在其中,无论分析使用的机制如何,FxCop引擎都会识别它们。

为什么使用Fxcopcmd.exe时,如果操作是警告级别,我会收到错误信息?

FxCop生成的报告中写入的问题级别始终使用规则作者指定的级别。当您在Visual Studio中运行时,Visual Studio集成插件会使用规则集中指定的级别覆盖此级别。当您运行fxcopcmd.exe时,将一个规则配置为警告与将其配置为错误之间唯一的区别在于,检测到错误级别的规则违反将导致fxcopcmd.exe返回非零退出代码,从而允许您中断自动化构建。

如果您希望fxcopcmd.exe在生成其报告时使用您的级别覆盖,您可能希望考虑在http://visualstudio.uservoice.com/上提出建议。


1
实际上,这只意味着规则作者认为它应该处于错误级别。可用的级别按严重程度递增顺序为信息、警告、严重警告、错误和严重错误。 - Nicole Calinoiu
在C#中,我能否通过编程检测出我的程序集是否是使用CODE_ANALYSIS编译符号编译的? - Kiquenet
不是直接的。如果它包含至少一个SuppressMessageAttribute实例,则是。如果您想在不需要添加规则抑制时也能检测到它,您需要添加其他一些条件,这些条件取决于CODE_ANALYSIS符号。(如果您绝对需要这样的东西,那么在程序集级别上添加一个虚假的抑制就可以解决问题。) - Nicole Calinoiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接