Freigeben über


Verwenden von CodeDOM

CodeDOM stellt Typen bereit, die zahlreiche häufig verwendete Quellcodeelemente darstellen. Ein Programm kann entworfen werden, das ein Quellcodemodell mithilfe von CodeDOM-Elementen erstellt, um ein Objektdiagramm zusammenzustellen. Dieses Objektdiagramm kann mit einem CodeDOM-Code-Generator für eine unterstützte Programmiersprache als Quellcode gerendert werden. CodeDOM kann auch verwendet werden, um Quellcode in eine binäre Assembly zu kompilieren.

Im Folgenden werden einige häufige Verwendungsmöglichkeiten von CodeDOM aufgeführt:

  • Generieren von Code mit Vorlagen: Generieren von Code für ASP.NET, XML-Clientproxys für Webdienste, Code-Assistenten, Designer oder Mechanismen zur Ausgabe von Code.
  • Dynamische Kompilierung: Unterstützen der Codekompilierung in einer oder in mehreren Sprachen.

Erstellen eines CodeDOM-Diagramms

Der System.CodeDom-Namespace stellt Klassen zur Verfügung, die die logische Struktur von Quellcode unabhängig von der Syntax der Sprache darstellen können.

Struktur eines CodeDOM-Diagramms

Die Struktur eines CodeDOM-Diagramms ist mit der Struktur von Containern vergleichbar. Der oberste Container bzw. Stammcontainer der einzelnen kompilierbaren CodeDOM-Diagramme ist eine CodeCompileUnit. Jedes Element des Quellcodemodells muss durch eine CodeObject-Eigenschaft mit dem Diagramm verknüpft sein.

Erstellen eines Quellcodemodells für ein „Hallo Welt“-Beispielprogramm

Die folgende exemplarische Vorgehensweise bietet ein Beispiel für das Erstellen eines CodeDOM-Objektdiagramms, das den Code einer einfachen Hello World-Anwendung wiedergibt. Den vollständigen Quellcode für dieses Codebeispiel finden Sie im Artikel System.CodeDom.Compiler.CodeDomProvider.

Erstellen einer Kompilierungseinheit

CodeDOM definiert ein als CodeCompileUnit bezeichnetes Objekt, das auf ein CodeDOM-Objektdiagramm verweisen kann, das ein Modell des zu kompilierenden Quellcodes darstellt. A CodeCompileUnit verfügt über Eigenschaften zum Speichern von Verweisen auf Attribute, Namespaces und Assemblys.

Die von der CodeDomProvider-Klasse abgeleiteten CodeDom-Anbieter enthalten Methoden zum Verarbeiten des Objektdiagramms, auf das von einer CodeCompileUnit verwiesen wird.

Um ein Objektdiagramm für eine einfache Anwendung zu erstellen, müssen Sie das Quellcodemodell zusammenstellen und von einer CodeCompileUnit aus darauf verweisen.

Mit der in diesem Beispiel gezeigten Syntax können Sie eine neue Kompilierungseinheit erstellen:

CodeCompileUnit^ compileUnit = gcnew CodeCompileUnit();
CodeCompileUnit compileUnit = new CodeCompileUnit();
Dim compileUnit As New CodeCompileUnit()

Eine CodeSnippetCompileUnit kann einen Abschnitt des Quellcodes enthalten, der bereits in der Zielsprache vorliegt, aber nicht in einer anderen Sprache gerendert werden kann.

Definieren eines Namespace

Um einen Namespace zu definieren, erstellen Sie ein CodeNamespace und vergeben Sie einen Namen dafür, indem Sie den entsprechenden Konstruktor verwenden oder seine Name Eigenschaft festlegen.

CodeNamespace^ samples = gcnew CodeNamespace("Samples");
CodeNamespace samples = new CodeNamespace("Samples");
Dim samples As New CodeNamespace("Samples")

Importieren eines Namespace

Um dem Namespace eine Anweisung für den Namespaceimport hinzuzufügen, fügen Sie einen CodeNamespaceImport hinzu, der den in die CodeNamespace.Imports-Auflistung zu importierenden Namespace angibt.

Der folgende Code fügt einen Import für den Namespace System zur Sammlung eines CodeNamespace namens samples hinzu:

