FxCop: пользовательское правило для проверки значений информации сборки

Есть ли достаточно простой способ заставить 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;
}
Другие вопросы по тегам