Uso de CodeDOM

CodeDOM proporciona tipos que representan muchos tipos comunes de elementos de código fuente. Se puede diseñar un programa que compile un modelo de código fuente utilizando los elementos de CodeDOM para ensamblar un gráfico de objetos. Este gráfico de objetos se puede representar como código fuente utilizando un generador de código de CodeDOM para un lenguaje de programación compatible. CodeDOM también se puede utilizar para compilar código fuente en un ensamblado binario.

Algunos usos habituales de CodeDOM son:

  • Generación de código mediante plantillas: generación de código para ASP.NET, proxies de clientes de servicios Web XML, asistentes para código, diseñadores y otros mecanismos de emisión de código.
  • Compilación dinámica: compatibilidad para compilación de código en uno o varios lenguajes.

Creación de un gráfico CodeDOM

El espacio de nombres System.CodeDom proporciona clases para representar la estructura lógica del código fuente, independientemente de la sintaxis del lenguaje.

La estructura de un gráfico CodeDOM

La estructura de un gráfico CodeDOM es similar a un árbol de contenedores. El contenedor raíz o el contenedor superior de cada gráfico CodeDOM compilable es una unidad CodeCompileUnit. Todos y cada uno de los elementos del modelo de código fuente deben estar vinculados en el gráfico mediante una propiedad de un objeto CodeObject del gráfico.

Compilación de un modelo de código fuente para el programa de ejemplo Hello World

En el siguiente tutorial se muestra un ejemplo de cómo compilar un gráfico de objetos CodeDOM que representa el código de una aplicación Hola a todos sencilla. Para obtener el código fuente completo de este código de ejemplo, consulte el artículo System.CodeDom.Compiler.CodeDomProvider.

Creación de una unidad de compilación

CodeDOM define un objeto denominado CodeCompileUnit, que puede hacer referencia a un gráfico de objetos CodeDOM que modela el código fuente que se va a compilar. Un objeto CodeCompileUnit dispone de propiedades para almacenar referencias a atributos, espacios de nombres y ensamblados.

Los proveedores CodeDom que derivan de la clase CodeDomProvider contienen métodos que procesan el gráfico de objetos a los que hace referencia CodeCompileUnit.

Para crear un gráfico de objetos para una aplicación sencilla, debe ensamblar el modelo de código fuente y hacer referencia a él desde CodeCompileUnit.

Se puede crear una nueva unidad de compilación con la sintaxis que muestra este ejemplo:

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

Una CodeSnippetCompileUnit puede contener una sección de código fuente que ya está en el lenguaje de destino, pero que no se puede representar en otro lenguaje.

Definición de un espacio de nombres

Para definir un espacio de nombres, cree un objeto CodeNamespace y asígnele un nombre con el constructor correspondiente o mediante el establecimiento de su propiedad Name.

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

Importar un espacio de nombres

Para agregar una directiva de importación de espacios de nombres al espacio de nombres, agregue una importación CodeNamespaceImport que indique el espacio de nombres que se va a importar a la colección CodeNamespace.Imports.

En el siguiente código, se agrega una importación para el espacio de nombres System a la colección Imports de un espacio de nombres CodeNamespace denominado samples:

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

Todos los elementos de código que forman un gráfico CodeDOM deben estar vinculados a CodeCompileUnit, que es el elemento raíz del árbol, mediante una serie de referencias entre elementos a los que se hace directamente referencia desde las propiedades del objeto raíz del gráfico. Establezca un objeto en una propiedad de un objeto de contenedor para establecer una referencia desde el objeto de contenedor.

La siguiente instrucción agrega el espacio de nombres CodeNamespacesamples a la propiedad de colección Namespaces del objeto raíz CodeCompileUnit.

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

Definición de un tipo

Para declarar una clase, estructura, interfaz o enumeración utilizando CodeDOM, cree un nuevo objeto CodeTypeDeclaration y asígnele un nombre. En el siguiente ejemplo se muestra cómo hacerlo mediante una sobrecarga de constructor para establecer la propiedad Name:

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

Para agregar un tipo a un espacio de nombres, agregue una declaración CodeTypeDeclaration que represente el tipo que se va a agregar al espacio de nombres de la colección Types de un espacio de nombres CodeNamespace.

En el siguiente ejemplo se muestra cómo agregar una clase denominada class1 a un espacio de nombres CodeNamespace denominado samples:

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

Agregar miembros de clase a una clase

El espacio de nombres System.CodeDom dispone de diferentes elementos que se pueden utilizar para representar miembros de clase. Todos los miembros de clase pueden agregarse a la colección Members de una declaración CodeTypeDeclaration.

Definición de un método de punto de entrada de código para un archivo ejecutable

Si desea compilar el código de un programa ejecutable, es necesario indicar el punto de entrada de un programa creando un objeto CodeEntryPointMethod que represente el método en el que debe comenzar la ejecución del programa.

En el siguiente ejemplo se muestra cómo definir un método de punto de entrada que contiene una expresión CodeMethodInvokeExpression que llama a System.Console.WriteLine para imprimir "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)

La siguiente instrucción agrega el método de punto de entrada denominado Start a la colección Members de class1:

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

Ahora, la unidad CodeCompileUnit denominada compileUnit contiene el gráfico CodeDOM para un programa Hello World sencillo. Para obtener información sobre la forma de generar y compilar código desde un gráfico CodeDOM, vea Generar código fuente y compilar un programa a partir de un gráfico CodeDOM.

Más información sobre la forma de compilar un gráfico CodeDOM.

CodeDOM admite muchos de los tipos comunes de elementos de código que se encuentran en los lenguajes de programación compatibles con Common Language Runtime. CodeDOM no fue diseñado para disponer de elementos que representen todas las características posibles de un lenguaje de programación. El código que no se puede representar fácilmente con elementos CodeDOM se puede encapsular en un CodeSnippetExpression, CodeSnippetStatement, CodeSnippetTypeMember o CodeSnippetCompileUnit. No obstante, los miniprogramas no pueden traducirse automáticamente a otros lenguajes por medio de CodeDOM.

Para obtener documentación de cada uno de los tipos CodeDOM, consulte la documentación de referencia del espacio de nombres System.CodeDom.

Para ver un gráfico que localice rápidamente el elemento de CodeDOM que representa un tipo específico de elemento de código, vea Referencia rápida de CodeDOM.