samples->Imports->Add(gcnew CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"))

Alle Codeelemente eines CodeDOM-Diagramms müssen durch eine Reihe von Verweisen zwischen Elementen, auf die von den Eigenschaften des Stammobjekts des Diagramms direkt verwiesen wird, mit der CodeCompileUnit verknüpft werden, bei der es sich um das Stammelement der Struktur handelt. Legen Sie ein Objekt auf eine Eigenschaft eines Containerobjekts fest, um einen Verweis vom Containerobjekt zu erstellen.

Die folgende Anweisung fügt samplesCodeNamespace zur Namespaces-Auflistungseigenschaft der Wurzel CodeCompileUnit hinzu.

compileUnit->Namespaces->Add( samples );
compileUnit.Namespaces.Add( samples );
compileUnit.Namespaces.Add(samples)

Definieren eines Typs

Um mit CodeDOM eine Klasse, Struktur, Schnittstelle oder Enumeration zu deklarieren, erstellen Sie eine neue CodeTypeDeclaration und weisen ihr einen Namen zu. Im folgenden Beispiel wird dies mithilfe einer Konstruktorüberladung zum Festlegen der Name Eigenschaft veranschaulicht:

CodeTypeDeclaration^ class1 = gcnew CodeTypeDeclaration("Class1");
CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
Dim class1 As New CodeTypeDeclaration("Class1")

Wenn Sie einem Namespace einen Typ hinzufügen möchten, fügen Sie einen CodeTypeDeclaration Wert hinzu, der den Typ darstellt, der dem Namespace zur Types Auflistung eines CodeNamespace hinzugefügt werden soll.

Im folgenden Beispiel wird gezeigt, wie Sie einer Klasse namens class1 zu einem CodeNamespace namens samples hinzufügen:

samples->Types->Add(class1);
samples.Types.Add(class1);
samples.Types.Add(class1)

Hinzufügen von Klassenmembern zu einer Klasse

Der System.CodeDom-Namespace stellt eine Vielzahl von Elementen bereit, mit denen Klassenmember dargestellt werden können. Jedes Klassenmitglied kann der Members Sammlung eines CodeTypeDeclaration hinzugefügt werden.

Definieren einer Code-Einstiegspunktmethode für eine ausführbare Datei

Wenn Sie den Code für ein ausführbares Programm erstellen, müssen Sie den Einstiegspunkt eines Programms angeben, indem Sie eine CodeEntryPointMethod für die Darstellung der Methode erstellen, bei der die Programmausführung beginnen soll.

Im folgenden Beispiel wird das Definieren einer Einstiegspunktmethode veranschaulicht, die einen CodeMethodInvokeExpression enthält, der System.Console.WriteLine aufruft, um „Hello World!“ auszugeben:

CodeEntryPointMethod^ start = gcnew CodeEntryPointMethod();
CodeMethodInvokeExpression^ cs1 = gcnew CodeMethodInvokeExpression(
    gcnew CodeTypeReferenceExpression("System.Console"),
    "WriteLine", gcnew CodePrimitiveExpression("Hello World!"));
start->Statements->Add(cs1);
CodeEntryPointMethod start = new CodeEntryPointMethod();
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
    new CodeTypeReferenceExpression("System.Console"),
    "WriteLine", new CodePrimitiveExpression("Hello World!"));
start.Statements.Add(cs1);
Dim start As New CodeEntryPointMethod()
Dim cs1 As New CodeMethodInvokeExpression( _
    New CodeTypeReferenceExpression("System.Console"), _
    "WriteLine", new CodePrimitiveExpression("Hello World!"))
start.Statements.Add(cs1)

Die folgende Anweisung fügt die Einstiegspunktmethode namens Start der Members-Sammlung von class1 hinzu.

class1->Members->Add(start);
class1.Members.Add( start );
class1.Members.Add(start)

Die CodeCompileUnit mit der Bezeichnung compileUnit enthält nun das CodeDOM-Diagramm für ein einfaches Hello World-Programm. Weitere Informationen über das Generieren und Kompilieren von Code aus einem CodeDOM-Diagramm finden Sie unter Generating Source Code and Compiling a Program from a CodeDOM Graph (Generieren von Quellcode und Kompilieren eines Programms aus einem CodeDOM-Diagramm).

Weitere Informationen zum Erstellen eines CodeDOM-Diagramms

Von CodeDOM werden viele häufig verwendete Typen von Codeelementen in den Programmiersprachen unterstützt, die die Common Language Runtime unterstützen. CodeDOM zielt nicht darauf ab, für die Darstellung aller denkbaren Programmiersprachenfeatures Elemente bereitzustellen. Code, der nicht einfach mit CodeDOM-Elementen dargestellt werden kann, kann in CodeSnippetExpression, CodeSnippetStatement, CodeSnippetTypeMember oder CodeSnippetCompileUnit gekapselt werden. Allerdings kann CodeDOM die Codeausschnitte nicht automatisch in andere Sprachen übersetzen.

Eine Dokumentation aller CodeDOM-Typen finden Sie in der Referenzdokumentation zum System.CodeDom-Namespace.

Ein Übersichtsdiagramm, in dem das jeweils zum Darstellen eines bestimmten Codeelementtyps zu verwendende CodeDOM-Element gesucht werden kann, finden Sie in der Kurzreferenz zu CodeDOM.