Dela via


Använda CodeDOM

CodeDOM innehåller typer som representerar många vanliga typer av källkodselement. Du kan utforma ett program som skapar en källkodsmodell med hjälp av CodeDOM-element för att montera ett objektdiagram. Det här objektdiagrammet kan återges som källkod med hjälp av en CodeDOM-kodgenerator för ett programmeringsspråk som stöds. CodeDOM kan också användas för att kompilera källkod till en binär sammansättning.

Några vanliga användningsområden för CodeDOM är:

  • Kodgenerering med mall: generera kod för ASP.NET, KLIENTproxy för XML-webbtjänster, kodguider, designers eller andra mekanismer för kodutsändande.
  • Dynamisk kompilering: stöd för kodkompilering på ett eller flera språk.

Skapa ett CodeDOM-diagram

Namnområdet System.CodeDom innehåller klasser för att representera källkodens logiska struktur, oberoende av språksyntax.

Strukturen för ett CodeDOM-diagram

Strukturen i ett CodeDOM-diagram är som ett träd med containrar. Den översta containern eller rotcontainern för varje kompilerbar CodeDOM-graf är en CodeCompileUnit. Varje element i källkodsmodellen måste länkas till grafen via en egenskap för en CodeObject i diagrammet.

Skapa en källkodsmodell för ett Hello World-exempelprogram

Följande genomgång innehåller ett exempel på hur du skapar ett CodeDOM-objektdiagram som representerar koden för ett enkelt Hello World-program. Den fullständiga källkoden för det här kodexemplet finns i System.CodeDom.Compiler.CodeDomProvider artikeln.

Skapa en kompileringsenhet

CodeDOM definierar ett objekt med namnet , CodeCompileUnitsom kan referera till ett CodeDOM-objektdiagram som modellerar källkoden för kompilering. En CodeCompileUnit har egenskaper för att lagra referenser till attribut, namnområden och sammansättningar.

CodeDom-providers som härleds från CodeDomProvider klassen innehåller metoder som bearbetar objektdiagrammet som refereras av en CodeCompileUnit.

Om du vill skapa ett objektdiagram för ett enkelt program måste du sätta ihop källkodsmodellen och referera till den från en CodeCompileUnit.

Du kan skapa en ny kompileringsenhet med den syntax som visas i det här exemplet:

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

En CodeSnippetCompileUnit kan innehålla ett avsnitt med källkod som redan finns på målspråket, men som inte kan återges till ett annat språk.

Definiera ett namnområde

Om du vill definiera ett namnområde skapar du ett CodeNamespace och tilldelar ett namn för det med hjälp av lämplig konstruktor eller genom att ange dess namnegenskap .

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

Importera ett namnområde

Om du vill lägga till ett namnområdesimportdirektiv i namnområdet lägger du till ett CodeNamespaceImport som anger det namnområde som ska importeras till samlingen CodeNamespace.Imports .

Följande kod lägger till en import för systemnamnområdet till samlingen Importer för ett CodeName-utrymme med namnet samples:

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

Alla kodelement som utgör ett CodeDOM-diagram måste länkas till CodeCompileUnit rotelementet i trädet genom en serie referenser mellan element som refereras direkt från egenskaperna för grafens rotobjekt. Ange ett objekt till en egenskap för ett containerobjekt för att upprätta en referens från containerobjektet.

Följande instruktion lägger till samples CodeNamespace till egenskapen Namespaces-samling för roten CodeCompileUnit.

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

Definiera en typ

Om du vill deklarera en klass, struktur, ett gränssnitt eller en uppräkning med hjälp av CodeDOM skapar du en ny CodeTypeDeclarationoch tilldelar den ett namn. I följande exempel visas detta med hjälp av en konstruktoröverlagring för att ange egenskapen Namn :

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

Om du vill lägga till en typ i ett namnområde lägger du till en CodeTypeDeclaration som representerar den typ som ska läggas till i namnområdet i samlingen Typer för ett CodeName-utrymme.

I följande exempel visas hur du lägger till en klass med namnet class1 i ett CodeNamespace med namnet samples:

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

Lägga till klassmedlemmar i en klass

Namnområdet System.CodeDom innehåller en mängd olika element som kan användas för att representera klassmedlemmar. Varje klassmedlem kan läggas till i samlingen Medlemmar för en CodeTypeDeclaration.

Definiera en kodinmatningspunktsmetod för en körbar fil

Om du skapar kod för ett körbart program måste du ange startpunkten för ett program genom att skapa en CodeEntryPointMethod för att representera den metod där programkörningen ska börja.

I följande exempel visas hur du definierar en startpunktsmetod som innehåller en CodeMethodInvokeExpression som anropar System.Console.WriteLine för att skriva ut "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)

Följande instruktion lägger till startpunktsmetoden med namnet Start i samlingen Medlemmar i class1:

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

Nu innehåller det CodeCompileUnit namngivna compileUnit CodeDOM-diagrammet för ett enkelt Hello World-program. Information om hur du genererar och kompilerar kod från ett CodeDOM-diagram finns i Generera källkod och kompilera ett program från ett CodeDOM Graph.

Mer information om hur du skapar ett CodeDOM-diagram

CodeDOM stöder de många vanliga typer av kodelement som finns i programmeringsspråk som stöder den gemensamma språkkörningen. CodeDOM har inte utformats för att tillhandahålla element som representerar alla möjliga funktioner i programmeringsspråket. Kod som inte kan representeras enkelt med CodeDOM-element kan kapslas in i en CodeSnippetExpression, en CodeSnippetStatement, en CodeSnippetTypeMembereller en CodeSnippetCompileUnit. Kodfragment kan dock inte översättas till andra språk automatiskt av CodeDOM.

Dokumentation för var och en av CodeDOM-typerna finns i referensdokumentationen System.CodeDom för namnområdet.

Ett snabbdiagram för att hitta CodeDOM-elementet som representerar en viss typ av kodelement finns i Snabbreferens för CodeDOM.