Compilación de código mediante programación mediante el compilador de C#

En este artículo se describe cómo compilar código desde un origen de texto mediante el compilador de C#.

Versión original del producto: Visual Studio, .NET Framework
Número de KB original: 304655

Resumen

Microsoft .NET Framework expone clases que permiten acceder mediante programación al compilador de lenguaje de C#. Esto podría ser útil si desea escribir sus propias utilidades de compilación de código. En este artículo se proporciona código de ejemplo que le permite compilar código desde un origen de texto. La aplicación le permite compilar el archivo ejecutable o compilarlo y ejecutarlo. Los errores que se produzcan durante el proceso de compilación se muestran en el formulario.

Requisitos

  • Visual Studio
  • Compilador de lenguaje de Visual C#

Compilación de código mediante el compilador de C#

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

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

Una vez que tenga una referencia a una ICodeCompiler interfaz, puede usarla para compilar el código fuente. Pasará parámetros al compilador mediante la CompilerParameters clase . A continuación le mostramos 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 CompilerParameters objeto para indicar al compilador que desea generar un archivo ejecutable (en lugar de un archivo DLL) y que desea generar el ensamblado resultante en el 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 si se han producido errores de compilación. Use el valor devuelto de CompileAssemblyFromSource, que es un CompilerResults objeto . Este objeto contiene una colección errors, que contiene los errores que se produjeron 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 la compilación desde un archivo. También puede compilar por lotes, lo que significa que puede compilar varios archivos o orígenes al mismo tiempo.

Ejemplo de procedimiento paso a paso

  1. Cree una nueva aplicación de Windows de Visual C# .NET. Form1 se crea de forma predeterminada.

  2. Agregue un control Button a Form1 y, a continuación, cambie su propiedad Text a Build.

  3. Agregue otro control Button a Form1 y, a continuación, cambie su propiedad Text a Ejecutar.

  4. Agregue dos controles TextBox a Form1, establezca la propiedad Multiline para ambos controles en True y, a continuación, ajuste el tamaño de estos controles para que pueda pegar varias líneas de texto en cada uno de ellos.

  5. En el editor de código, abra el archivo de origen Form1.cs .

  6. En la Form1 clase , pegue el siguiente controlador de clics de botón.

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

    Al principio del archivo, agregue estas using instrucciones:

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. En Form1.cs, busque el Form1 constructor.

  8. Después de la llamada a InitializeComponent en el Form1 constructor, agregue el código siguiente para conectar el controlador de clics del botón a 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 Compilar .

    Nota:

    Obtiene un error del 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. Vuelva a hacer clic en Compilar . La compilación debe 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 denominado 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, elimine uno de los puntos y comas y recompile el código.

  13. Por último, modifique el código del cuadro de texto para generar otra línea de texto en la ventana de consola. Haga clic en Ejecutar para ver la salida.

Referencias