Compartir a través de


Cómo: Utilizar el objeto CodeModel para analizar código de Visual Basic

Actualización: noviembre 2007

Usar la jerarquía del objeto CodeModel2 constituye una alternativa a la tarea probablemente compleja de analizar el texto de un archivo de código. Se puede utilizar el objeto CodeModel2 para realizar las siguientes tareas:

  • Analizar la estructura del código.

  • Como base para documentar el código.

Los procedimientos siguientes dan por supuesto que ya se es capaz de obtener acceso al entorno de desarrollo de macros y de crear un proyecto de macros. Para obtener más información, vea Agregar proyecto de macros (Cuadro de diálogo).

El nivel raíz del objeto CodeModel2 contiene los espacios de nombres o éstos están anidados en otros objetos CodeNamespace. Esto refleja las limitaciones de sintaxis que existen en los espacios de nombres. Un espacio de nombres es un bloque de código de nivel superior o está contenido en otro espacio de nombres. Para utilizar los siguientes procedimientos, debe tener un proyecto abierto en el entorno de desarrollo integrado (IDE) de Visual Studio.

Nota:

Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Estos procedimientos se desarrollaron con la Configuración general de desarrollo activa. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Para encontrar todos los espacios de nombres del proyecto

  • Escriba un método recursivo para recuperar todos los espacios de nombres de una aplicación.

    El objeto CodeNamespace tiene una propiedad Members que contiene todos los CodeElements en el primer nivel del espacio de nombres.

    ' 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
    
    Nota:

    Se pueden encontrar todos los espacios de nombres de un archivo de código fuente usando la propiedad FileCodeModel del objeto ProjectItem asociado a dicho archivo. Sin embargo, con este sistema sería necesario un ligero cambio en el método FindAllNamespaces .

Buscar el espacio de nombres predeterminado

El procedimiento anterior sólo devuelve los espacios de nombres definidos en la aplicación. Sin embargo, todos los proyectos de Visual Basic incluyen también un espacio de nombres predeterminado, que contiene todos los elementos de código de la aplicación, aunque la colección CodeElements no contenga ningún objeto CodeNamespace para dicho espacio. El espacio de nombres predeterminado se puede recuperar desde cualquier elemento CodeType de nivel superior.

Para encontrar el espacio de nombres predeterminado del proyecto

  • Pruebe los elementos de código de nivel superior del proyecto. Cualquier elemento de código que sea un CodeType devuelve el elemento CodeNamespace del proyecto.

    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
    

Buscar clases

Las declaraciones de clase y los espacios de nombres se recuperan a través de recursos similares. Debido a que las clases pueden anidarse en otras clases, se pueden encontrar clases definidas tanto en espacios de nombres como en otras clases.

Para encontrar todas las clases del proyecto

  • Escriba un método recursivo, como el siguiente, para buscar las declaraciones de clases de un proyecto.

    ' 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
    

Vea también

Tareas

Cómo: Crear una clase de C# con el objeto CodeModel

Conceptos

Información general del objeto CodeModel en aplicaciones de Visual Basic y C#

Detectar código utilizando el modelo de código (Visual Basic)

Detectar código utilizando el modelo de código (Visual C#)