Help and Support

ID do artigo: 304655 - Última revisão: quarta-feira, 30 de julho de 2008 - Revisão: 3.0

Como programaticamente compilar código usando o compilador C#

Para obter uma versão do Visual Basic .NET deste artigo, consulte 304654  (http://support.microsoft.com/kb/304654/ ) .

Nesta página

Expandir tudo | Recolher tudo

Sumário

O .NET Framework expõe classes que permitem a você para programaticamente acessar o compilador de linguagem C#. Isso pode ser útil se você deseja gravar seus próprios utilitários de compilação de código. Este artigo fornece código de exemplo que permite que você compilar o código de uma fonte de texto. O aplicativo lhe permite tanto apenas criar o arquivo executável ou criar o arquivo executável e executá-lo. Quaisquer erros que ocorram durante o processo de compilação são exibidos na forma.

Mais Informações

Etapa 1: requisitos

  • O Visual Studio
  • Compilador de linguagem Visual C#

Etapa 2: como Compile através de programação de código

O .NET Framework fornece a interface de execução do compilador ICodeCompiler. A classe de CSharpCodeProvider implementa essa interface e fornece acesso a instâncias do gerador de código C# e do compilador de código. O exemplo de código a seguir cria uma instância de CSharpCodeProvider e usa-o para obter uma referência a uma interface ICodeCompiler.
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();
				

Depois de uma referência a uma interface ICodeCompiler, você pode usá-lo para compilar seu código-fonte. Você irá passar parâmetros para o compilador usando a classe CompilerParameters . Aqui está um exemplo:
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.OutputAssembly = Output;
CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString);
				

O código acima usa o objeto CompilerParameters para informar ao compilador que você deseja gerar um arquivo executável (em oposição a uma DLL) e que você deseja que o assembly resultante para o disco de saída. A chamada para CompileAssemblyFromSource é onde o assembly é compilado. Este método usa o objeto de parâmetros e o código de origem, que é uma seqüência de caracteres. Depois que você compilar seu código, você pode verificar para ver se houve quaisquer erros de compilação. Você usar o valor de retorno de CompileAssemblyFromSource , que é um objeto CompilerResults. Este objeto contém uma coleção de erros, que contém os erros ocorridos durante a compilação.
   if (results.Errors.Count > 0)
   {
    foreach(CompilerError CompErr in results.Errors)
    {
     textBox2.Text = textBox2.Text +
         "Line number " + CompErr.Line + 
         ", Error Number: " + CompErr.ErrorNumber + 
         ", '" + CompErr.ErrorText + ";" + 
         Environment.NewLine + Environment.NewLine;
    }
   }
				

Há outras opções de compilação, como a compilação de um arquivo. Você também pode lote compilação, o que significa que você pode compilar vários arquivos ou fontes ao mesmo tempo. Informações adicionais sobre essas classes podem ser encontradas no MSDN Online Library:
http://search.microsoft.com/us/dev/default.asp (http://search.microsoft.com/us/dev/default.asp)

