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. Eine 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
Zum Definieren eines Namespaces erstellen Sie einen CodeNamespace und weisen ihm mit dem entsprechenden Konstruktor oder durch Festlegen der Name-Eigenschaft einen Namen zu.
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 der Imports-Auflistung von CodeNamespace mit der Bezeichnung samples
einen Import für den System-Namespace hinzu:
samples->Imports->Add(gcnew CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"))
Verknüpfen von Codeelementen mit dem Objektdiagramm
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 der Namespaces-Auflistungseigenschaft der Stamm-CodeCompileUnit den samples
-CodeNamespace 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. Das folgende Beispiel veranschaulicht dies. Die Name-Eigenschaft wird mithilfe einer Überladung des Konstruktors festgelegt:
CodeTypeDeclaration^ class1 = gcnew CodeTypeDeclaration("Class1");
CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
Dim class1 As New CodeTypeDeclaration("Class1")
Zum Hinzufügen eines Typs zu einem Namespace fügen Sie der Types-Auflistung von CodeNamespace eine CodeTypeDeclaration hinzu, die den dem Namespace hinzuzufügenden Typ darstellt.
Das folgende Beispiel veranschaulicht das Hinzufügen der Klasse class1
zum CodeNamespace mit dem Namen samples
:
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. Jeder Klassenmember kann der Members-Auflistung einer 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 der Members-Auflistung von class1
die Einstiegspunktmethode mit dem Namen Start
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.