Compilare codice a livello di codice usando il compilatore C#

Questo articolo descrive come compilare il codice da un'origine di testo usando il compilatore C#.

Versione originale del prodotto: Visual Studio, .NET Framework
Numero KB originale: 304655

Riepilogo

Microsoft .NET Framework espone classi che consentono di accedere a livello di codice al compilatore di linguaggio C#. Questa operazione può essere utile se si vogliono scrivere utilità di compilazione del codice personalizzate. Questo articolo fornisce codice di esempio che consente di compilare codice da un'origine di testo. L'applicazione consente di compilare il file eseguibile o di compilare il file eseguibile ed eseguirlo. Eventuali errori che si verificano durante il processo di compilazione vengono visualizzati nel modulo.

Requisiti

  • Visual Studio
  • Compilatore di linguaggio Visual C#

Compilare il codice usando il compilatore C#

.NET Framework fornisce l'interfaccia di esecuzione del ICodeCompiler compilatore. La CSharpCodeProvider classe implementa questa interfaccia e fornisce l'accesso alle istanze del generatore di codice C# e del compilatore di codice. Il codice di esempio seguente crea un'istanza di CSharpCodeProvider e la usa per ottenere un riferimento a un'interfaccia ICodeCompiler .

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

Dopo aver creato un riferimento a un'interfaccia ICodeCompiler , è possibile usarlo per compilare il codice sorgente. Si passeranno parametri al compilatore usando la CompilerParameters classe . Ecco un esempio:

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

Il codice precedente usa l'oggetto CompilerParameters per indicare al compilatore che si desidera generare un file eseguibile (anziché una DLL) e che si vuole restituire l'assembly risultante su disco. La chiamata a CompileAssemblyFromSource è la posizione in cui viene compilato l'assembly. Questo metodo accetta l'oggetto parameters e il codice sorgente, ovvero una stringa. Dopo aver compilato il codice, è possibile verificare se si sono verificati errori di compilazione. Si usa il valore restituito da CompileAssemblyFromSource, che è un CompilerResults oggetto . Questo oggetto contiene una raccolta di errori che contiene eventuali errori che si sono verificati durante la compilazione.

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

Sono disponibili altre opzioni per la compilazione, ad esempio la compilazione da un file. È anche possibile compilare in batch, ovvero è possibile compilare più file o origini contemporaneamente.

Esempio di procedura dettagliata

  1. Creare una nuova applicazione Windows Visual C# .NET. Form1 viene creato per impostazione predefinita.

  2. Aggiungere un controllo Button a Form1 e quindi modificare la relativa proprietà Text in Build.

  3. Aggiungere un altro controllo Button a Form1 e quindi modificare la relativa proprietà Text in Run.Add another Button control to Form1, and then change its Text property to Run.

  4. Aggiungere due controlli TextBox a Form1, impostare la proprietà Multiline per entrambi i controlli su True e quindi ridimensionare questi controlli in modo che sia possibile incollare più righe di testo in ognuno di essi.

  5. Nell'editor di codice aprire il file di origine Form1.cs.

  6. Form1 Nella classe incollare il gestore di clic del pulsante seguente.

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

    All'inizio del file aggiungere queste using istruzioni:

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. In Form1.cs individuare il Form1 costruttore.

  8. Dopo la chiamata a InitializeComponent nel Form1 costruttore, aggiungere il codice seguente per collegare il gestore di clic del pulsante a entrambi i pulsanti aggiunti a Form1.

    public Form1()
    {
        InitializeComponent();
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Click += new System.EventHandler(this.button1_Click);
    }
    
  9. Eseguire il progetto. Dopo il caricamento di Form1 , fare clic sul pulsante Compila .

    Nota

    Viene visualizzato un errore del compilatore.

  10. Copiare quindi il testo seguente nella casella di testo, sostituendo qualsiasi testo esistente:

    using System;
    namespace HelloWorld
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class HelloWorldClass
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                Console.ReadLine();
            }
        }
    }
    
  11. Fare di nuovo clic su Compila . La compilazione deve avere esito positivo.

  12. Fare clic su Esegui per compilare il codice ed eseguire il file eseguibile risultante. La compilazione crea un file eseguibile denominato Out.exe, salvato nella stessa cartella dell'applicazione in esecuzione.

    Nota

    È possibile modificare il codice nella casella di testo per visualizzare errori del compilatore diversi. Ad esempio, eliminare uno dei punti e virgola e ricompilare il codice.

  13. Infine, modificare il codice nella casella di testo per restituire un'altra riga di testo nella finestra della console. Fare clic su Esegui per visualizzare l'output.

Riferimenti