Поделиться через


Практическое руководство. Анализ кода Visual Basic с помощью объекта CodeModel

Обновлен: Ноябрь 2007

Использование иерархии объекта CodeModel2 является альтернативой потенциально сложной задаче разбора текста в файле кода. Возможно использование объекта CodeModel2 в следующих целях:

  • для анализа структуры кода;

  • в качестве основы для документирования кода.

Приведенные далее процедуры предполагают наличие у пользователя навыков доступа к среде разработки макросов и создания проекта макроса. Дополнительные сведения см. в разделе Диалоговое окно "Добавление макропроекта".

Пространства имен содержатся на корневом уровне объекта CodeModel2 или вложены в другие объекты CodeNamespace. Это отражает синтаксические ограничения пространств имен. Пространство имен представляет собой либо блок кода верхнего уровня, либо содержится внутри другого пространства имен. Для использования следующих процедур требуется открытый проект в интегрированной среде разработки Visual Studio.

1c02s1da.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска среды. Эти процедуры были разработаны с обычными параметрами разработки. Чтобы изменить параметры выберите команду Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Параметры Visual Studio.

Чтобы найти все пространства имен, содержащиеся в проекте

  • Напишите рекурсивный метод для извлечения всех пространств имен в приложении.

    Объект CodeNamespace имеет свойство Members, содержащее все CodeElements на первом уровне пространства имен.

    ' Macro editor
    Sub FindAllNamespaces()
       Dim cm As CodeModel
       cm = DTE.Solution.Projects.Item(1).CodeModel
    
       ' Look for all the namespaces in the CodeElements
       ' of the project.
       Dim list As String
       Dim ce As CodeElement
       For Each ce In cm.CodeElements
          If TypeOf ce Is CodeNamespace Then
             GetNamespace(CType(ce, CodeNamespace), list)
          End If
       Next
    
       MsgBox(list)
    End Sub
    
    Sub GetNamespace(ByVal ns As CodeNamespace, ByRef list As String)
       ' Add this namespace to the list.
       list &= ns.Name & ControlChars.CrLf
       Dim aspace As CodeNamespace
       Dim ce As CodeElement
       ' Look for more namespaces.
       For Each ce In ns.Members
          If TypeOf ce Is CodeNamespace Then
             GetNamespace(CType(ce, CodeNamespace), list)
          End If
       Next
    End Sub
    
    1c02s1da.alert_note(ru-ru,VS.90).gifПримечание.

    Свойство FileCodeModel объекта ProjectItem, связанного с исходным файлом, позволяет найти все пространства имен в одном исходном файле. Этот подход требует внесения незначительных изменений в метод FindAllNamespaces.

Поиск пространства имен по умолчанию

Описанная выше процедура возвращает только те пространства имен, которые определены в приложении. Каждый проект Visual Basic содержит также пространство имен по умолчанию. Все элементы кода в приложении содержатся в пространстве имен по умолчанию, хотя коллекция CodeElements не включает для него объект CodeNamespace. Возможно извлечение пространства имен по умолчанию из любого элемента CodeType верхнего уровня.

Чтобы найти пространство имен по умолчанию для проекта

  • Проверьте элементы кода проекта верхнего уровня. Любой элемент кода CodeType возвращает элемент CodeNamespace для проекта.

    Sub FindDefaultNamespace()
       Dim cm As CodeModel
       cm = DTE.Solution.Projects.Item(1).CodeModel
    
       Dim ce As CodeElement
       Dim ct As CodeType = Nothing
       Dim defNameSpace As CodeNamespace
       For Each ce In cm.CodeElements
          If TypeOf ce Is CodeType Then
             ct = CType(ce, CodeType)
             defNameSpace = ct.Namespace
          End If
       Next
    
       If Not IsNothing(defNameSpace) Then
          MsgBox(defNameSpace.Name)
       End If
    End Sub
    

Поиск классов

Поиск объявлений классов аналогичен процедуре получения пространств имен. Поскольку одни классы могут быть вложены в другие, возможен поиск классов, определенных и в пространствах имен, и в других классах.

Чтобы найти все классы, содержащиеся в проекте

  • Напишите рекурсивный метод, подобный приведенному ниже, чтобы найти объявления классов в проекте.

    ' Macro editor
    Sub FindAllClasses()
       Dim cm As CodeModel
       cm = DTE.Solution.Projects.Item(1).CodeModel
    
       ' Look for all the namespaces and classes in the 
       ' project.
       Dim list As String
       Dim ce As CodeElement
       For Each ce In cm.CodeElements
          If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then
             ' Determine whether that namespace or class 
             ' contains other classes.
             GetClass(ce, list)
          End If
       Next
    
       MsgBox(list)
    End Sub
    
    Sub GetClass(ByVal ct As CodeElement, ByRef list As String)
       ' ct could be a namespace or a class. Add it to the list
       ' if it is a class.
       If (TypeOf ct Is CodeClass) Then
          list &= ct.Name & ControlChars.CrLf
       End If
    
       ' Determine whether there are nested namespaces or classes that 
       ' might contain other classes.
       Dim aspace As CodeNamespace
       Dim ce As CodeElement
       Dim cn As CodeNamespace
       Dim cc As CodeClass
       Dim elements As CodeElements
       If (TypeOf ct Is CodeNamespace) Then
          cn = CType(ct, CodeNamespace)
          elements = cn.Members
       Else
          cc = CType(ct, CodeClass)
          elements = cc.Members
       End If
    
       For Each ce In elements
          If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then
             GetClass(ce, list)
          End If
       Next
    End Sub
    

См. также

Задачи

Практическое руководство. Создание класса C# с помощью объекта CodeModel

Основные понятия

Общие сведения о применении объекта CodeModel в приложениях Visual Basic и Visual C#

Практическое руководство. Поиск кода при помощи модели кода (Visual Basic)

Практическое руководство. Поиск кода при помощи модели кода (Visual C#)