Etapa 3: exemplo de procedimento passo a passo

  1. Crie um novo aplicativo do Visual C# .NET Windows. Form1 é criado por padrão.
  2. Adicionar um controle Button para Form1 e, em seguida, alterar sua propriedade Text para criar .
  3. Adicione outro controle de botão para Form1 e altere sua propriedade Text para executar .
  4. Adicione dois controles TextBox Form1, defina a propriedade Multiline para ambos os controles como True e, em seguida, dimensionar esses controles para que você pode colar várias linhas de texto em cada um deles.
  5. No editor de código, abra o arquivo de origem de Form1.cs.
  6. Na classe Form1 , colar o seguinte botão clique manipulador.
    private void button1_Click(object sender, System.EventArgs e)
    {
        CSharpCodeProvider codeProvider = new CSharpCodeProvider();
        ICodeCompiler icc = codeProvider.CreateCompiler();
        string Output = "Out.exe";
        Button ButtonObject = (Button)sender;
    
        textBox2.Text = "";
        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        //Make sure we generate an EXE, not a DLL
        parameters.GenerateExecutable = true;
        parameters.OutputAssembly = Output;
        CompilerResults results = icc.CompileAssemblyFromSource(parameters, textBox1.Text);
    
        if (results.Errors.Count > 0)
        {
            textBox2.ForeColor = Color.Red;
            foreach (CompilerError CompErr in results.Errors)
            {
                textBox2.Text = textBox2.Text +
                            "Line number " + CompErr.Line +
                            ", Error Number: " + CompErr.ErrorNumber +
                            ", '" + CompErr.ErrorText + ";" +
                            Environment.NewLine + Environment.NewLine;
            }
        }
        else
        {
            //Successful Compile
            textBox2.ForeColor = Color.Blue;
            textBox2.Text = "Success!";
            //If we clicked run then launch our EXE
            if (ButtonObject.Text == "Run") Process.Start(Output);
        }
    }
    Add the beginning of the file, add these using statements:
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
    Observação se você estiver usando o Visual Studio 2005 ou o Visual Studio 2008, a classe CSharpCodeProvider foi preterida. Você pode usar a classe CodeDomProvider em vez disso, como demonstra a implementação de Button1_Click a seguir.
    private void button1_Click(object sender, System.EventArgs e)
    {
        CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
        string Output = "Out.exe";
        Button ButtonObject = (Button)sender;
    
        textBox2.Text = "";
        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        //Make sure we generate an EXE, not a DLL
        parameters.GenerateExecutable = true;
        parameters.OutputAssembly = Output;
        CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, textBox1.Text);
    
        if (results.Errors.Count > 0)
        {
            textBox2.ForeColor = Color.Red;
            foreach (CompilerError CompErr in results.Errors)
            {
                textBox2.Text = textBox2.Text +
                            "Line number " + CompErr.Line +
                            ", Error Number: " + CompErr.ErrorNumber +
                            ", '" + CompErr.ErrorText + ";" +
                            Environment.NewLine + Environment.NewLine;
            }
        }
        else
        {
            //Successful Compile
            textBox2.ForeColor = Color.Blue;
            textBox2.Text = "Success!";
            //If we clicked run then launch our EXE
            if (ButtonObject.Text == "Run") Process.Start(Output);
        }
    }
    Add the beginning of the file, add these using statements:
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    
  7. Em Form1.cs, localize o construtor de Form1.
  8. Após a chamada para InitializeComponent no construtor Form1, adicione o seguinte código para conectar o botão clique manipulador para os dois botões que você adicionou ao Form1.
    public Form1()
    {
        InitializeComponent();
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Click += new System.EventHandler(this.button1_Click);
    }
    
  9. Execute o projeto. Depois de Form1 é carregado, clique no botão Criar . Observe que você obtenha um erro do compilador.
  10. Em seguida, copie o seguinte texto na caixa de texto, substituindo qualquer texto existente:
    using System;
    
    namespace HelloWorld
    {
    	/// <summary>
    	/// Summary description for Class1.
    	/// </summary>
    	class HelloWorldClass
    	{
    		static void Main(string[] args)
    		{
    			Console.WriteLine("Hello World!");
    			Console.ReadLine();
    		}
    	}
    }
    					
  11. Clique em Criar novamente. A compilação deve ser bem-sucedida.
  12. Clique em Executar , e ele irá compilar o código e executar o arquivo executável resultante. A compilação cria um arquivo executável chamado "Out.exe", que é salvo na mesma pasta que o aplicativo que você está executando.

    Observação: Você pode modificar o código na caixa de texto para ver os erros do compilador diferentes. Por exemplo, excluir um do ponto-e-vírgula e recompilar o código.
  13. Por fim, modifique o código na caixa de texto para a saída outra linha de texto para a janela de console. Clique em Executar para ver a saída.

Referências

Classe CSharpCodeProvider
http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx (http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx)

Interface ICodeCompiler
http://msdn.microsoft.com/en-us/library/system.codedom.compiler.icodecompiler.aspx (http://msdn.microsoft.com/en-us/library/system.codedom.compiler.icodecompiler.aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft .NET Framework 1.0 nas seguintes plataformas
    • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbsweptvs2008 kbbcl kbcompiler kbhowto kbprod2web KB304655 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Caso venha a encontrar erros neste artigo e queira colaborar no processo de aperfeiçoamento desta ferramenta, por favor preencha o formulário existente na parte inferior desta página. Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 304655  (http://support.microsoft.com/kb/304655/en-us/ )

Traduções deste artigo

 

Related Support Centers