Анализ кода AssemblyNode.GetType всегда возвращает ноль

Я пишу пользовательские правила анализа кода для Visual Studio 2010 (в основном FxCop, но самая новая версия). Я пытаюсь получить атрибут (или коллекцию всех атрибутов), примененный к проверяемой сборке, используя следующий код:

public override ProblemCollection Check( ModuleNode module )
{
    AssemblyNode assembly = module as AssemblyNode;
    if ( assembly != null )
    {
        Identifier ns = Identifier.For( "System.Reflection" );
        Identifier attr = Identifier.For( "AssemblyCopyrightAttribute" );
        TypeNode type = assembly.GetType( ns, attr );         
        ...

... но 'type' всегда равен null, даже если я точно знаю, что такой атрибут определен для сборки.

Более того... когда я отлаживаю это, я вижу, что коллекция assembly.ModuleAttributes пуста, как и ExportedTypes, как и Модули... похоже, что сборка вообще ничего не содержит! Однако базовый ModuleNode полностью заполнен и, например, содержит 14 атрибутов в своей коллекции атрибутов.

Это как если бы "модуль как AssemblyNode" был неправильным, но если это так, он вернул бы ноль! Может кто-нибудь объяснить, что я делаю не так?

1 ответ

ModuleNodel.GetType ищет определение типа, а не использование типа. AssemblyCopyrightAttribute определен в сборке mscorlib, которая, вероятно, не соответствует вашему правилу. Чтобы найти использование AssemblyCopyrightAttribute, попробуйте использовать assembly.GetAttribute вместо. Например, см. FxCop: пользовательское правило для проверки значений информации о сборке.

Другие вопросы по тегам