Condividi tramite


Usare CodeDOM

Con CodeDOM vengono offerti tipi che rappresentano molti tipi comuni di elementi di codice sorgente. È possibile progettare un programma che compili un modello di codice sorgente usando elementi CodeDOM per assemblare un grafico di oggetti. Da tale grafico è possibile produrre codice sorgente in uno dei linguaggi di programmazione supportati tramite un generatore di codice CodeDOM. CodeDOM può anche essere usato per compilare codice sorgente in un assembly binario.

Di seguito sono riportati alcuni impieghi comuni di CodeDOM:

  • Generazione di codice basata su modelli: generazione di codice per ASP.NET, proxy per client di servizi Web basati su XML, creazioni guidate di codice, strumenti di progettazione e altri sistemi generatori di codice.
  • Compilazione dinamica: supporto per la compilazione di codice in uno o più linguaggi.

Creare un grafico CodeDOM

Con lo spazio dei nomi System.CodeDom vengono specificate classi che consentono di rappresentare la struttura logica del codice sorgente, indipendentemente dalla sintassi del linguaggio.

Struttura di un grafico CodeDOM

La struttura di un grafico CodeDOM può essere paragonata a una struttura ad albero di contenitori. Il contenitore di primo livello, o radice, di ogni grafico CodeDOM compilabile è un CodeCompileUnit. Ogni elemento del modello di codice sorgente deve essere collegato al grafico tramite una proprietà di un CodeObject nel grafico.

Compilare un modello di codice sorgente per un programma di esempio Hello World

Di seguito viene illustrato come compilare un grafico di oggetti CodeDOM che rappresenta il codice di una semplice applicazione di esempio Hello World. Per il codice sorgente completo di questo esempio di codice, vedere l'articolo System.CodeDom.Compiler.CodeDomProvider.

Creare un'unità di compilazione

CodeDOM definisce un oggetto denominato CodeCompileUnit, in grado di fare riferimento a un grafico di oggetti CodeDOM che modella il codice sorgente da compilare. Una CodeCompileUnit possiede proprietà per l'archiviazione di riferimenti ad attributi, spazi dei nomi e assembly.

Nei provider CodeDom che derivano dalla classe CodeDomProvider sono contenuti i metodi che elaborano il grafico di oggetti a cui fa riferimento una CodeCompileUnit.

Per creare un grafico di oggetti per una semplice applicazione, occorre assemblare il modello di codice sorgente e farvi riferimento da una CodeCompileUnit.

Per creare una nuova unità di compilazione, è possibile usare la sintassi illustrata nel seguente esempio:

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

CodeSnippetCompileUnit può contenere una sezione di codice sorgente che è già nella forma del linguaggio di destinazione, ma non può essere compilata in un altro linguaggio.

Definire uno spazio dei nomi

Per definire uno spazio dei nomi, creare un CodeNamespace e assegnarvi un nome usando il costruttore appropriato o impostandone la proprietà Name.

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

Importare uno spazio dei nomi

Per aggiungere allo spazio dei nomi una direttiva per l'importazione di uno spazio dei nomi, aggiungere una CodeNamespaceImport che indica lo spazio dei nomi da importare nella raccolta CodeNamespace.Imports.

Nel codice riportato di seguito viene aggiunta un'importazione dello spazio dei nomi System alla raccolta Imports di un CodeNamespace denominata samples:

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

Tutti gli elementi di codice che compongono un grafico CodeDOM devono essere collegati alla CodeCompileUnit che costituisce l'elemento radice della struttura ad albero da una serie di riferimenti tra elementi a cui si fa direttamente riferimento dalle proprietà dell'oggetto radice del grafico. Per stabilire un riferimento da un oggetto contenitore, impostare un oggetto su una proprietà dell'oggetto contenitore.

L'istruzione seguente aggiunge samplesCodeNamespace alla proprietà di raccolta Namespaces dell'oggetto radice CodeCompileUnit.

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

Definire un tipo

Per dichiarare una classe, struttura, interfaccia o enumerazione con CodeDOM, creare un nuovo CodeTypeDeclaration e assegnarvi un nome. Nell'esempio seguente viene illustrata questa operazione tramite l'overload di un costruttore per impostare la proprietà Name:

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

Per aggiungere un tipo a uno spazio dei nomi, aggiungere una CodeTypeDeclaration che rappresenta il tipo da aggiungere allo spazio dei nomi per la raccolta Types di un CodeNamespace.

Nell'esempio seguente viene illustrato come aggiungere una classe di nome class1 a un CodeNamespace denominato samples:

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

Aggiungere membri a una classe

Con lo spazio dei nomi System.CodeDom vengono offerti diversi elementi che possono essere usati per rappresentare membri di classi. Ogni membro di classe può essere aggiunto alla raccolta Members di una CodeTypeDeclaration.

Definire un metodo di punto di ingresso al codice di un file eseguibile

Se si sta compilando il codice di un programma eseguibile, è necessario indicarne il punto d'ingresso creando un CodeEntryPointMethod che rappresenti il metodo da cui si vuole che l'esecuzione del programma abbia inizio.

Nell'esempio seguente viene illustrato come definire un punto di ingresso che contenga una CodeMethodInvokeExpression che chiama System.Console.WriteLine per scrivere "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)

L'istruzione seguente aggiunge il metodo del punto di ingresso denominato Start alla raccolta Members di class1:

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

A questo punto l'oggetto CodeCompileUnit denominato compileUnit contiene il grafico CodeDOM di un semplice programma Hello World. Per informazioni sulla generazione e compilazione di codice da un grafico CodeDOM, vedere Generazione di codice sorgente e compilazione di un programma a partire da un grafico CodeDOM.

Altre informazioni sulla compilazione di un grafico CodeDOM

Con CodeDOM viene offerto il supporto dei tipi di elementi di codice più comuni impiegati dai linguaggi di programmazione che supportano Common Language Runtime. CodeDOM non è progettato per fornire elementi in grado di rappresentare tutte le possibili funzionalità dei linguaggi di programmazione. Il codice che non può essere rappresentato facilmente con gli elementi CodeDOM può essere incapsulato in un CodeSnippetExpression, CodeSnippetStatement, CodeSnippetTypeMember, o un CodeSnippetCompileUnit. Con CodeDOM non è tuttavia possibile tradurre automaticamente frammenti in altri linguaggi.

Per la documentazione dei diversi tipi CodeDOM, vedere la documentazione di riferimento relativa allo spazio dei nomi System.CodeDom.

Per una tavola di consultazione rapida che consenta di individuare l'elemento CodeDOM che rappresenta uno specifico tipo di elemento di codice, vedere Riferimento rapido per CodeDOM.