Cómo compilar código mediante C# compilador mediante programación

Para una versión de Visual Basic .NET de este artículo, consulte 304654 .

Resumen

El.NET Framework expone clases que permiten obtener acceso mediante programación al compilador del lenguaje C#. Esto puede resultar útil si desea escribir sus propias utilidades para compilar código. En este artículo se proporciona código de ejemplo que permite compilar código desde un origen de texto. La aplicación le permite simplemente generar el archivo ejecutable o generar el archivo ejecutable y ejecutarlo. Los errores que se producen durante el proceso de compilación se muestran en el formulario.

Más información

Paso 1: requisitos

  • Visual Studio
  • Compilador de lenguaje de Visual C#

Paso 2: Cómo compilar código mediante programación

El.NET Framework proporciona la interfaz de ejecución del compilador ICodeCompiler. La clase CSharpCodeProvider implementa esta interfaz y proporciona acceso a instancias del generador de código de C# y el compilador de código. El código de ejemplo siguiente crea una instancia de la clase CSharpCodeProvider y lo utiliza para obtener una referencia a una interfaz ICodeCompiler.

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


Una vez que tenga una referencia a una interfaz ICodeCompiler, puede utilizar para compilar el código fuente. Se pasar parámetros al compilador utilizando la clase CompilerParameters . Éste es un ejemplo:

System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();parameters.GenerateExecutable = true;
parameters.OutputAssembly = Output;
CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString);


El código anterior usa el objeto CompilerParameters para indicar al compilador que desea generar un archivo ejecutable (en oposición a una DLL) y que desea enviar el ensamblado resultante al disco. La llamada a CompileAssemblyFromSource es donde se compila el ensamblado. Este método toma el objeto parameters y el código fuente, que es una cadena. Después de compilar el código, puede comprobar para ver si se produjeron errores de compilación. Utilice el valor devuelto por CompileAssemblyFromSource, que es un objeto CompilerResults. Este objeto contiene una colección de errores que contiene cualquier error que se produjo durante la compilación.

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


Hay otras opciones para compilar, como compilar desde un archivo. Se puede también compilar por lotes, lo que significa que puede compilar al mismo tiempo varios archivos u orígenes. Puede encontrarse información adicional sobre estas clases en MSDN Online Library:

Paso 3: Ejemplo de procedimiento paso a paso

  1. Cree una nueva aplicación de Windows en .NET C#. Se creará Form1 de forma predeterminada.
  2. Agregue un control Button a Form1 y cambie su propiedad Text para Generar.
  3. Agregue otro control Button a Form1 y cambie su propiedad Text para Ejecutar.
  4. Agregue dos controles TextBox a Form1, establezca la propiedad Multiline para ambos controles en Truey luego tamaño estos controles para que se pueden pegar varias líneas de texto en cada uno de ellos.
  5. En el editor de código, abra el archivo de código fuente Form1.cs.
  6. En la clase Form1 , pegar el botón siguiente, haga clic en controlador.
    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: Si está utilizando Visual Studio 2005 o Visual Studio 2008, la clase CSharpCodeProvider está desusada. Puede utilizar la clase CodeDomProvider en su lugar, como se muestra en la siguiente implementación de button1_Click.
    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. En Form1.cs, busque el constructor de Form1.
  8. Después de la llamada a InitializeComponent en el constructor de Form1, agregue el siguiente código para el botón de conectar, haga clic en controlador de ambos botones que agregó a Form1.
    public Form1(){
    InitializeComponent();
    this.button1.Click += new System.EventHandler(this.button1_Click);
    this.button2.Click += new System.EventHandler(this.button1_Click);
    }

  9. Ejecute el proyecto. Después de cargar Form1, haga clic en el botón Generar . Observe que aparece un error de compilador.
  10. A continuación, copie el texto siguiente en el cuadro de texto, reemplazando cualquier 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. Haga clic en crear nuevo. La compilación debería ser correcta.
  12. Haga clic en Ejecutar, y compilar el código y ejecutar el archivo ejecutable resultante. La compilación crea un archivo ejecutable llamado "Out.exe" que se guarda en la misma carpeta que la aplicación que esté ejecutando.

    Nota: Puede modificar el código en el cuadro de texto para ver diferentes errores del compilador. Por ejemplo, eliminar uno de los puntos y comas y vuelva a generar el código.
  13. Por último, modifique el código en el cuadro de texto para sacar otra línea de texto en la ventana de consola. Haga clic en Ejecutar para ver el resultado.
Propiedades

Id. de artículo: 304655 - Última revisión: 22 ene. 2017 - Revisión: 2

Comentarios