Usar o CodeDOM
O CodeDOM fornece tipos que representam muitos dos tipos mais comuns de elementos de código-fonte. Você pode criar um programa que cria um modelo de código-fonte usando elementos do CodeDOM para montar um grafo de objeto. Este grafo de objeto pode ser renderizado 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 binário.
Alguns usos comuns do CodeDOM incluem:
- Geração de código de modelo: gerar código para ASP.NET, proxies de cliente de serviços Web XML, assistentes de código, designers ou outros mecanismos de emissão de código.
- Compilação dinâmica: suporte a compilação de código em uma ou várias linguagens.
Criar um grafo CodeDOM
O namespace System.CodeDom fornece classes para representar a estrutura lógica do código-fonte, independente da sintaxe da linguagem.
A estrutura de um grafo CodeDOM
A estrutura de um grafo CodeDOM é como uma árvore de contêineres. O contêiner mais alto de cada grafo CodeDOM compilável, a raiz, é um CodeCompileUnit. Cada elemento de seu modelo de código-fonte deve ser vinculado ao grafo por meio de uma propriedade de um CodeObject no grafo.
Crie um modelo de código-fonte para um exemplo de programa Olá, Mundo
A instrução passo a passo a seguir fornece um exemplo de como criar um grafo de objeto CodeDOM que representa o código de um aplicativo Olá, Mundo simples. Para obter o código-fonte completo desse exemplo de código, consulte o artigo System.CodeDom.Compiler.CodeDomProvider.
Criar uma unidade de compilação
O CodeDOM define um objeto chamado de CodeCompileUnit, que pode fazer referência a um grafo de objeto do CodeDOM que modela o código-fonte a ser compilado. Um CodeCompileUnit tem propriedades para armazenar referências aos atributos, namespaces e assemblies.
Os provedores do CodeDom que derivam da classe CodeDomProvider contém métodos que processam o grafo do objeto referenciado por um CodeCompileUnit.
Para criar um grafo de objeto para um aplicativo simples, você deve montar o modelo de código-fonte e referenciá-lo de um CodeCompileUnit.
Você pode criar uma nova unidade de compilação com a sintaxe mostrada neste exemplo:
CodeCompileUnit^ compileUnit = gcnew CodeCompileUnit();
CodeCompileUnit compileUnit = new CodeCompileUnit();
Dim compileUnit As New CodeCompileUnit()
Uma CodeSnippetCompileUnit pode conter uma seção de código-fonte que já está no idioma de destino, mas não pode ser renderizada em outro idioma.
Definir um namespace
Para definir um namespace, crie um CodeNamespace e atribua um nome para ele usando o construtor apropriado ou definindo sua propriedade Nome.
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 do namespace ao namespace, adicione um CodeNamespaceImport que indica o namespace a ser importado para a coleção CodeNamespace.Imports.
O código a seguir adiciona uma importação para o namespace System à coleção Importações de um CodeNamespace chamado samples
:
samples->Imports->Add(gcnew CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"))
Vincular elementos de código ao grafo de objetos
Todos os elementos de código que formam um grafo CodeDOM devem ser vinculados ao CodeCompileUnit, que é o elemento raiz da árvore por uma série de referências entre os elementos referenciados diretamente das propriedades do objeto raiz do grafo. Defina um objeto como uma propriedade de um objeto de contêiner para estabelecer uma referência do objeto de contêiner.
A instrução a seguir adiciona samples
CodeNamespace à propriedade da coleção Namespaces da raiz CodeCompileUnit.
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 CodeTypeDeclaration e atribua um nome. O exemplo a seguir demonstra isso usando uma sobrecarga de construtor para definir a propriedade Nome:
CodeTypeDeclaration^ class1 = gcnew CodeTypeDeclaration("Class1");
CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
Dim class1 As New CodeTypeDeclaration("Class1")
Para adicionar um tipo a um namespace, adicione um CodeTypeDeclaration que representa o tipo a ser adicionado para o namespace à coleção Tipos de um CodeNamespace.
O exemplo a seguir demonstra como adicionar uma classe denominada class1
para um CodeNamespace chamado samples
:
samples->Types->Add(class1);
samples.Types.Add(class1);
samples.Types.Add(class1)
Adicionar membros de classe a uma classe
O namespace System.CodeDom fornece uma variedade de elementos que podem ser usados para representar os membros de classe. Cada membro de classe pode ser adicionado à coleção Membros de um CodeTypeDeclaration.
Definir um método de ponto de entrada de código para um executável
Se você estiver compilando código para um programa executável, será 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 instrução a seguir adiciona o método de ponto de entrada denominado Start
à coleção Membros de class1
:
class1->Members->Add(start);
class1.Members.Add( start );
class1.Members.Add(start)
Agora o CodeCompileUnit chamado compileUnit
contém o grafo CodeDOM para um programa Olá, Mundo simples. Para obter informações sobre como gerar e compilar o código de um grafo CodeDOM, consulte Gerando código-fonte e compilando um programa de um grafo CodeDOM.
Mais informações sobre a compilação de um grafo CodeDOM
O CodeDOM dá suporte a muitos tipos comuns de elementos de código encontrados em linguagens de programação que dão suporte ao Common Language Runtime. O CodeDOM não foi projetado para fornecer elementos para representar todos os recursos de linguagem de programação possíveis. Código que não pode ser representado facilmente com elementos do CodeDOM pode ser encapsulado em um CodeSnippetExpression, CodeSnippetStatement, CodeSnippetTypeMember ou CodeSnippetCompileUnit. No entanto, snippets não podem ser convertidos para outras linguagens automaticamente pelo CodeDOM.
Para obter a documentação para cada um dos tipos do CodeDOM, consulte a documentação de referência para o namespace System.CodeDom.
Para uma verificação rápida para localizar o elemento de CodeDOM que representa um tipo específico de elemento de código, consulte a Referência rápida do CodeDOM.