Usar CodeDOMUsing the CodeDOM

CodeDOM proporciona tipos que representan muchos tipos comunes de elementos de código fuente.The CodeDOM provides types that represent many common types of source code elements. 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.You can design a program that builds a source code model using CodeDOM elements to assemble an object graph. 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.This object graph can be rendered as source code using a CodeDOM code generator for a supported programming language. CodeDOM también se puede utilizar para compilar código fuente en un ensamblado binario.The CodeDOM can also be used to compile source code into a binary assembly.

Algunos usos habituales de CodeDOM son:Some common uses for the CodeDOM include:

  • 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.Templated code generation: generating code for ASP.NET, XML Web services client proxies, code wizards, designers, or other code-emitting mechanisms.

  • Compilación dinámica: compatibilidad para compilación de código en uno o varios lenguajes.Dynamic compilation: supporting code compilation in single or multiple languages.

Compilar un gráfico CodeDOMBuilding a CodeDOM Graph

El espacio de nombres System.CodeDom proporciona clases para representar la estructura lógica del código fuente, independientemente de la sintaxis del lenguaje.The System.CodeDom namespace provides classes for representing the logical structure of source code, independent of language syntax.

La estructura de un gráfico CodeDOMThe Structure of a CodeDOM Graph

La estructura de un gráfico CodeDOM es similar a un árbol de contenedores.The structure of a CodeDOM graph is like a tree of containers. El contenedor raíz o el contenedor superior de cada gráfico CodeDOM compilable es una unidad CodeCompileUnit.The top-most, or root, container of each compilable CodeDOM graph is a 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.Every element of your source code model must be linked into the graph through a property of a CodeObject in the graph.

Compilar un modelo de código fuente para el programa de ejemplo Hola a todosBuilding a Source Code Model for a Sample Hello World Program

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.The following walkthrough provides an example of how to build a CodeDOM object graph that represents the code for a simple Hello World application. Para obtener el código fuente completo de este código de ejemplo, vea el tema System.CodeDom.Compiler.CodeDomProvider.For the complete source code for this code example, see the System.CodeDom.Compiler.CodeDomProvider topic.

Crear una unidad de compilaciónCreating a compile unit

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.The CodeDOM defines an object called a CodeCompileUnit, which can reference a CodeDOM object graph that models the source code to compile. Un objeto CodeCompileUnit dispone de propiedades para almacenar referencias a atributos, espacios de nombres y ensamblados.A CodeCompileUnit has properties for storing references to attributes, namespaces, and assemblies.

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.The CodeDom providers that derive from the CodeDomProvider class contain methods that process the object graph referenced by a 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.To create an object graph for a simple application, you must assemble the source code model and reference it from a CodeCompileUnit.

Se puede crear una nueva unidad de compilación con la sintaxis que muestra este ejemplo:You can create a new compile unit with the syntax demonstrated in this example:

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

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.A CodeSnippetCompileUnit can contain a section of source code that is already in the target language, but cannot be rendered to another language.

Definir un espacio de nombresDefining a namespace

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.To define a namespace, create a CodeNamespace and assign a name for it using the appropriate constructor or by setting its Name property.

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

Importar un espacio de nombresImporting a namespace

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.To add a namespace import directive to the namespace, add a CodeNamespaceImport that indicates the namespace to import to the CodeNamespace.Imports collection.

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:The following code adds an import for the System namespace to the Imports collection of a CodeNamespace named samples:

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

Vincular elementos de código al gráfico de objetosLinking code elements into the object graph

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.All code elements that form a CodeDOM graph must be linked to the CodeCompileUnit that is the root element of the tree by a series of references between elements directly referenced from the properties of the root object of the graph. Establezca un objeto en una propiedad de un objeto de contenedor para establecer una referencia desde el objeto de contenedor.Set an object to a property of a container object to establish a reference from the container object.

La siguiente instrucción agrega el espacio de nombres CodeNamespace samples a la propiedad de colección Namespaces del objeto raíz CodeCompileUnit.The following statement adds the samples CodeNamespace to the Namespaces collection property of the root CodeCompileUnit.

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

Definir un tipoDefining a type

Para declarar una clase, estructura, interfaz o enumeración utilizando CodeDOM, cree un nuevo objeto CodeTypeDeclaration y asígnele un nombre.To declare a class, structure, interface, or enumeration using the CodeDOM, create a new CodeTypeDeclaration, and assign it a name. En el siguiente ejemplo se muestra cómo hacerlo mediante una sobrecarga de constructor para establecer la propiedad Name:The following example demonstrates this using a constructor overload to set the Name property:

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.To add a type to a namespace, add a CodeTypeDeclaration that represents the type to add to the namespace to the Types collection of a CodeNamespace.

En el siguiente ejemplo se muestra cómo agregar una clase denominada class1 a un espacio de nombres CodeNamespace denominado samples:The following example demonstrates how to add a class named class1 to a CodeNamespace named samples:

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

Agregar miembros de clase a una claseAdding class members to a class

El espacio de nombres System.CodeDom dispone de diferentes elementos que se pueden utilizar para representar miembros de clase.The System.CodeDom namespace provides a variety of elements that can be used to represent class members. Todos los miembros de clase pueden agregarse a la colección Members de una declaración CodeTypeDeclaration.Each class member can be added to the Members collection of a CodeTypeDeclaration.

Definir un método de punto de entrada de código para un archivo ejecutableDefining a code entry point method for an executable

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.If you are building code for an executable program, it is necessary to indicate the entry point of a program by creating a CodeEntryPointMethod to represent the method at which program execution should begin.

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!":The following example demonstrates how to define an entry point method that contains a CodeMethodInvokeExpression that calls System.Console.WriteLine to print "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:The following statement adds the entry point method named Start to the Members collection of 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.Now the CodeCompileUnit named compileUnit contains the CodeDOM graph for a simple Hello World program. 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.For information on generating and compiling code from a CodeDOM graph, see Generating Source Code and Compiling a Program from a CodeDOM Graph.

Más información sobre la forma de compilar un gráfico CodeDOM.More information on building a CodeDOM graph

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.The CodeDOM supports the many common types of code elements found in programming languages that support the 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.The CodeDOM was not designed to provide elements to represent all possible programming language features. El código que no se puede representar fácilmente con elementos CodeDOM se puede encapsular en un CodeSnippetExpression, CodeSnippetStatement, CodeSnippetTypeMember o CodeSnippetCompileUnit.Code that cannot be represented easily with CodeDOM elements can be encapsulated in a CodeSnippetExpression, a CodeSnippetStatement, a CodeSnippetTypeMember, or a CodeSnippetCompileUnit. No obstante, los miniprogramas no pueden traducirse automáticamente a otros lenguajes por medio de CodeDOM.However, snippets cannot be translated to other languages automatically by the CodeDOM.

Para obtener documentación de cada uno de los tipos CodeDOM, consulte la documentación de referencia del espacio de nombres System.CodeDom.For documentation for the each of the CodeDOM types, see the reference documentation for the System.CodeDom namespace.

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.For a quick chart to locate the CodeDOM element that represents a specific type of code element, see the CodeDOM Quick Reference.