Artigo: 304655 - Última revisão: quarta-feira, 30 de Julho de 2008 - Revisão: 3.1

Como programaticamente compilar o código do compilador C#

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Para obter uma Visual Basic .NET versão deste artigo, consulte 304654  (http://support.microsoft.com/kb/304654/ ) .

Nesta página

Expandir tudo | Reduzir tudo

Sumário

O .NET Framework expõe classes que permitem aceder programaticamente o compilador de idioma do C#. Isto pode ser útil se pretender escrever os seus próprios utilitários de compilação de código. Este artigo fornece código de exemplo permite-lhe compilar código a partir de uma origem de texto. A aplicação permite-lhe o basta criar o ficheiro executável ou criar o ficheiro executável e executá-la. Quaisquer erros que ocorram durante o processo de compilação são apresentados no formulário.

Mais Informação

Passo 1: requisitos

  • O Visual Studio
  • Compilador Visual C# idioma

Passo 2: Como através de programação compilar código

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

Quando tiver uma referência a uma interface ICodeCompiler, é possível utilizar para compilar o código de origem. Vai passar parâmetros para o compilador utilizando a classe CompilerParameters . Eis 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 utiliza o objecto CompilerParameters para indicar o compilador de que pretende gerar um ficheiro executável (por oposição a uma DLL) e que pretende exportar a assemblagem resultante para o disco. A chamada para CompileAssemblyFromSource é onde a assemblagem é compilada. Este método utiliza o objecto de parâmetros e o código de origem, que é uma cadeia. Depois de compilar o código, pode verificar para ver se ocorreram quaisquer erros de compilação. Utilize o valor devolvido de CompileAssemblyFromSource , que é um objecto CompilerResults. Este objecto contém uma colecção de erros, que contém quaisquer erros que ocorreram 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 compilar, tais como compilar a partir de um ficheiro. Também pode batch compilação, o que significa que pode compilar vários ficheiros ou origens ao mesmo tempo. É possível encontrar informações adicionais sobre estas classes na MSDN Online Library:
http://msdn.microsoft.com/en-us/default.aspx (http://msdn.microsoft.com/en-us/default.aspx)

Passo 3: Exemplo de procedimento passo a passo

  1. Crie uma nova aplicação Visual C# .NET Windows. É criado o Form1 por predefinição.
  2. Adicione um controlo de botão ao Form1 e, em seguida, altere a propriedade de texto para criar .
  3. Adicione outro controlo de botão ao Form1 e altere a propriedade de texto a ser executado .
  4. Adicione dois controlos de caixa de texto ao Form1, defina a propriedade Multiline para ambos os controlos como Verdadeiro e, em seguida, dimensione estes controlos de modo a, pode colar várias linhas de texto em cada um deles.
  5. No editor de código, abra o ficheiro de origem de Form1.cs.
  6. Classe Form1 , colar o seguinte botão, clique em processador.
    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;
    
    Nota se estiver a utilizar Visual Studio 2005 ou Visual Studio 2008, a classe CSharpCodeProvider foi preterida. Pode utilizar a classe de CodeDomProvider em vez disso, como demonstra a implementação do button1_Click que se segue.
    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. No Form1.cs, localize o Construtor de Form1.
  8. Depois da chamada para InitializeComponent no construtor Form1, adicione o seguinte código para o botão ligue clique em processador para os dois botões que adicionou 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 projecto. Depois do Form1 é carregado, clique no botão Compilar . Repare que recebe um erro de compilador.
  10. Em seguida, copie o seguinte texto para a caixa de texto, substituir 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 efectuada com êxito.
  12. Clique em Executar , e irá compilar o código e execute o ficheiro executável resultante. A compilação cria um ficheiro executável denominado "Out.exe", que é guardado na mesma pasta que a aplicação que está a ser executado.

    NOTA: Pode modificar o código na caixa de texto para ver os erros do compilador diferente. Por exemplo, elimine um a ponto e vírgula e reconstruir o código.
  13. Finalmente, modifique o código na caixa de texto para outra linha de texto para a janela da consola de saída. Clique em Executar para ver os resultados.

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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 304655  (http://support.microsoft.com/kb/304655/en-us/ )