Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Im Beitrag “Visual Studio mit LINQPad: Project und ProjectItems” haben wir uns angesehen, wie Sie per Code auf Project-, Solution- und ProjectItem-Elemente zugreifen. Nun wollen wir uns den Umgang mit den ProjectItem-Objekten ansehen und herausfinden, wie wir beispielsweise den enthaltenen Code manipulieren können und Klassen, Prozeduren und Variablen anzulegen. Dazu benötigen wir einen Verweis auf das FileCodeModel-Objekt des jeweiligen ProjectItem-Elements. Wie wir das holen und was wir damit anstellen können, zeigt der vorliegende Artikel.
Nachdem wir im oben genannten Artikel gelernt haben, wie wir die Elemente eines Projekts referenzieren, durchlaufen und erstellen, wollen wir uns nun um den Inhalt der Elemente selbst kümmern, genau genommen um die Elemente, die Code enthalten. Für diese Zwecke gibt es das FileCodeModel, dass wir über die gleichnamige Eigenschaft eines jeden Project-Item-Elements referenzieren können. Die folgende Funktion soll uns das FileCodeModel-Element der Klasse liefern, dessen Namen wir mit dem Parameter strItem übergeben. Die Funktion holt mit der im Artikel Visual Studio mit LINQPad: Project und ProjectItems vorgestellten Funktion GetDTE einen Verweis auf das DTE-Objekt zur Programmierung von Visual Studio und mit der Funktion GetCurrentOrNewProject aus dem gleichen Artikel einen Verweis auf das aktuell in Visual Studio geöffnete Projekt. Ist aktuell kein Projekt geöffnet, wird ein neues Projekt erstellt. Danach ermitteln wir über die ProjectItems-Auflistung des Projekts das ProjectItem-Objekt mit dem Namen aus dem Parameter strItem. Schließlich ermitteln wir mit der Eigenschaft FileCodeModel einen Verweis auf das gewünschte FileCodeModel-Objekt, das wir mit der Return-Anweisung an die aufrufende Methode zurückgeben:
Public Function GetFileCodeModel(strItem As String) As EnvDTE80.FileCodeModel2 Dim objDTE As EnvDTE80.DTE2 Dim objProject As EnvDTE.Project Dim objProjectItem As EnvDTE.ProjectItem Dim objFileCodeModel As EnvDTE80.FileCodeModel2 If GetDTE(objDTE) = True Then If GetCurrentOrNewProject(objProject) = True Then objProjectItem = objProject.ProjectItems.Item(strItem) Debug.Print(objProjectItem.Name) objFileCodeModel = Trycast(objProjectItem.FileCodeModel, EnvDTE80.FileCodeModel2) End If End If Return objFileCodeModel End Function
Der Aufruf könnte dann etwa wie folgt aussehen, wobei wir die zu verwendende Klasse als Parameter übergeben. Danach können wir mit dem FileCodeModel experimentieren:
Dim objFileCodeModel As EnvDTE.FileCodeModel objFileCodeModel = GetFileCodeModel("NeueKlasse.vb") Debug.Print (objFileCodeModel.CodeElements.Count)
Beispiele zu diesem Artikel
Die Beispiele finden Sie in der Datei VisualStudioErweitern_Items.linq. Sie können die einzelnen Prozeduren aufrufen, indem Sie die Aufrufe in der Sub Main-Prozedur auskommentieren und Sub Main ausführen. Zum Ausprobieren der Prozeduren verwenden Sie das Tool LINQPad, dass Sie unter http://www.linqpad.net herunterladen können.
Eigenschaften und Methoden der FileCodeModel-Klasse
Die FileCodeModel-Klasse hat die folgenden Eigenschaften. Genau genommen schauen wir uns hier nicht die FileCodeModel-Klasse an, sondern das FileCodeModel2-Interface, das etwas mehr Möglichkeiten bietet und mit dem Namespace EnvDTE80 kommt:
- CodeElements: Auflistung der Code-Elemente. Was genau Code-Elemente sind, schauen wir uns weiter unten an, nachdem wir einige angelegt haben.
- DTE: Verweis auf das übergeordnete DTE-Objekt.
- Language: Gibt eine GUID aus, welche die verwendete Sprache dieses FileCodeModel-Elements repräsentiert.
Debug.Print (objFileCodeModel.Language)
{B5E9BD33-6D3E-4B5D-925E-8A43B79820B4}
- Parent: Ermittelt das übergeordnete Objekt.
Dies sind die Methoden der FileCodeModel-Klasse:
- AddAttribute: Fügt ein Attribut wie
- AddClass: Fügt eine neue Klasse zum FileCodeModel hinzu.
- AddDelegate: Fügt ein Delegate zum FileCodeModel hinzu.
- AddEnum: Fügt eine Enumeration zum FileCodeModel hinzu.
- AddFunction: Hinzufügen von Methoden, Funktionen, Property Get/Let/Set-Methoden und so weiter
- AddImport: Füge eine Imports-Anweisung hinzu.
- AddInterface: Hinzufügen eines Interfaces.
- AddNamespace: Fügt einen Namespace hinzu.
- AddStruct: Fügt eine Struktur hinzu.
- AddVariable: Fügt eine Variable hinzu.
- CodeElementFromPoint:
- Remove:
Die meisten der hier genannten Add…-Methoden gibt es auch in der Klasse CodeClass. Das heißt, Sie erstellen erst ein CodeClass-Element, also eine Klasse, referenzieren diese mit einer Objektvariablen wie objClass und nutzen dann Methoden wie AddAttribute, AddBase, AddClass, AddDelegate, AddEnum, AddFunction, AddImplementedInterface, AddProperty, AddStruct oder AddVariable, um die entsprechenden Elemente zu einer Klasse hinzuzufügen. Darunter sind Methoden wie AddImplementedInterface oder AddProperty, die nicht für das FileCodeModel-Objekt bereitstehen.
In den folgenden Abschnitten erläutern wir die Methoden mal für das FileCodeModel-Objekt und mal für das CodeClass-Objekt.
Attribut hinzufügen mit AddAttribute
Mit der folgenden Anweisung fügen wir ein neues Attribut zu einem FileCodeModel hinzu:
objFileCodeModel.AddAttribute("NeuesAttribut","Wert")
Der Code in der Datei NeueKlasse.vb sieht danach wie folgt aus:
<Assembly: NeuesAttribut(Wert)> Public Class NeueKlasse End Class
Hinzufügen einer Klasse mit AddClass