Używanie modelu CodeDOM

Obiekt CodeDOM udostępnia typy reprezentujące wiele typowych typów elementów kodu źródłowego. Można zaprojektować program tworzący model kodu źródłowego przy użyciu elementów CodeDOM w celu utworzenia grafu obiektu. Ten graf obiektu może być renderowany jako kod źródłowy przy użyciu generatora kodu CodeDOM dla obsługiwanego języka programowania. KodDOM może być również używany do kompilowania kodu źródłowego do zestawu binarnego.

Oto niektóre typowe zastosowania elementu CodeDOM:

  • Generowanie kodu szablonu: generowanie kodu dla ASP.NET, serwerów proxy klienta usług sieci Web XML, kreatorów kodu, projektantów lub innych mechanizmów emitowania kodu.
  • Kompilacja dynamiczna: obsługa kompilacji kodu w jednym lub wielu językach.

Tworzenie grafu CodeDOM

System.CodeDom Przestrzeń nazw udostępnia klasy reprezentujące logiczną strukturę kodu źródłowego, niezależnie od składni języka.

Struktura grafu CodeDOM

Struktura grafu CodeDOM przypomina drzewo kontenerów. Najbardziej lub główny kontener każdego kompilowalnego grafu CodeDOM to CodeCompileUnit. Każdy element modelu kodu źródłowego musi być połączony z grafem za pomocą właściwości elementu CodeObject na grafie.

Tworzenie modelu kodu źródłowego dla przykładowego programu Hello World

Poniższy przewodnik zawiera przykład tworzenia grafu obiektów CodeDOM reprezentującego kod dla prostej aplikacji Hello World. Pełny kod źródłowy dla tego przykładu kodu można znaleźć w System.CodeDom.Compiler.CodeDomProvider artykule.

Tworzenie jednostki kompilowania

Obiekt CodeDOM definiuje obiekt o nazwie CodeCompileUnit, który może odwoływać się do grafu obiektu CodeDOM, który modeluje kod źródłowy do skompilowania. Element CodeCompileUnit ma właściwości do przechowywania odwołań do atrybutów, przestrzeni nazw i zestawów.

Dostawcy CodeDom, którzy pochodzą z CodeDomProvider klasy, zawierają metody, które przetwarzają graf obiektu, do którego odwołuje się kodCompileUnit.

Aby utworzyć graf obiektu dla prostej aplikacji, należy utworzyć model kodu źródłowego i odwołać się do niego z poziomu elementu CodeCompileUnit.

Nową jednostkę kompilowania można utworzyć przy użyciu składni przedstawionej w tym przykładzie:

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

Element CodeSnippetCompileUnit może zawierać sekcję kodu źródłowego, która jest już w języku docelowym, ale nie może być renderowana w innym języku.

Definiowanie przestrzeni nazw

Aby zdefiniować przestrzeń nazw, utwórz CodeNamespace i przypisz jej nazwę przy użyciu odpowiedniego konstruktora lub ustawiając jego właściwość Name .

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

Importowanie przestrzeni nazw

Aby dodać dyrektywę importowania przestrzeni nazw do przestrzeni nazw, dodaj element CodeNamespaceImport wskazujący przestrzeń nazw do zaimportowania do kolekcji CodeNamespace.Import .

Poniższy kod dodaje import dla przestrzeni nazw systemowejdo kolekcji Import przestrzeni CodeNamespace o nazwie samples:

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

Wszystkie elementy kodu, które tworzą graf CodeDOM, muszą być połączone CodeCompileUnit z elementem głównym drzewa przez serię odwołań między elementami bezpośrednio odwoływujących się do właściwości głównego obiektu grafu. Ustaw obiekt na właściwość obiektu kontenera, aby ustanowić odwołanie z obiektu kontenera.

Poniższa instrukcja dodaje właściwość samplesCodeNamespace do właściwości kolekcji Przestrzenie nazw głównego CodeCompileUnit.

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

Definiowanie typu

Aby zadeklarować klasę, strukturę, interfejs lub wyliczenie przy użyciu klasy CodeDOM, utwórz nową CodeTypeDeclarationnazwę i przypisz ją. W poniższym przykładzie pokazano to przy użyciu przeciążenia konstruktora w celu ustawienia właściwości Name :

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

Aby dodać typ do przestrzeni nazw, dodaj CodeTypeDeclaration element reprezentujący typ, który ma zostać dodany do przestrzeni nazw do kolekcji Types przestrzeni CodeNamespace.

W poniższym przykładzie pokazano, jak dodać klasę o nazwie do przestrzeni CodeNamespace o nazwie :class1samples

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

Dodawanie składowych klasy do klasy

System.CodeDom Przestrzeń nazw udostępnia różne elementy, których można użyć do reprezentowania składowych klasy. Każdy element członkowski klasy można dodać do kolekcji Członkowie kolekcji CodeTypeDeclaration.

Definiowanie metody punktu wejścia kodu dla pliku wykonywalnego

Jeśli tworzysz kod dla programu wykonywalnego, konieczne jest wskazanie punktu wejścia programu przez utworzenie obiektu CodeEntryPointMethod do reprezentowania metody, w której należy rozpocząć wykonywanie programu.

W poniższym przykładzie pokazano, jak zdefiniować metodę punktu wejścia zawierającą CodeMethodInvokeExpression element , który wywołuje metodę System.Console.WriteLine w celu wyświetlenia komunikatu "Hello World!":

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)

Poniższa instrukcja dodaje metodę punktu wejścia o nazwie Start do kolekcji Members elementu class1:

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

Teraz nazwany CodeCompileUnitcompileUnit zawiera graf CodeDOM dla prostego programu Hello World. Aby uzyskać informacje na temat generowania i kompilowania kodu na podstawie grafu CodeDOM, zobacz Generowanie kodu źródłowego i kompilowanie programu na podstawie grafu CodeDOM.

Więcej informacji na temat tworzenia grafu CodeDOM

KodDOM obsługuje wiele typowych typów elementów kodu znalezionych w językach programowania, które obsługują środowisko uruchomieniowe języka wspólnego. Element CodeDOM nie został zaprojektowany w celu zapewnienia elementów reprezentujących wszystkie możliwe funkcje języka programowania. Kod, którego nie można łatwo przedstawić za pomocą elementów CodeDOM, można hermetyzować w elemencie CodeSnippetExpression, a CodeSnippetStatement, lub CodeSnippetTypeMemberCodeSnippetCompileUnit. Nie można jednak automatycznie przetłumaczyć fragmentów kodu na inne języki.

Aby uzyskać dokumentację dla każdego z typów CodeDOM, zobacz dokumentację referencyjną System.CodeDom przestrzeni nazw.

Aby uzyskać szybki wykres, aby zlokalizować element CodeDOM, który reprezentuje określony typ elementu kodu, zobacz Szybki przewodnik CodeDOM.