6

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

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

该名称在自定义规则的 CheckId 右侧不可见,但在 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>
4

1 回答 1

6

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

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

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

  1. 将您的规则程序集放在<VS install directory>\Team Tools\Static Analysis Tools\FxCop\Rules文件夹中,以便 Visual Studio 拾取它。

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

于 2013-08-02T12:35:39.053 回答