Programmgesteuertes Kompilieren von Code mithilfe des C#-Compilers

In diesem Artikel wird beschrieben, wie Code aus einer Textquelle mithilfe des C#-Compilers kompiliert wird.

Ursprüngliche Produktversion: Visual Studio, .NET Framework
Ursprüngliche KB-Nummer: 304655

Zusammenfassung

Der Microsoft .NET Framework macht Klassen verfügbar, mit denen Sie programmgesteuert auf den C#-Sprachcompiler zugreifen können. Dies kann nützlich sein, wenn Sie eigene Hilfsprogramme zum Kompilieren von Code schreiben möchten. Dieser Artikel enthält Beispielcode, mit dem Sie Code aus einer Textquelle kompilieren können. Mit der Anwendung können Sie entweder einfach die ausführbare Datei oder die ausführbare Datei erstellen und ausführen. Alle Fehler, die während des Kompilierungsvorgangs auftreten, werden im Formular angezeigt.

Anforderungen

  • Visual Studio
  • Visual C#-Sprachcompiler

Kompilieren von Code mithilfe des C#-Compilers

Die .NET Framework stellt die Compilerausführungsschnittstelle ICodeCompiler bereit. Die CSharpCodeProvider -Klasse implementiert diese Schnittstelle und bietet Zugriff auf Instanzen des C#-Code-Generators und -Codecompilers. Im folgenden Beispielcode wird eine instance von CSharpCodeProvider erstellt und verwendet, um einen Verweis auf eine ICodeCompiler Schnittstelle abzurufen.

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

Sobald Sie über einen Verweis auf eine ICodeCompiler Schnittstelle verfügen, können Sie sie verwenden, um Ihren Quellcode zu kompilieren. Sie übergeben Parameter mithilfe der -Klasse an den CompilerParameters Compiler. Hier ein Beispiel:

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

Im obigen Code wird das CompilerParameters -Objekt verwendet, um dem Compiler mitzuteilen, dass Sie eine ausführbare Datei (im Gegensatz zu einer DLL) generieren möchten und dass Sie die resultierende Assembly auf den Datenträger ausgeben möchten. Der Aufruf von CompileAssemblyFromSource ist der Ort, an dem die Assembly kompiliert wird. Diese Methode verwendet das Parameterobjekt und den Quellcode, bei dem es sich um eine Zeichenfolge handelt. Nachdem Sie Ihren Code kompiliert haben, können Sie überprüfen, ob Kompilierungsfehler aufgetreten sind. Sie verwenden den Rückgabewert von CompileAssemblyFromSource, bei dem es sich um ein CompilerResults -Objekt handelt. Dieses Objekt enthält eine Fehlerauflistung, die alle Fehler enthält, die während der Kompilierung aufgetreten sind.

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

Es gibt weitere Optionen zum Kompilieren, z. B. kompilieren aus einer Datei. Sie können auch eine Batchkompilierung durchführen, d. h., Sie können mehrere Dateien oder Quellen gleichzeitig kompilieren.

Beispiel für eine schrittweise Prozedur

  1. Erstellen Sie eine neue Visual C# .NET-Windows-Anwendung. Form1 wird standardmäßig erstellt.

  2. Fügen Sie form1 ein Button-Steuerelement hinzu, und ändern Sie dann dessen Text-Eigenschaft in Build.

  3. Fügen Sie form1 ein weiteres Button-Steuerelement hinzu, und ändern Sie dann die Text-Eigenschaft in Ausführen.

  4. Fügen Sie form1 zwei TextBox-Steuerelemente hinzu, legen Sie die Multiline-Eigenschaft für beide Steuerelemente auf True fest, und dimensionieren Sie diese Steuerelemente dann so, dass Sie mehrere Textzeilen in jede einfügen können.

  5. Öffnen Sie im Code-Editor die Form1.cs Quelldatei.

  6. Fügen Sie in der Form1 -Klasse den folgenden Klickhandler für Schaltflächen ein.

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

    Fügen Sie am Anfang der Datei die folgenden using Anweisungen hinzu:

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. Suchen Sie in Form1.cs den Form1 Konstruktor.

  8. Fügen Sie nach dem Aufruf InitializeComponent von im Form1 Konstruktor den folgenden Code hinzu, um den Schaltflächenklickhandler mit beiden Schaltflächen zu verknüpfen, die Sie Form1 hinzugefügt haben.

    public Form1()
    {
        InitializeComponent();
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Click += new System.EventHandler(this.button1_Click);
    }
    
  9. Führen Sie das Projekt aus. Klicken Sie nach dem Laden von Form1 auf die Schaltfläche Erstellen .

    Hinweis

    Sie erhalten einen Compilerfehler.

  10. Kopieren Sie als Nächstes den folgenden Text in das Textfeld, und ersetzen Sie dabei den vorhandenen Text:

    using System;
    namespace HelloWorld
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class HelloWorldClass
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                Console.ReadLine();
            }
        }
    }
    
  11. Klicken Sie erneut auf Erstellen . Die Kompilierung sollte erfolgreich sein.

  12. Klicken Sie auf Ausführen, um den Code zu kompilieren und die resultierende ausführbare Datei auszuführen. Die Kompilierung erstellt eine ausführbare Datei namensOut.exe, die im selben Ordner wie die ausgeführte Anwendung gespeichert wird.

    Hinweis

    Sie können den Code im Textfeld ändern, um verschiedene Compilerfehler anzuzeigen. Löschen Sie beispielsweise eines der Semikolons, und erstellen Sie den Code neu.

  13. Ändern Sie abschließend den Code im Textfeld, um eine weitere Textzeile im Konsolenfenster auszugeben. Klicken Sie auf Ausführen , um die Ausgabe anzuzeigen.

References