c# - FXCop 自定义规则未出现在规则集中

标签 c# fxcop

我按照此处的步骤创建了一个新的自定义规则并将其添加到 VSStudio 2013 中的规则集中:

http://blog.tatham.oddie.com.au/2010/01/06/custom-code-analysis-rules-in-vs2010-and-how-to-make-them-run-in-fxcop-and-vs2008-too/

然而,尽管我尽了一切努力,自定义规则并没有出现在规则集文件中。

如果我在 FXCop 编辑器中添加规则,它会显示并正确分析目标项目。

这是规则文件,它是项目中的嵌入资源:

<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="PSI Custom FxCop Rules">
<Rule TypeName="EnforceHungarianNotation" Category="PSIRules" CheckId="CR0001">
<Name>Enforce Hungarian Notation</Name>
<Description>Checks fields for compliance with Hungarian notation.</Description>
<Resolution>Field {0} is not in Hungarian notation. Field name should be prefixed with '{1}'.</Resolution>
<MessageLevel Certainty="100">Error</MessageLevel>
<FixCategories>Breaking</FixCategories>
<Url />
<Owner />
<Email />
</Rule>
</Rules>

这是我的规则集:

<?xml version="1.0" encoding="utf-8"?>
    <RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">
         <RuleHintPaths>       
             <Path>C:\App\PSI\Development\Source\JHA.ProfitStars.PSI\JHA.ProfitStars  
                   .PSI.FxCop\bin\Debug</Path>
         </RuleHintPaths>
    </RuleSet>

我什至尝试添加下面的行,但现在它在规则集中显示了一条未知规则:

    <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis"  
         RuleNamespace="Microsoft.Rules.Managed">
         <Rule Id="CR0001" Action="Error" />
    </Rules>

有人可以帮我理解我在这里做错了什么吗?

编辑:

规则的基类:

internal abstract class BaseFxCopRule : BaseIntrospectionRule
{
    protected BaseFxCopRule(string ruleName)
        : base(ruleName, "JHA.ProfitStars.PSI.FxCop.Rules", typeof(BaseFxCopRule).Assembly)
    { }
}

规则类:

internal sealed class EnforceHungarianNotation : BaseFxCopRule
{
    public EnforceHungarianNotation()
        : base("EnforceHungarianNotation")
    { 
    }

    public override TargetVisibilities TargetVisibility
    {
        get
        {
            return TargetVisibilities.NotExternallyVisible;
        }
    }

    public override ProblemCollection Check(Member member)
    {
        Field field = member as Field;
        if (field == null)
        {
            // This rule only applies to fields.
            // Return a null ProblemCollection so no violations are reported for this member.
            return null;
        }

        if (field.IsStatic)
        {
            CheckFieldName(field, s_staticFieldPrefix);
        }
        else
        {
            CheckFieldName(field, s_nonStaticFieldPrefix);
        }

        // By default the Problems collection is empty so no violations will be reported
        // unless CheckFieldName found and added a problem.
        return Problems;
    }
    private const string s_staticFieldPrefix = "s_";
    private const string s_nonStaticFieldPrefix = "m_";

    private void CheckFieldName(Field field, string expectedPrefix)
    {
        if (!field.Name.Name.StartsWith(expectedPrefix, StringComparison.Ordinal))
        {
            Resolution resolution = GetResolution(
              field,  // Field {0} is not in Hungarian notation.
              expectedPrefix  // Field name should be prefixed with {1}.
              );
            Problem problem = new Problem(resolution);
            Problems.Add(problem);
        }
    }
}

最佳答案

看起来你的路径有点不稳定,删除一些空格和不需要的字符:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">
     <RuleHintPaths>       
         <Path>C:\App\PSI\Development\Source\JHA.ProfitStars.PSI\JHA.ProfitStars.PSI.FxCop\bin\Debug</Path>
     </RuleHintPaths>
</RuleSet>

同时将 rulesdll 添加到 Microsoft Visual Studio [版本]\Team Tools\Static Analysis Tools\FxCop\Rules 位置将解决必须使用规则提示路径的问题。

由于我无法检测到您的自定义规则有任何问题,请查看您是否选择了显示所有规则的选项:

enter image description here

此外,使用以下 BaseRule 可能会有所帮助:

protected BaseRule(string name)
        : base(

            // The name of the rule (must match exactly to an entry
            // in the manifest XML)
            name,

            // The name of the manifest XML file, qualified with the
            // namespace and missing the extension
            typeof(BaseRule).Assembly.GetName().Name + ".Rules",

            // The assembly to find the manifest XML in
            typeof(BaseRule).Assembly)
    {
    }

关于c# - FXCop 自定义规则未出现在规则集中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268029/

相关文章:

c# - .net 页面无故加载两次

c# - 确定一个方法是否调用另一个包含新语句的程序集中的方法,反之亦然

C# - FieldInfo 和 PropertyInfo 是不可变的还是可变的?

c# - FxCop 讨厌我对 MVVM 的使用

c# - 存储过程返回值在 Entity Framework 中是int

c# - 如果我有 PropertyInfo 和带有此扩展变量的对象,我可以调用扩展方法吗?

c# - 从 TLB 程序集创建 DLL

c# - 一个良好的、完整的 C# 单声道兼容游戏引擎

static-analysis - 如何在现有代码库上实现 FxCop/静态分析

.net - FxCop 和代码分析规则