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
Erstellen Sie eine neue Visual C# .NET-Windows-Anwendung. Form1 wird standardmäßig erstellt.
Fügen Sie form1 ein Button-Steuerelement hinzu, und ändern Sie dann dessen Text-Eigenschaft in Build.
Fügen Sie form1 ein weiteres Button-Steuerelement hinzu, und ändern Sie dann die Text-Eigenschaft in Ausführen.
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.
Öffnen Sie im Code-Editor die Form1.cs Quelldatei.
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;
Suchen Sie in Form1.cs den
Form1
Konstruktor.Fügen Sie nach dem Aufruf
InitializeComponent
von imForm1
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); }
Führen Sie das Projekt aus. Klicken Sie nach dem Laden von Form1 auf die Schaltfläche Erstellen .
Hinweis
Sie erhalten einen Compilerfehler.
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(); } } }
Klicken Sie erneut auf Erstellen . Die Kompilierung sollte erfolgreich sein.
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.
Ä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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für