CodeDOM gebruiken

CodeDOM biedt typen die veel algemene typen broncode-elementen vertegenwoordigen. U kunt een programma ontwerpen waarmee een broncodemodel wordt gebouwd met behulp van CodeDOM-elementen om een objectgrafiek samen te stellen. Deze objectgrafiek kan worden weergegeven als broncode met behulp van een CodeDOM-codegenerator voor een ondersteunde programmeertaal. De CodeDOM kan ook worden gebruikt om broncode te compileren in een binaire assembly.

Enkele veelvoorkomende toepassingen voor het CodeDOM zijn:

  • Sjablooncode genereren: code genereren voor ASP.NET, XML Web Services-clientproxy's, codewizards, ontwerpers of andere mechanismen voor het verzenden van code.
  • Dynamische compilatie: ondersteunende codecompilatie in één of meerdere talen.

Een CodeDOM-grafiek bouwen

De System.CodeDom naamruimte biedt klassen voor het weergeven van de logische structuur van broncode, onafhankelijk van taalsyntaxis.

De structuur van een CodeDOM-grafiek

De structuur van een CodeDOM-grafiek lijkt op een structuur van containers. De bovenste container of hoofdcontainer van elke compileerbare CodeDOM-grafiek is een CodeCompileUnit. Elk element van uw broncodemodel moet worden gekoppeld aan de grafiek via een eigenschap van een CodeObject in de grafiek.

Een broncodemodel maken voor een voorbeeld-Hallo wereld-programma

In het volgende overzicht ziet u een voorbeeld van het bouwen van een CodeDOM-objectgrafiek die de code vertegenwoordigt voor een eenvoudige Hallo wereld toepassing. Zie het System.CodeDom.Compiler.CodeDomProvider artikel voor de volledige broncode voor dit codevoorbeeld.

Een compileereenheid maken

CodeDOM definieert een object met de naam a CodeCompileUnit, dat kan verwijzen naar een CodeDOM-objectgrafiek waarmee de broncode wordt gecompileerd. A CodeCompileUnit heeft eigenschappen voor het opslaan van verwijzingen naar kenmerken, naamruimten en assembly's.

De CodeDom-providers die zijn afgeleid van de CodeDomProvider klasse bevatten methoden die de objectgrafiek verwerken waarnaar wordt verwezen door een CodeCompileUnit.

Als u een objectgrafiek wilt maken voor een eenvoudige toepassing, moet u het broncodemodel samenstellen en ernaar verwijzen vanuit een CodeCompileUnit.

U kunt een nieuwe compileereenheid maken met de syntaxis die in dit voorbeeld wordt gedemonstreerd:

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

Een CodeSnippetCompileUnit kan een sectie met broncode bevatten die zich al in de doeltaal bevindt, maar kan niet worden weergegeven in een andere taal.

Een naamruimte definiëren

Als u een namespace wilt definiëren, maakt u een CodeNamespace en wijst u er een naam aan toe met behulp van de juiste constructor of door de eigenschap ervan op Name te stellen.

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

Een naamruimte importeren

Als u een importrichtlijn voor een naamruimte wilt toevoegen aan de naamruimte, voegt u een CodeNamespaceImport naamruimte toe die aangeeft dat de naamruimte moet worden geïmporteerd in de verzameling CodeNamespace.Imports .

Met de volgende code wordt een import voor de System-naamruimte toegevoegd aan de Imports-verzameling van een CodeNamespace genaamde samples.

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

Alle code-elementen die een CodeDOM-grafiek vormen, moeten worden gekoppeld aan het CodeCompileUnit hoofdelement van de structuur door een reeks verwijzingen tussen elementen die rechtstreeks worden verwezen vanuit de eigenschappen van het hoofdobject van de grafiek. Stel een object in op een eigenschap van een containerobject om een verwijzing van het containerobject tot stand te brengen.

Met de volgende instructie worden samples en CodeNamespace toegevoegd aan de verzamelingseigenschap van de Namespaces in de root-CodeCompileUnit.

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

Een type definiëren

Als u een klasse, structuur, interface of opsomming wilt declareren met behulp van CodeDOM, maakt u een nieuwe CodeTypeDeclarationen wijst u deze een naam toe. In het volgende voorbeeld wordt dit gedemonstreerd met behulp van een constructor-overload om de Name eigenschap in te stellen.

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

Als u een type wilt toevoegen aan een naamruimte, voegt u een CodeTypeDeclaration naam toe die het type vertegenwoordigt dat u aan de naamruimte wilt toevoegen aan de Types verzameling van een CodeNamespace.

In het volgende voorbeeld ziet u hoe u een klasse genaamd class1 toevoegt aan een CodeNamespace met de naam samples.

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

Klasleden toevoegen aan een klas

De System.CodeDom naamruimte biedt verschillende elementen die kunnen worden gebruikt om klasseleden weer te geven. Elk klasselid kan worden toegevoegd aan de Members verzameling van een CodeTypeDeclaration.

Een methode voor het codeinvoerpunt definiëren voor een uitvoerbaar bestand

Als u code bouwt voor een uitvoerbaar programma, is het noodzakelijk om het toegangspunt van een programma aan te geven door een CodeEntryPointMethod programma te maken dat de methode vertegenwoordigt waarop de uitvoering van het programma moet beginnen.

In het volgende voorbeeld ziet u hoe u een invoerpuntmethode definieert die system.Console.WriteLine CodeMethodInvokeExpression aanroept om 'Hallo wereld!' af te drukken:

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)

Met de volgende instructie wordt de invoerpuntmethode met de naam Start toegevoegd aan de Members verzameling van class1:

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

Het CodeCompileUnit genaamd compileUnit bevat nu de CodeDOM-grafiek voor een eenvoudig Hello World-programma. Zie Broncode genereren en een programma compileren vanuit een CodeDOM Graph voor meer informatie over het genereren en compileren van code uit een CodeDOM-grafiek.

Meer informatie over het bouwen van een CodeDOM-grafiek

CodeDOM ondersteunt de vele algemene typen code-elementen die worden gevonden in programmeertalen die ondersteuning bieden voor de algemene taalruntime. CodeDOM is niet ontworpen om elementen te bieden die alle mogelijke programmeertaalfuncties vertegenwoordigen. Code die niet eenvoudig kan worden weergegeven met CodeDOM-elementen, kan worden ingekapseld in een CodeSnippetExpression, een , een CodeSnippetStatementCodeSnippetTypeMemberof een CodeSnippetCompileUnit. Codefragmenten kunnen echter niet automatisch worden vertaald naar andere talen door de CodeDOM.

Zie de referentiedocumentatie voor de System.CodeDom naamruimte voor documentatie voor elk van de CodeDOM-typen.

Voor een snelle grafiek om het CodeDOM-element te vinden dat een specifiek type code-element vertegenwoordigt, raadpleegt u de snelzoekgids voor CodeDOM.