FxCop,从程序集中排除规则(但将其用于其他程序集)

时间:2010-09-14 09:32:42

标签: fxcop

我想从CoreTest程序集中排除CA1822:MarkMembersAsStatic,因为NUnit测试方法无法转换为静态方法,因为如果我这样做,NUnit将不会执行它们。在其他组件中,我希望有这个规则,因为我发现它很有价值。

如果可能的话,我不喜欢为每个测试方法添加一个SuppressMessage,因为我有很多这些测试方法,它只会使文件混乱。

这是FxCop规则XML文件:

<?xml version="1.0" encoding="utf-8"?>
<FxCopProject Version="1.35" Name="Foo, Release">
 <ProjectOptions>
  <SharedProject>True</SharedProject>
  <Stylesheet Apply="False">http://www.gotdotnet.com/team/fxcop//xsl/1.35/FxCopReport.xsl</Stylesheet>
  <SaveMessages>
   <Project Status="None" NewOnly="False" />
   <Report Status="Active" NewOnly="False" />
  </SaveMessages>
  <ProjectFile Compress="True" DefaultTargetCheck="True" DefaultRuleCheck="True" SaveByRuleGroup="" Deterministic="True" />
  <EnableMultithreadedLoad>True</EnableMultithreadedLoad>
  <EnableMultithreadedAnalysis>True</EnableMultithreadedAnalysis>
  <SourceLookup>True</SourceLookup>
  <AnalysisExceptionsThreshold>10</AnalysisExceptionsThreshold>
  <RuleExceptionsThreshold>1</RuleExceptionsThreshold>
  <Spelling Locale="en-us" />
  <VersionAware>False</VersionAware>
  <OverrideRuleVisibilities>False</OverrideRuleVisibilities>
  <CustomDictionaries SearchFxCopDir="True" SearchUserProfile="True" SearchProjectDir="True" />
  <SearchGlobalAssemblyCache>False</SearchGlobalAssemblyCache>
  <DeadlockDetectionTimeout>120</DeadlockDetectionTimeout>
 </ProjectOptions>
 <Targets>
  <AssemblyReferenceDirectories>
   <Directory>$(ProjectDir)/Library/EPiServer CMS/5.2.375.7/</Directory>
   <Directory>$(ProjectDir)/Foo.Plugin/bin/Release/</Directory>
  </AssemblyReferenceDirectories>
  <Target Name="$(ProjectDir)/Foo.Core/bin/Release/Foo.Core.dll" Analyze="True" AnalyzeAllChildren="True" />
  <Target Name="$(ProjectDir)/Foo.CoreTest/bin/Release/Foo.CoreTest.dll" Analyze="True" AnalyzeAllChildren="True" />
  <Target Name="$(ProjectDir)/Foo.Example/bin/Foo.Example.dll" Analyze="True" AnalyzeAllChildren="True" />
  <Target Name="$(ProjectDir)/Foo.Web.WebForms/bin/Release/Foo.Web.WebForms.dll" Analyze="True" AnalyzeAllChildren="True" />
 </Targets>
 <Rules>
  <RuleFiles>
   <RuleFile Name="$(FxCopDir)\Rules\DesignRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\GlobalizationRules.dll" Enabled="True" AllRulesEnabled="False">
    <Rule Name="AvoidDuplicateAccelerators" Enabled="True" />
    <Rule Name="DoNotHardcodeLocaleSpecificStrings" Enabled="True" />
    <Rule Name="SetLocaleForDataTypes" Enabled="True" />
    <Rule Name="SpecifyCultureInfo" Enabled="True" />
    <Rule Name="SpecifyIFormatProvider" Enabled="True" />
    <Rule Name="SpecifyMessageBoxOptions" Enabled="True" />
   </RuleFile>
   <RuleFile Name="$(FxCopDir)\Rules\InteroperabilityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\MobilityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\NamingRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\PerformanceRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\PortabilityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\SecurityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\UsageRules.dll" Enabled="True" AllRulesEnabled="True" />
  </RuleFiles>
  <Groups />
  <Settings />
 </Rules>
 <FxCopReport Version="1.35" />
</FxCopProject>

有关如何以最方便的方式完成此任务的任何想法?

1 个答案:

答案 0 :(得分:2)

在单个FxCop运行中无法使用单独的规则集。为了解决CA1822测试方法问题,我通常会创建两个单独的FxCop项目:一个包含用于常规程序集的CA1822,另一个用于排除测试程序集的CA1822。

如果您正在使用集成到Visual Studio的某些“开发人员”团队版本中的代码分析功能,则可以对每个程序集应用不同的规则集。这是受支持的,因为该工具最终会为每个程序集单独运行fxcopcmd.exe,而不是因为它使用一些更复杂的配置来在一次运行中支持多个规则集。