Freigeben über


Gewusst wie: Verwenden des CodeModel-Objekts zum Analysieren von Visual Basic-Code

Aktualisiert: November 2007

Die Verwendung der CodeModel2-Objekthierarchie stellt eine Alternative zur Analyse von Text in einer Codedatei dar – ein Vorgang, der sich schnell als sehr komplex herausstellen kann. Sie können das CodeModel2-Objekt für folgende Zwecke verwenden:

  • Zur Analyse der Codestruktur

  • Als Grundlage für die Codedokumentation

Bei den folgenden Verfahren wird davon ausgegangen, dass Sie bereits wissen, wie Sie auf die Macros-Entwicklungsumgebung zugreifen und ein Makroprojekt erstellen. Weitere Informationen finden Sie unter Dialogfeld "Neues Projekt hinzufügen".

Namespaces befinden sich entweder auf der Stammebene des CodeModel2-Objekts oder sind in anderen CodeNamespace-Objekten geschachtelt. Dies impliziert gewisse Einschränkungen in Bezug auf die Syntax von Namespaces. Ein Namespace ist entweder ein Codeblock der obersten Ebene, oder er ist in einem anderen Namespace enthalten. Um die folgenden Prozeduren ausführen zu können, muss in der integrierten Entwicklungsumgebung (Integrated Development Environment, IDE) von Visual Studio ein Projekt geöffnet sein.

Hinweis:

Je nach den aktiven Einstellungen oder der verwendeten Version können sich die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen unterscheiden. Bei der Entwicklung dieser Prozeduren war die Option Allgemeine Entwicklungseinstellungen aktiviert. Wählen Sie im Menü Extras die Option Einstellungen importieren und exportieren aus, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

So suchen Sie alle im Projekt enthaltenen Namespaces

  • Schreiben Sie eine rekursive Methode, um alle in einer Anwendung enthaltenen Namespaces abzurufen.

    Das CodeNamespace-Objekt weist eine Members-Eigenschaft auf, die alle CodeElements auf der ersten Ebene des Namespaces enthält.

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

    Über die FileCodeModel-Eigenschaft des ProjectItem-Objekts, das mit der Quelldatei verknüpft ist, können Sie alle in einer Quelldatei enthaltenen Namespaces suchen. Diese Suchmethode setzt jedoch voraus, dass die FindAllNamespaces-Methode geringfügig geändert wird.

Suchen des Standardnamespaces

Bei der oben beschriebenen Prozedur werden nur die in der Anwendung definierten Namespaces zurückgegeben. Jedes Visual Basic-Projekt enthält außerdem einen Standardnamespace. Alle Codeelemente einer Anwendung sind im Standardnamespace enthalten, obwohl in der CodeElements-Auflistung kein entsprechendes CodeNamespace-Objekt enthalten ist. Der Standardnamespace kann von einem beliebigen CodeType-Element der obersten Ebene abgerufen werden.

So suchen Sie den Standardnamespace für das Projekt

  • Testen Sie die Codeelemente der obersten Ebene für das Projekt. Alle Codeelemente des Typs CodeType geben das CodeNamespace-Element für das Projekt zurück.

    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
    

Suchen von Klassen

Klassendeklarationen und Namespaces werden auf ähnlich Weise abgerufen. Da Klassen in anderen Klassen geschachtelt werden können, können Sie Klassen suchen, die sowohl in Namespaces als auch in anderen Klassen definiert wurden.

So suchen Sie alle im Projekt enthaltenen Klassen

  • Schreiben Sie eine mit dem folgenden Beispiel vergleichbare rekursive Methode, um Klassendeklarationen in einem Projekt zu suchen.

    ' 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
    

Siehe auch

Aufgaben

Gewusst wie: Erstellen einer C#-Klasse mithilfe des CodeModel-Objekts

Konzepte

Übersicht über das CodeModel-Objekt für Visual Basic- und C#-Anwendungen

Ermitteln von Code über das Codemodell (Visual Basic)

Ermitteln von Code über das Codemodell (Visual C#)