Partilhar via


Usando o CodeDOM.

O CodeDOM fornece tipos que representam os tipos mais comuns de elementos de código fonte. Você pode criar um programa que cria um modelo de código de origem usando elementos de CodeDOM para montar um gráfico de objeto. Este gráfico de objeto pode ser processado como código-fonte usando um gerador de código CodeDOM para uma linguagem de programação com suporte. O CodeDOM também pode ser usado para compilar o código-fonte em um assembly de binário.

Alguns usos comuns do CodeDOM incluem:

  • Geração de código de modelo: Gerando código para ASP.NET, os proxies de cliente de serviços XML da Web, assistentes de código, designers ou outros mecanismos de emissão de código.

  • Compilação dinâmica: compilação de código de suporte em um único ou vários idiomas.

A criação de um gráfico CodeDOM

O System.CodeDom namespace fornece classes para representar a estrutura lógica do código-fonte, independente da sintaxe de linguagem.

A estrutura de um gráfico CodeDOM

A estrutura de um gráfico CodeDOM é semelhante a uma árvore de recipientes. O mais alto, ou raiz, o recipiente de cada gráfico compilável do CodeDOM é uma CodeCompileUnit. Todos os elementos do seu modelo de código de origem devem estar vinculados no gráfico por meio de uma propriedade de um CodeObject no gráfico.

A criação de um modelo de código de origem para um programa de exemplo Hello World

A instrução a seguir fornece um exemplo de como criar um gráfico de objeto do CodeDOM representa o código de um simples aplicativo Hello World. Para o código-fonte completo para este exemplo de código, consulte o System.CodeDom.Compiler.CodeDomProvider tópico.

Criando uma unidade de compilação

O CodeDOM define um objeto chamado um CodeCompileUnit, que pode fazer referência a um gráfico de objeto do CodeDOM que modela o código-fonte para compilação. A CodeCompileUnit tem propriedades para armazenar as referências a atributos, namespaces e assemblies.

Os provedores de CodeDom derivam de CodeDomProvider classe contém métodos que processam o gráfico do objeto referenciado por um CodeCompileUnit.

Para criar um gráfico de objeto para um aplicativo simples, montar o modelo de código de origem e fazer referência a ele partir de um CodeCompileUnit.

Você pode criar uma nova unidade de compilação com a sintaxe demonstrada neste exemplo:

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

A CodeSnippetCompileUnit pode conter uma seção do código-fonte, que já está sendo o idioma de destino, mas não pode ser processado para outro idioma.

Define um namespace.

Para definir um namespace, crie um CodeNamespace e atribua um nome para ele usando o construtor apropriado ou definindo seu nome propriedade.

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

Importar um namespace

Para adicionar uma diretiva de importação do namespace ao namespace, adicione um CodeNamespaceImport que indica o namespace para importar para o CodeNamespace.Imports coleção.

O código a seguir adiciona uma importação para o sistema namespace para o Imports coleção de um CodeNamespace chamado samples:

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

A vinculação de elementos de código em um gráfico de objeto

Todos os elementos de código que formam um gráfico CodeDOM devem estar vinculados a CodeCompileUnit ou seja, o elemento raiz da árvore por uma série de referências entre os elementos referenciados diretamente a partir das propriedades do objeto raiz do gráfico. Defina um objeto a uma propriedade de um objeto de recipiente para estabelecer uma referência do objeto do recipiente.

A instrução a seguir adiciona a samples CodeNamespace para o Namespaces propriedade de coleção da raiz CodeCompileUnit.

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

Definindo um tipo

Para declarar uma classe, estrutura, interface ou enumeração usando CodeDOM, criar uma nova CodeTypeDeclaratione atribua a ela um nome. O exemplo a seguir demonstra isso usando uma sobrecarga de construtor para definir o nome propriedade:

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

Para adicionar um tipo para um namespace, adicione um CodeTypeDeclaration que representa o tipo de adicionar o namespace para o tipos coleção de um CodeNamespace.

O exemplo a seguir demonstra como adicionar uma classe chamada class1 para um CodeNamespace chamado samples:

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

A adição de membros de classe uma classe

O System.CodeDom namespace fornece uma variedade de elementos que podem ser usados para representar os membros de classe. Cada membro da classe pode ser adicionado para o membros coleção de um CodeTypeDeclaration.

Definindo um método de ponto de entrada de código para um executável

Se você estiver criando um código para um programa executável, é necessário para indicar o ponto de entrada de um programa criando um CodeEntryPointMethod para representar o método no qual programa deve começar a execução.

O exemplo a seguir demonstra como definir um método de ponto de entrada que contém um CodeMethodInvokeExpression que chama System.Console.WriteLine para imprimir "Olá mundo!":

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);

A instrução a seguir adiciona um método de ponto de entrada chamado Start para o membros coleção de class1:

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

Agora o CodeCompileUnit chamado CompileUnit contém o gráfico CodeDOM para um simples programa Hello World. Para informações sobre como gerar e compilar o código de um gráfico CodeDOM, consulte Gerando o código de fonte e compilar um programa a partir de um gráfico CodeDOM.

Obter mais informações sobre a criação de um gráfico CodeDOM

O CodeDOM suporta muitos tipos comuns de elementos de código encontrados em linguagens de programação que suportam o common language runtime. O CodeDOM não foi projetado para fornecer elementos para representar todos os recursos possíveis de linguagem de programação. Código que não pode ser representado facilmente com elementos de CodeDOM pode ser encapsulado em um CodeSnippetExpression, um CodeSnippetStatement, um CodeSnippetTypeMember, ou um CodeSnippetCompileUnit. No entanto, trechos não podem ser convertidos em outros idiomas automaticamente por CodeDOM.

Para obter a documentação para a cada um dos tipos de CodeDOM, consulte a documentação de referência para o System.CodeDom namespace.

Para um gráfico rapidamente localizar o elemento de CodeDOM representa um tipo específico de um elemento de código, consulte a Referência rápida do codeDOM.