Help and Support
 

powered byLive Search

Como compilar código usando compilador C# de forma programática

ID do artigo:304655
Última revisão:segunda-feira, 30 de agosto de 2004
Revisão:2.4
Para um Microsoft versão Visual Basic.NET de neste artigo, consulte 304654 (http://support.microsoft.com/kb/304654/EN-US/).
Nesta página

Sumário

O.NET Framework expõe classes que permitem que você a acessar programaticamente o compilador linguagem C#. Isso pode ser útil se você desejar para escrever seus próprios utilitários Code-compiling. Este artigo fornece codificar exemplo que habilita você a codificar compilação de uma origem de texto. Para qualquer compilar apenas executável ou compilar o aplicativo permite que você o executável e executá-lo. Quaisquer erros que são exibidos na forma a ocorrer durante o processo compilação.

Voltar para o início

Mais Informações

Etapa 1: Requisitos

?Visual Studio.NET
?Compilador linguagem Visual C#.NET

Voltar para o início

Etapa 2: How to compilar código de forma programática

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

Depois que você tiver uma referência a uma interface ICodeCompiler, poderá usá-lo para compilação seu codificar origem. Você irá transmitir 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);
				

A codificar acima usa o objeto CompilerParameters para informar o compilador que você desejar para gerar um arquivo executável (as opposed to um DLL) e que você desejar a saída do assembly resultante para disco. A chamar para CompileAssemblyFromSource é onde o assembly obtém compilado. Este método utiliza o objeto parâmetros e a codificar origem, que é um seqüência de caracteres. Após a compilação seu codificar, você pode verificar para ver se houve quaisquer erros compilação. Use o valor de retorno de CompileAssemblyFromSource , que é um objeto CompilerResults. Este objeto contém uma coleção 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;
    }
   }
				

Há outras opções para a compilação, como a compilação de um arquivo. Compilação lote, o que significa Você pode também pode compilação múltiplo arquivos ou fontes no mesmo tempo. Informações adicionais em dessas classes podem ser encontradas na biblioteca on-line MSDN:
http://search.microsoft.com/us/dev/default.asp (http://search.microsoft.com/us/dev/default.asp)

Voltar para o início

Exemplo da Etapa 3: do procedimento passo a passo

1.Create a new Visual C# .NET Windows application. O Form1 é criado por padrão..
2.No modo de exibição de Código do Form1, substituir o codificar existente com o seguinte:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Diagnostics;

namespace CSWinCompiler
{
   /// <summary>
   /// Summary description for Form1.
   /// </summary>
   public class Form1 : System.Windows.Forms.Form
   {
      private System.Windows.Forms.TextBox textBox1;
      private System.Windows.Forms.Button button1;
      private System.Windows.Forms.TextBox textBox2;
      private System.Windows.Forms.Button button2;
      /// <summary>
      /// Required designer variable.
      /// </summary>
      private System.ComponentModel.Container components = null;

      public Form1()
      {
         // 
         // Required for Windows Form Designer support
         // 
         InitializeComponent();

         // 
         // TODO: Add any constructor code after InitializeComponent call
         // 
      }

      /// <summary>
      /// Clean up any resources being used.
      /// </summary>
      protected override void Dispose( bool disposing )
      {
         if( disposing )
         {
            if (components != null) 
            {
               components.Dispose();
            }
         }
         base.Dispose( disposing );
      }

      #region Windows Form Designer generated code
      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      private void InitializeComponent()
      {
         this.textBox2 = new System.Windows.Forms.TextBox();
         this.textBox1 = new System.Windows.Forms.TextBox();
         this.button1 = new System.Windows.Forms.Button();
         this.button2 = new System.Windows.Forms.Button();
         this.SuspendLayout();
         // 
         // textBox2
         // 
         this.textBox2.BackColor = System.Drawing.SystemColors.Control;
         this.textBox2.BorderStyle = System.Windows.Forms.BorderStyle.None;
         this.textBox2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
         this.textBox2.ForeColor = System.Drawing.SystemColors.WindowText;
         this.textBox2.Location = new System.Drawing.Point(264, 56);
         this.textBox2.Multiline = true;
         this.textBox2.Name = "textBox2";
         this.textBox2.Size = new System.Drawing.Size(240, 232);
         this.textBox2.TabIndex = 2;
         this.textBox2.Text = "";
         // 
         // textBox1
         // 
         this.textBox1.Location = new System.Drawing.Point(16, 48);
         this.textBox1.Multiline = true;
         this.textBox1.Name = "textBox1";
         this.textBox1.Size = new System.Drawing.Size(240, 240);
         this.textBox1.TabIndex = 0;
         this.textBox1.Text = "textBox1";
         // 
         // button1
         // 
         this.button1.Location = new System.Drawing.Point(352, 296);
         this.button1.Name = "button1";
         this.button1.TabIndex = 1;
         this.button1.Text = "Build";
         this.button1.Click += new System.EventHandler(this.button1_Click);
         // 
         // button2
         // 
         this.button2.Location = new System.Drawing.Point(432, 296);
         this.button2.Name = "button2";
         this.button2.TabIndex = 1;
         this.button2.Text = "Run";
         this.button2.Click += new System.EventHandler(this.button1_Click);
         // 
         // Form1
         // 
         this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
         this.ClientSize = new System.Drawing.Size(512, 325);
         this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                        this.button2,
                                                        this.textBox2,
                                                        this.button1,
                                                        this.textBox1});
         this.Name = "Form1";
         this.Text = "Form1";
         this.ResumeLayout(false);

      }
      #endregion

      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main() 
      {
         Application.Run(new Form1());
      }

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

      }
   }
}
					
3.Execute o projeto. Após cargas Form1, clique o botão Construir . Observe que você get um erro compilador.
4.Próxima, copiar o seguinte texto para o 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();
		}
	}
}
					
5.Clique em Construir novamente. A compilação deve ser bem-sucedido.
6.Clique em Executar , e ele será compilação a codificar e executar o arquivo executável resultante. A compilação cria um arquivo executável chamado " Out.exe ", que é salvo na mesma pasta como o aplicativo que você está execução.

Observação: você pode modificar a codificar no caixa de texto para ver diferentes erros do compilador. Para excluir um dos ponto-e-vírgula e reconstruir o codificar exemplo,.
7.Finalmente, modificar a codificar no caixa de texto para saída outra linha de texto para o janela do console. Clique em Executar para ver a saída.

Voltar para o início

Referências

Classe CSharpCodeProvider
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfMicrosoftCSharpCompilerClassTopic.asp (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfMicrosoftCSharpCompilerClassTopic.asp)

Interface ICodeCompiler
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemCodeDomCompilerICodeCompilerClassTopic.asp (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemCodeDomCompilerICodeCompilerClassTopic.asp)

Voltar para o início


A informação contida neste artigo aplica-se a:
?Microsoft .NET Framework 1.0 nas seguintes plataformas
  Microsoft Visual C# .NET 2002 Standard Edition

Voltar para o início

Palavras-chave: 
kbhowto kbbcl kbcompiler kbprod2web KB304655 KbMtpt kbmt

Voltar para o início

Tradução automáticaIMPORTANTE: 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 tenha encontrado 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/)

Voltar para o início

Traduções deste artigo

 

Related Support Centers

Other Support Options

  • Need More Help?
    Contact a Support professional by Email, Online or Phone.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.