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

时间:2013-07-29 18:55:00

标签: visual-studio-2012 code-analysis fxcop

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

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

The name isn't visible on the right of the CheckId on the custom rule, but is visible on the Microsoft rule.

奇怪的是,在规则集编辑器中可以看到的名称

The name is visible on both rules in the ruleset editor

我的规则有什么问题?

详细

以下是这两条规则在MSBuild输出中的显示方式(那里有一些可疑的东西,但我不明白为什么我有不同的消息):

Resolution

以下是我的规则的XML文件中的规则声明:

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 for Microsoft规则中的规则声明。

<?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>

1 个答案:

答案 0 :(得分:6)

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

这里棘手的是,对于UI显示目的,Visual Studio正在执行完全独立的搜索和加载规则程序集,而不是在代码分析运行中完成。后者是通过使用从MSBuild属性生成的命令行运行fxcopcmd.exe来执行的。前者使用嵌入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