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
),只有 CheckId
和 Resolution
出现,而名称显示为 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 可以(并且可能应该)在报告中的<Rules>
节点下查找规则名称,然后再开始查找其他位置。但是,它在 VS 2012 中没有。相反,它仅从加载的规则程序集中获取的规则信息中获取规则名称。
这里的棘手之处在于,出于 UI 显示的目的,Visual Studio 对规则程序集的搜索和加载与在代码分析运行中所做的完全不同。后者是通过运行fxcopcmd.exe
来执行的,命令行是从 MSBuild 属性生成的。前者使用嵌入在 Visual Studio 插件中的完全独立的逻辑进行代码分析,并且不考虑项目级规则位置或规则集文件。 (如果您对血腥细节感到好奇,这似乎是通过CodeAnalysis.dll
程序集中的Microsoft.VisualStudio.CodeAnalysis.ManagedRuleProvider
类完成的。)
所以...如果您想查看规则名称,您基本上有两种选择:
将您的规则程序集放入 <VS install directory>\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 的插件似乎忽略了它。感谢您的回答,即使它不是我想看到的:)。
将文件复制到<VS install directory>\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 10 Standalone 中使用 VS2012 静态分析规则