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