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;
}