Montag, 8. September 2014

C# Code kompilieren

Im heutigen Post möchte ich zeigen, wie man mit C# C# Code kompilieren kann und somit zur Laufzeit quasi neue Programme erzeugen und ausführen kann.
Dies geht relativ einfach, unter anderem bietet .Net zum Beispiel die Klasse CodeDomProvider an, mit welcher direkt Code kompiliert werden kann. Mehr dazu kann auf MSDN nachgelesen werden, von dort habe ich auch das Beispiel entnommen.
Das folgende Programm kompiliert den in einer Textbox eingegebenen C# Code, erzeugt daraus eine .exe Datei und führt diese dann aus. Der Code sollte eigentlich selbsterklärend sein, ich liste ihn zuerst auf, und erkläre anschließend das Wichtigste. Es gibt 2 Textboxes, in der einen wird der Quellcode eingegeben, in der anderen das Kompilierergebnis (Erfolg oder die aufgetretenen Fehler) ausgegeben. Außerdem gibt es 2 Buttons, der eine kompiliert den Code, der andere führt das entstandene Programm aus:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO;
using System.CodeDom.Compiler;

namespace CodeCompiler
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void CompileExecutable(String[] sourceName)
        {
            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

            CompilerParameters cp = new CompilerParameters();

            cp.GenerateExecutable = true;
            cp.OutputAssembly = "Compiled.exe";
            cp.GenerateInMemory = false;
            cp.TreatWarningsAsErrors = false;

            CompilerResults cr = provider.CompileAssemblyFromSource(cp, sourceName);

            if (cr.Errors.Count > 0)
            {
                textBox2.Text = "Errors: " + Environment.NewLine;
                foreach (CompilerError ce in cr.Errors)
                {
                    textBox2.Text += ce.ToString() + Environment.NewLine;
                }
            }
            else
            {
                textBox2.Text = "Success";
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] SourceCode = new string[1];
            SourceCode[0] = textBox1.Text;
            CompileExecutable(SourceCode);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("Compiled.exe");
        }
    }
}

In der ersten Zeile der Funktion CompileExecutable() wird ein neuer Code Provider für C# erstellt. Danach werden 4 Kompilieroptionen festgelegt: Mittels GenerateExecutable = true teilen wir dem Programm mit, dass wir eine ausführbare Datei erstellen möchten und nicht, zum Beispiel, eine Klassenbibliothek. Über die nächsten Zeilen definieren wir, dass wir die Datei tatsächlich erzeugen möchten und legen den Ausgabepfad fest, außerdem die Behandlung von Warnungen.
Mittels CompileAssemblyFromSource() kompilieren wir schließlich den Code. Hierbei müssen wir die eben erzeugten Kompilierargumente übergeben und ein Array von Strings, welches die Quellcodes enthält - es können also mehrere Programme auf einmal kompiliert werden.
Anschließend wird die Anzahl der Fehler abgefragt und, falls diese größer 0 ist, werden die Fehler ausgegeben.
Mittels System.Diagnostics.Process.Start() wird dann einfach das erzeugte Programm gestartet.

Kommentare:

  1. Deine Tutorials sind echt super, weiter so! Aber kommt auch mal wieder was mit android? Ich fände es super wenn du ein Beispiel mit Datenbank-Einbindung mit ADO.NET machen könntest. LG

    AntwortenLöschen
  2. Hallo Oliver, könntest du ein Tutorial machen über Datenbanken in C#

    AntwortenLöschen