FxCop 自定义规则在 VS2012 中没有名称(但“官方”规则有名称)

Posted

技术标签:

【中文标题】FxCop 自定义规则在 VS2012 中没有名称(但“官方”规则有名称)【英文标题】:FxCop custom rules don't have a name in VS2012 (but "official" rules have a name) 【发布时间】:2013-07-29 18:55:00 【问题描述】:

我正在尝试将我们的自定义 FxCop(= 代码分析)规则从 Visual Studio 2010 迁移到 Visual Studio 2012。

到目前为止,它们工作正常,除了一件事:它们的名字在结果窗口中是空白的 (View -> Other windows -> Code Analysis),只有 CheckIdResolution 出现,而名称显示为 Microsoft 的规则:

奇怪的是,这个名字在规则集编辑器中是可见的:

我的规则有什么问题?

详情

这两个规则在 MSBuild 的输出中是如何显示的(那里有些可疑,但我不明白为什么我有不同的消息):

6>c:\Users\Me\MySolution\MyProject\Program.cs(15): warning : CA1804 : Microsoft.Performance : 'Foo<T>.SomeMethod()' declares a variable, 'z', of type 'int', which is never used or is only assigned to. Use this variable or remove it.
6>MSBUILD : warning : CF1001 : CustomRules.ThreadSafety : The public Public Field "Tests.Program.Foo" must be preceded of readonly

这是我的规则在 XML 文件中的规则声明:

<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="CustomRules">
  <Rule TypeName="PublicFieldsMustBeReadonly" Category="CustomRules.ThreadSafety" CheckId="CF1001">
    <Name>Public Fields must be readonly or must be replaced with a Getter/Setter Method.</Name>
    <Description>Public Fields must be readonly or must be replaced with a Getter/Setter Method.</Description>
    <GroupOwner>MyCompany</GroupOwner>
    <DevOwner>Me</DevOwner>
    <Owner>Me</Owner>
    <Url>http://example.com</Url>
    <Resolution>The public Public Field "0" must be preceded of readonly</Resolution>
    <Email>my@email.com</Email>
    <MessageLevel Certainty="100">Warning</MessageLevel>
    <FixCategories>Breaking</FixCategories>
  </Rule>
</Rules>

这里是 Microsoft 规则的 XML 中的规则声明。

<Rules FriendlyName="Performance Rules">
  <Rule TypeName="RemoveUnusedLocals" Category="Microsoft.Performance" CheckId="CA1804">
    <Name>
      Remove unused locals
    </Name>
    <Description>
      Remove locals that are not used or are only assigned to in method implementations.
    </Description>
    <Url>
      @ms182278(VS.100).aspx
    </Url>
    <Resolution>
      0 declares a variable, 1, of type 2, which is never used or is only assigned to. Use this variable or remove it.
    </Resolution>
    <Email />
    <MessageLevel Certainty="95">
      Warning
    </MessageLevel>
    <FixCategories>
      NonBreaking
    </FixCategories>
    <Owner />
  </Rule>
</Rules>

【问题讨论】:

【参考方案1】:

发生这种情况是因为规则名称(与其类类型名称相反)未包含在代码分析运行生成的 FxCop 报告中的违规消息中。理论上,Visual Studio 可以(并且可能应该)在报告中的&lt;Rules&gt; 节点下查找规则名称,然后再开始查找其他位置。但是,它在 VS 2012 中没有。相反,它仅从加载的规则程序集中获取的规则信息中获取规则名称。

这里的棘手之处在于,出于 UI 显示的目的,Visual Studio 对规则程序集的搜索和加载与在代码分析运行中所做的完全不同。后者是通过运行fxcopcmd.exe 来执行的,命令行是从 MSBuild 属性生成的。前者使用嵌入在 Visual Studio 插件中的完全独立的逻辑进行代码分析,并且不考虑项目级规则位置或规则集文件。 (如果您对血腥细节感到好奇,这似乎是通过CodeAnalysis.dll 程序集中的Microsoft.VisualStudio.CodeAnalysis.ManagedRuleProvider 类完成的。)

所以...如果您想查看规则名称,您基本上有两种选择:

    将您的规则程序集放入 &lt;VS install directory&gt;\Team Tools\Static Analysis Tools\FxCop\Rules 文件夹中,以便 Visual Studio 拾取它。

    添加一个 HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\Code Analysis\FxCopRulePath 注册表节点(创建一个名为 Code Analysis 的新键,带有一个空格,而不是使用现有的 CodeAnalysis),其值如下所示,以允许您的规则和内置-in 规则显示他们的名字:%FxCopDir%\Rules;C:\Foo\Bar\YourRulesFolder

【讨论】:

就我而言,我使用了.ruleset 文件的RuleHintPaths 标记来提供我的DLL 的路径,但正如你所说,VS 的插件似乎忽略了它。感谢您的回答,即使它不是我想看到的:)。 将文件复制到&lt;VS install directory&gt;\Team Tools\Static Analysis Tools\FxCop\Rules 但这不是最理想的,因为我们经常添加或调整规则。我的系统上没有注册表项,所以我尝试创建它,但它似乎不起作用。我有一个 Windows 7 64 位系统,密钥可以位于其他地方吗?谢谢! 添加注册表项后是否重新启动了 Visual Studio?此外,您是否尝试在预先存在的 HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\CodeAnalysis 键下添加 FxCopRulePath 值,或者您是否创建了一个新的 Code Analysis 键,单词之间有一个空格? (后者是必要的。) 我没有注意到密钥名称中的空格。现在我使用HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\Code Analysis\FxCopRulePath,在Code Analysis 中有一个空格,它可以工作。我正在编辑您的帖子以告诉人们注意这个空间,当已经有一个名为 CodeAnalysis 的键时,很容易错过它。非常感谢!

以上是关于FxCop 自定义规则在 VS2012 中没有名称(但“官方”规则有名称)的主要内容,如果未能解决你的问题,请参考以下文章

Fxcop 自定义规则未显示在 Fxcop GUI 中

我们如何在 FxCop 10 Standalone 中使用 VS2012 静态分析规则

忽略某些特定情况的内置 FxCop 规则。自定义 FxCop 规则?

VS2010 自定义代码分析规则

自定义控件的 FxCop 自定义规则

使用 FxCop 获得百分比代码覆盖率