Freigeben über


Programmgesteuertes Kompilieren von Code mithilfe des C#-Compilers

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

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

Zusammenfassung

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 Codekompilierungsprogramme 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 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

.NET Framework stellt die ICodeCompiler Compilerausführungsschnittstelle 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 diese, 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 ihn zum Kompilieren des Quellcodes verwenden. Sie übergeben Parameter mithilfe der CompilerParameters Klasse an den Compiler. Hier ist 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 der Ort, an CompileAssemblyFromSource dem die Assembly kompiliert wird. Diese Methode verwendet 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 aus , der CompileAssemblyFromSourceein CompilerResults Objekt ist. 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. das Kompilieren aus einer Datei. Sie können auch die Batchkompilierung erstellen, was bedeutet, dass Sie mehrere Dateien oder Quellen gleichzeitig kompilieren können.

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

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

  2. Fügen Sie ein Schaltflächen-Steuerelement zu Form1 hinzu, und ändern Sie dann die Texteigenschaft in Build.

  3. Fügen Sie ein weiteres Schaltflächen-Steuerelement zu Form1 hinzu, und ändern Sie dann die Texteigenschaft in "Ausführen".

  4. Fügen Sie zwei TextBox-Steuerelemente zu Form1 hinzu, legen Sie die Mehrzeilige Eigenschaft für beide Steuerelemente auf "True" fest, und passen Sie dann die Größe dieser Steuerelemente an, damit Sie mehrere Textzeilen in die einzelnen Steuerelemente einfügen können.

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

  6. Fügen Sie in der Form1 Klasse den folgenden Schaltflächenklickhandler 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ä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 ".

    Notiz

    Sie erhalten einen Compilerfehler.

  10. Kopieren Sie als Nächstes den folgenden Text in das Textfeld, und ersetzen Sie dabei jeden 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", und der Code wird kompiliert und die resultierende ausführbare Datei ausgeführt. Die Kompilierung erstellt eine ausführbare Datei namens Out.exe, die im selben Ordner wie die Anwendung gespeichert wird, die Sie ausführen.

    Notiz

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

  13. Ändern Sie abschließend den Code im Textfeld so, dass eine andere Textzeile in das Konsolenfenster ausgegeben wird. Klicken Sie auf "Ausführen" , um die Ausgabe anzuzeigen.

References