Programmgesteuertes Kompilieren von Code mithilfe des C#-Compilers

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

Originalversion des Produkts:   Visual Studio, .NET Framework
Ursprüngliche KB-Nummer:   304655

Zusammenfassung

Die Microsoft .NET Framework macht Klassen verfügbar, mit denen Sie programmgesteuert auf den C#-Sprachcompiler zugreifen können. Dies kann hilfreich sein, wenn Sie eigene Codekompilierungshilfsprogramme 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 nur die ausführbare Datei erstellen oder die ausführbare Datei erstellen und ausführen. Alle Fehler, die während des Kompilierungsprozesses 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#-Codegenerators und -Codecompilers. Der folgende Beispielcode erstellt eine Instanz von CSharpCodeProvider und verwendet sie, um einen Verweis auf eine ICodeCompiler Schnittstelle abzurufen.

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

Sobald Sie einen Verweis auf eine ICodeCompiler Schnittstelle haben, können Sie sie zum Kompilieren des Quellcodes verwenden. 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);

Der obige Code verwendet das CompilerParameters Objekt, 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 ist CompileAssemblyFromSource der Ort, an dem die Assembly kompiliert wird. Diese Methode übernimmt das Parameterobjekt und den Quellcode, bei dem es sich um eine Zeichenfolge handelt. Nachdem Sie den 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 für die Kompilierung, z. B. das Kompilieren aus einer Datei. Sie können auch batchkompilieren, was bedeutet, dass Sie mehrere Dateien oder Quellen gleichzeitig kompilieren können.

Schritt-für-Schritt-Verfahren (Beispiel)

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

  2. Fügen Sie formular1 ein Schaltflächensteuerelement hinzu, und ändern Sie dann dessen Text-Eigenschaft in "Erstellen".

  3. Fügen Sie formular1 ein weiteres Schaltflächensteuerelement hinzu, und ändern Sie 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 legen Sie dann die Größe dieser Steuerelemente fest, sodass Sie mehrere Textzeilen in jedes Steuerelement einfügen können.

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

  6. Fügen Sie in der Form1 Klasse den folgenden Klickhandler für die Schaltfläche 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 des Form1 Konstruktors den folgenden Code hinzu, um den Schaltflächen-Klickhandler mit beiden Schaltflächen zu verknüpfen, die Sie zu 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, indem Sie vorhandenen Text ersetzen:

    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 namens Out.exe, die in demselben Ordner wie die Anwendung gespeichert wird, die Sie ausführen.

    Hinweis

    Sie können den Code im Textfeld ändern, um unterschiedliche Compilerfehler anzuzeigen. Löschen Sie z. B. einen der Semikolons, und erstellen Sie den Code neu.

  13. Ändern Sie schließlich den Code im Textfeld, um eine weitere Textzeile in das Konsolenfenster auszugeben. Klicken Sie auf "Ausführen ", um die Ausgabe anzuzeigen.

References