Scripting mit C#

Der neue C# Compiler bzw. die .NET Compiler Platform Roslyn bietet eine C# Scripting API an. Diese Scripting API ermöglicht das erstellen von Scripts mit C# und das ausführen von C# in einem “Interactive Window” (REPL – Read–eval–print loop).

Bei der Umsetzung wurde dasselbe Konzept wie bei F# (F# Interactive) verwendet.

Element F# C#
REPL im Visual Studio F# Interactive C# Interactive
REPL Executable fsi.exe csi.exe
Script File extension .fsx .csx

Das “C# Interactive”-Window von Visual Studio 2015 beziehungsweise das Executable csi.exe ermöglicht es on the fly C# Code auszuführen. Vorbei sind die Zeiten in welchen man ein Konsolen-Projekt (oder Unit Test) anlegen musste um eine API zu erkunden. Dieser Artikel konzentriert sich jedoch auf C# Scripts, also csx Files.

CSharp Interactive

In einem C# Script können alle C# 6 und .NET Framework Features verwendet werden. Das heisst, in einem csx File können z.B. auch Klassen definiert werden. Im einfachsten Fall soll jedoch der enthaltene Code einfach Zeile für Zeile ausgeführt werden. Das ist ebenfalls möglich. Es bedarf keiner speziellen Struktur (z.B. Main-Methode). Der enthaltene Code wird von oben nach unten ausgeführt. Wird also ein csx File mit dem Inhalt Console.WriteLine(“Hello World”); ausgeführt, so schreibt das Script “Hello World” in die Konsole.

In einem C# Script gibt es auch die Möglichkeit beliebige .NET Assemblies über die “#r” direktive zu laden. Dadurch wird es möglich jede beliebige .NET Library in einem C# Script zu verwenden. .NET Framework Libraries können dabei unter Eingabe des des Namens geladen werden. Für 3rd Party Assemblies muss der ganze Pfad angegeben werden. Per default sind die folgenden Namespaces bereits importiert:

  • System;
  • System.Collections.Generic;
  • System.Linq;
  • System.Text;

Bekanntlich sagt Code mehr als tausend Worte, deshalb folgt ein Beispiel Script. Dieses Script Lädt die DLL “Microsoft.Web.Administration” welche benützt werden kann um mit dem IIS zu interagieren. Der wird Benutzer nach dem Namen, Pfad und Port für das neue Web gefragt. Ein neuer ApplicationPool mit dem Namen “Test” und das Web werden angelegt.

#r "Microsoft.Web.Administration"
using Microsoft.Web.Administration;

string name = Ask("name?");
string path = Ask("path?");
int port = int.Parse(Ask("port?"));

using(var serverManager = new ServerManager())
{
    var applicationPool = serverManager.ApplicationPools.Add("Test");
    applicationPool.AutoStart = true;
    applicationPool.ManagedRuntimeVersion = "v4.0";
    serverManager.CommitChanges();

    Site site = serverManager.Sites.Add(name, path, port);
    site.ServerAutoStart = true;
    site.ApplicationDefaults.ApplicationPoolName = applicationPool.Name;
    serverManager.CommitChanges();
}

private static string Ask(string question)
{
    Console.WriteLine(question);
    return Console.ReadLine();
}

Um ein C# Scripts auszuführen wird das csi.exe Executable benötigt. Ist das Visual Studio 2015 installiert, steht dieses über das Developer Command Prompt oder unter “C:\Program Files (x86)\MSBuild\14.0\bin\csi.exe” zur Verfügung. Ausgeführt wird das Script wie folgt: csi “C:\myPath\myScript.csx“.

One thought on “Scripting mit C#

  1. Hannes Zbinden

    Hoi Marc

    Super Sache! 🙂
    Danke für’s Tutorial!
    Eine mögliche Alternative ist dieses Projekt hier: http://scriptcs.net , welches auch auf Roslyn aufbaut…
    Dies hat den Vorteil, dass es unabhängig von VisualStudio, bzw. MSBuild ist: z.B. als PowerShell-Alternative/Ergänzung auf einem Server, etc.

    Gruss
    Hannes

    Reply

Leave a Reply

Your email address will not be published.