Compilar código programaticamente usando o compilador C#

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

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

Resumo

O Microsoft .NET Framework expõe classes que permitem que você acesse programaticamente o compilador de idiomas 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 código de uma fonte de texto. O aplicativo permite que você apenas crie o executável ou crie 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 idiomas do 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 de CSharpCodeProvider e o 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. Veja 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 dizer ao compilador que você deseja gerar um arquivo executável (em oposição a uma DLL) e que deseja gerar o assembly resultante para o disco. A chamada para CompileAssemblyFromSource é onde o assembly é compilado. Esse método usa o objeto de parâmetros e o código-fonte, que é uma cadeia de caracteres. Depois de compilar seu código, você pode marcar para ver se houve algum erro de compilação. Você usa o valor retornado de CompileAssemblyFromSource, que é um CompilerResults objeto. Este objeto contém uma coleção de erros, que contém todos os erros ocorridos durante o compilado.

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 para compilação, como compilar 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 .NET Windows do Visual C#. O Form1 é criado por padrão.

  2. Adicione um controle Button ao 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 ao Form1, defina a propriedade Multiline para ambos os controles como True e, em seguida, dimensione esses controles para que você possa colar várias linhas de texto em cada um deles.

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

  6. Form1 Na classe, cole o manipulador de clique no botão a seguir.

    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 InitializeComponentForm1 construtor, adicione o código a seguir para conectar o manipulador de cliques do botão aos dois botões adicionados 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ê obtém 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 Compilar novamente. O compilado deve ser bem-sucedido.

  12. Clique em Executar e ele compilará o código e executará o arquivo executável resultante. O compilado 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 dois pontos 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