C# FxCop:用于检查程序集信息值的自定义规则

C# FxCop:用于检查程序集信息值的自定义规则,c#,fxcop,fxcop-customrules,C#,Fxcop,Fxcop Customrules,有没有一种简单的方法让FxCop检查我的所有程序集是否声明了一个特定的属性值?我想确保每个人都更改了创建项目时的默认设置: [assembly: AssemblyCompany("Microsoft")] // fail [assembly: AssemblyCompany("FooBar Inc.")] // pass 一旦您知道FxCop的“最大”分析目标是模块,而不是程序集,这实际上是一条非常简单的规则。在大多数情况下,每个部件都有一个模块,因此这不会造成问题。但是,如果每个程序集都有

有没有一种简单的方法让FxCop检查我的所有程序集是否声明了一个特定的属性值?我想确保每个人都更改了创建项目时的默认设置:

[assembly: AssemblyCompany("Microsoft")] // fail

[assembly: AssemblyCompany("FooBar Inc.")] // pass

一旦您知道FxCop的“最大”分析目标是模块,而不是程序集,这实际上是一条非常简单的规则。在大多数情况下,每个部件都有一个模块,因此这不会造成问题。但是,如果每个程序集都有多个模块,因此每个程序集都会收到重复的问题通知,则可以添加检查以防止每个程序集生成多个问题

无论如何,这是规则的基本实现:

private TypeNode AssemblyCompanyAttributeType { get; set; }

public override void BeforeAnalysis()
{
    base.BeforeAnalysis();

    this.AssemblyCompanyAttributeType = FrameworkAssemblies.Mscorlib.GetType(
                                            Identifier.For("System.Reflection"),
                                            Identifier.For("AssemblyCompanyAttribute"));
}

public override ProblemCollection Check(ModuleNode module)
{
    AttributeNode assemblyCompanyAttribute = module.ContainingAssembly.GetAttribute(this.AssemblyCompanyAttributeType);
    if (assemblyCompanyAttribute == null)
    {
        this.Problems.Add(new Problem(this.GetNamedResolution("NoCompanyAttribute"), module));
    }
    else
    {
        string companyName = (string)((Literal)assemblyCompanyAttribute.GetPositionalArgument(0)).Value;
        if (!string.Equals(companyName, "FooBar Inc.", StringComparison.Ordinal))
        {
            this.Problems.Add(new Problem(this.GetNamedResolution("WrongCompanyName", companyName), module));
        }
    }

    return this.Problems;
}