Use o CodeDOM

O CodeDOM fornece tipos que representam muitos tipos comuns de elementos de código-fonte. Você pode projetar um programa que cria um modelo de código-fonte usando elementos 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 suportada. O CodeDOM também pode ser usado para compilar o código-fonte em um assembly binário.

Alguns usos comuns para o CodeDOM incluem:

  • Geração de código baseada em modelos: geração de código para ASP.NET, proxies de cliente de serviços Web XML, assistentes, designers ou outros mecanismos emissores de código.
  • Compilação dinâmica: suporta a compilação de código em uma ou várias linguagens.

Criar um gráfico CodeDOM

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

A estrutura de um gráfico CodeDOM

A estrutura de um gráfico CodeDOM é como uma árvore de contêineres. O contêiner de nível superior, ou raiz, de cada gráfico do CodeDOM compilável é um CodeCompileUnit. Cada elemento do seu modelo de código-fonte deve ser vinculado ao gráfico através de uma propriedade de a CodeObject no gráfico.

Criar um modelo de código-fonte para um exemplo de programa Hello World

O passo a passo a seguir fornece um exemplo de como criar um gráfico de objeto CodeDOM que representa o código para um aplicativo Hello World simples. Para obter o código-fonte completo para este exemplo de código, consulte o System.CodeDom.Compiler.CodeDomProvider artigo.

Criar uma unidade de compilação

O CodeDOM define um objeto chamado CodeCompileUnit, que pode referenciar um gráfico de objetos CodeDOM que modela o código-fonte a ser compilado. A CodeCompileUnit tem propriedades para armazenar referências a atributos, namespaces e assemblies.

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

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

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

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

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

Definir um namespace

Para definir um namespace, crie-se um CodeNamespace e atribui-lhe um nome usando o construtor apropriado ou definindo a sua Name propriedade.

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

Importar um namespace

Para adicionar uma diretiva de importação de namespace ao namespace, adicione uma CodeNamespaceImport que indique o namespace a ser importado para a coleção CodeNamespace.Imports .

O código seguinte adiciona uma referência de importação para o System namespace à coleção Imports de um CodeNamespace chamado samples:

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

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

A seguinte instrução adiciona o samplesCodeNamespace à propriedade de coleção Namespaces do CodeCompileUnit raiz.

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

Definir um tipo

Para declarar uma classe, estrutura, interface ou enumeração usando o CodeDOM, crie um novo CodeTypeDeclaratione atribua-lhe um nome. O exemplo seguinte demonstra isto usando uma sobrecarga de construtores para definir a Name propriedade:

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

Para adicionar um tipo a um namespace, adicione a CodeTypeDeclaration que representa o tipo a adicionar ao namespace à Types coleção de um CodeNamespace.

O exemplo seguinte demonstra como adicionar uma classe nomeada class1 a uma CodeNamespace nomeada samples:

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

Adicionar membros da classe a uma classe

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

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

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

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

A seguinte instrução adiciona o método de ponto de entrada nomeado Start à Members coleção de class1:

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

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

Mais informações sobre como criar um gráfico CodeDOM

O CodeDOM suporta os 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 da linguagem de programação. O código que não pode ser representado facilmente com elementos CodeDOM pode ser encapsulado em um CodeSnippetExpression, um CodeSnippetStatement, um CodeSnippetTypeMember ou um CodeSnippetCompileUnit. No entanto, trechos não podem ser traduzidos para outros idiomas automaticamente pelo CodeDOM.

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

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