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

Posted

技术标签:

【中文标题】FxCop:检查程序集信息值的自定义规则【英文标题】:FxCop: custom rule for checking assembly info values 【发布时间】:2011-11-11 09:16:00 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

一旦您知道 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;

【讨论】:

以上是关于FxCop:检查程序集信息值的自定义规则的主要内容,如果未能解决你的问题,请参考以下文章

Fxcop 针对 VS 2010 设计的自定义代码不适用于 VS 2012

Fxcop 自定义规则未显示在 Fxcop GUI 中

自定义控件的 FxCop 自定义规则

如何在 FxCop 的自定义规则中获取传递给方法的参数值?

FxCop 中的自定义规则仅适用于由特定类型的方法调用的方法

FxCop 自定义规则检查命名空间