我正在尝试将自定义FxCop(=代码分析)规则从Visual Studio 2010迁移到Visual Studio 2012。
到目前为止,它们工作正常,除了一件事:它们的名称在结果窗口中为空(View
- > Other windows
- > Code Analysis
),只有{{ 1}}和CheckId
显示,而名称显示为Microsoft的规则:
奇怪的是,在规则集编辑器中可以看到的名称:
我的规则有什么问题?
以下是这两条规则在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>
答案 0 :(得分:6)
这是因为规则名称(而不是其类型名称)未包含在代码分析运行生成的FxCop报告中的违规消息中。从理论上讲,Visual Studio可以(并且可能应该)在开始查找其他地方之前在报告中的<Rules>
节点下查找规则名称。但是,它不在VS 2012中。相反,它仅从已加载的规则程序集中获取的规则信息中获取规则名称。
这里棘手的是,对于UI显示目的,Visual Studio正在执行完全独立的搜索和加载规则程序集,而不是在代码分析运行中完成。后者是通过使用从MSBuild属性生成的命令行运行fxcopcmd.exe
来执行的。前者使用嵌入Visual Studio插件中的完全独立的逻辑进行代码分析,并且不考虑项目级规则位置或规则集文件。 (如果您对血腥细节感到好奇,似乎是通过Microsoft.VisualStudio.CodeAnalysis.ManagedRuleProvider
程序集中的CodeAnalysis.dll
类完成的。)
所以......如果你想看到规则名称,你基本上有两个选择:
将规则程序集放在<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
),其值如下所示您的规则和显示其名称的内置规则:%FxCopDir%\Rules;C:\Foo\Bar\YourRulesFolder