Condividi tramite


Utilizzo di CodeDOM

Con CodeDOM vengono forniti tipi che rappresentano molti tipi comuni di elementi di codice sorgente. È possibile progettare un programma che compili un modello di codice sorgente utilizzando elementi CodeDOM per assemblare un grafico di oggetti. Da tale grafico è possibile produrre codice sorgente in uno dei linguaggi di programmazione supportati utilizzando un generatore di codice CodeDOM. È anche possibile utilizzare CodeDOM 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.

Compilazione di un grafico CodeDOM

Con lo spazio dei nomi System.CodeDom vengono fornite 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 posto più in alto, o radice, di ciascun grafico CodeDOM compilabile è un oggetto CodeCompileUnit. Ogni elemento del modello di codice sorgente deve essere collegato al grafico tramite una proprietà di un CodeObject nel grafo.

Compilazione di un modello di codice sorgente per un programma di esempio

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

Creazione di una unità di compilazione

CodeDOM definisce un oggetto denominato CodeCompileUnit, in grado di fare riferimento a un grafo di oggetti CodeDOM, che modella il codice sorgente da compilare. I CodeCompileUnit dispongono di 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 un oggetto CodeCompileUnit.

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

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

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

Un'unità 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.

Definizione di uno spazio dei nomi

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

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

Importazione di uno spazio dei nomi

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

Nel codice riportato di seguito viene aggiunta un'importazione dello spazio dei nomi System all'insieme Imports di un oggetto CodeNamespace denominato samples:

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

Collegamento di elementi di codice nel grafico di oggetti

Tutti gli elementi di codice che compongono un grafo CodeDOM devono essere collegati all'oggetto 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 grafo. Per stabilire un riferimento da un oggetto contenitore, impostare un oggetto su una proprietà dell'oggetto contenitore.

L'istruzione riportata di seguito aggiunge il CodeNamespace samples alla proprietà di insieme Namespaces dell'oggetto CodeCompileUnit radice.

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

Definizione di un tipo

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

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

Per aggiungere un tipo a uno spazio dei nomi, aggiungere una CodeTypeDeclaration che rappresenta il tipo da aggiungere allo spazio dei nomi all'insieme Types di un CodeNamespace.

Nell'esempio che segue viene illustrato come aggiungere una classe class1 a un CodeNamespace denominato samples:

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

Aggiunta di membri a una classe

Con lo spazio dei nomi System.CodeDom vengono forniti diversi elementi che possono essere utilizzati per rappresentare membri di classi. Ogni membro di classe può essere aggiunto all'insieme Members di una CodeTypeDeclaration.

Definizione di un metodo quale 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 desidera che l'esecuzione del programma abbia inizio.

Nel seguente esempio viene illustrato come definire un punto di ingresso che contenga una CodeMethodInvokeExpression che chiama System.Console.WriteLine per scrivere "Hello World!":

Dim start As New CodeEntryPointMethod()
Dim cs1 As New CodeMethodInvokeExpression( _
    New CodeTypeReferenceExpression("System.Console"), _
    "WriteLine", new 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);
CodeEntryPointMethod^ start = gcnew CodeEntryPointMethod();
CodeMethodInvokeExpression^ cs1 = gcnew CodeMethodInvokeExpression(
    gcnew CodeTypeReferenceExpression("System.Console"),
    "WriteLine", gcnew CodePrimitiveExpression("Hello World!"));
start->Statements->Add(cs1);

Nell'istruzione che segue, il metodo Start, che funge da punto di ingresso, viene aggiunto all'insieme Members di class1:

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

Adesso l'oggetto CodeCompileUnit denominato CompileUnit contiene il grafo CodeDOM di un semplice programma di esempio. Per informazioni sulla generazione e sulla compilazione di codice da un grafico CodeDOM, vedere Generazione di codice sorgente e compilazione di un programma a partire da un grafico CodeDOM.

Ulteriori informazioni sulla compilazione di un grafico CodeDOM

Con CodeDOM viene fornito 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, un CodeSnippetStatement, un 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.