Compartilhar via


Compilar código programaticamente usando o compilador C#

Este artigo descreve como compilar o código de uma fonte de texto usando o compilador C#.

Versão original do produto: Visual Studio, .NET Framework
Número original do KB: 304655

Resumo

O Microsoft .NET Framework expõe classes que permitem acessar programaticamente o compilador de linguagem C#. Isso pode ser útil se você quiser escrever seus próprios utilitários de compilação de código. Este artigo fornece um código de exemplo que permite compilar o código de uma fonte de texto. O aplicativo permite que você apenas construa o executável ou construa o executável e execute-o. Todos os erros que ocorrem durante o processo de compilação são exibidos no formulário.

Requisitos

  • Visual Studio
  • Compilador de linguagem Visual C#

Compilar código usando o compilador C#

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

CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();

Depois de ter uma referência a uma ICodeCompiler interface, você pode usá-la para compilar seu código-fonte. Você passará parâmetros para o compilador usando a CompilerParameters classe. Este é 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 CompilerParameters objeto para informar ao compilador que você deseja gerar um arquivo executável (em vez de uma DLL) e que deseja enviar o assembly resultante para o disco. A chamada para CompileAssemblyFromSource é onde o assembly é compilado. Esse método usa o objeto parameters e o código-fonte, que é uma string. Depois de compilar seu código, você pode verificar se houve algum erro de compilação. Você usa o valor de retorno de CompileAssemblyFromSource, que é um CompilerResults objeto. Esse objeto contém uma coleção errors, que contém todos 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;
    }
}

Existem outras opções para compilação, como compilar a partir de um arquivo. Você também pode compilar em lote, o que significa que você pode compilar vários arquivos ou fontes ao mesmo tempo.

Exemplo de procedimento passo a passo

  1. Crie um novo aplicativo Visual C# .NET Windows. Form1 é criado por padrão.

  2. Adicione um controle Button a Form1 e altere sua propriedade Text para Build.

  3. Adicione outro controle Button ao Form1 e altere sua propriedade Text para Executar.

  4. Adicione dois controles TextBox a Form1, defina a propriedade Multiline para ambos os controles como True e dimensione esses controles para que você possa colar várias linhas de texto em cada um.

  5. No editor de código, abra o arquivo de origem Form1.cs .

  6. Na classe, cole Form1 o seguinte manipulador de cliques de botão.

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

    No início do arquivo, adicione estas using instruções:

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. Em Form1.cs, localize o Form1 construtor.

  8. Após a chamada no InitializeComponent Form1 construtor, adicione o código a seguir para conectar o manipulador de clique de botão a ambos os 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 que o Form1 for carregado, clique no botão Compilar .

    Observação

    Você recebe um erro do compilador.

  10. Em seguida, copie o seguinte texto para a 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 Compilar novamente. A compilação deve ser bem-sucedida.

  12. Clique em Executar e ele 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 diferentes erros do compilador. Por exemplo, exclua um dos ponto-e-vírgula e recompile o código.

  13. Por fim, modifique o código na caixa de texto para gerar outra linha de texto para a janela do console. Clique em Executar para ver a saída.

Referências