Die .Net-CLR als Makro-Baukasten

Vereinfachung

Sie können es sich also ganz einfach machen und dem auszuführenden Programm auch noch seinen Dateinamen übergeben. Denn dann können Sie einfach das an css übergebene Array an das auszuführende Programm weiterreichen:

results.CompiledAssembly.EntryPoint.Invoke(null, new object[] { args });

Auch an dieser Stelle ist ein Test hilfreich: Entfernen Sie zunächst den Fehler aus test.cs, und ändern Sie das Skript dann so, dass es die übergebenen Argumente verwendet. Zum Beispiel so:

if (args.Length != 0)
{
Console.WriteLine( args[1] );
}

Wenn Sie das Programm nun per css test.cs „Hello World“ aufrufen, zeigt das Script den Text „Hello World“ an. Damit ist schon recht viel gewonnen: Sie können direkt auf der Kommandozeile Skripte ausführen, die in C# programmiert sind.

Dabei haben Sie Zugriff auf die komplette .Net-Klassenbibliothek. Zumindest in der Theorie. Denn wenn Sie in der Praxis nun die Zeile Console.WriteLine() durch einen Aufruf von MessageBox auswechseln, dann passiert etwas Ärgerliches:

global::System.Windows.Forms.MessageBox.Show( “Hello World” );

Das Programm kann nicht länger übersetzt werden. Der Grund: Der Compiler weiß nichts von Windows.Forms. Woher auch – schließlich übergibt das Programm ja auch keinerlei Informationen über diesen Teil der Klassenbibliothek an den Compiler. Sie benötigen also noch einen Mechanismus zur Übergabe von referenzierten Assemblies an den Compiler.