Die kommenden Generationen von C# und Visual Basic

Wanted Roslyn (Teil 2)
Kommentare

C# in Zukunft interaktiv?
Skripte besitzen gegenüber kompilierten Programmen den kleinen Vorteil, dass sie jederzeit angepasst werden können. Entwickler größerer Geschäftsanwendungen können ihren

C# in Zukunft interaktiv?

Skripte besitzen gegenüber kompilierten Programmen den kleinen Vorteil, dass sie jederzeit angepasst werden können. Entwickler größerer Geschäftsanwendungen können ihren Anwendern über das zur Verfügungstellen einer Skriptsprache eine Möglichkeit bieten, Anpassungen am Arbeitsablauf vornehmen oder Regeln hinzufügen zu können. In der Vergangenheit besaßen Skriptsprachen aber den kleinen Nachteil, dass mit ihnen stets eine eigene Syntax einherging und sie weniger Möglichkeiten boten als C#.

Mit Roslyn wird es in Zukunft sehr einfach möglich sein, C# als interaktive Skriptsprache zu verwenden, da sich syntaktisch korrekte Befehlszeilen direkt ausführen lassen. Dass die neuen Möglichkeiten beinahe ein wenig am „Glaubensgrundsatz“ der C#-Programmierung rütteln, macht das Befehlszeilentool Rcsi.exe aus der Roslyn-CTP deutlich, das eine Textdatei mit C#-Code (im Rahmen der Roslyn-CTP erhält sie die Erweiterung .csx) Zeile für Zeile interpretiert ausführt. Bemerkenswert dabei ist, dass die „Skriptdatei“ nicht den typischen Aufbau eines C#-Programms besitzt, sondern einfach aus einer Aneinanderreihung von C#-Befehlen besteht. Bei einem englischen Visual Studio steht nach der Installation der Roslyn-CTP eine Vorlage mit dem Namen „Visual C# Script“ zur Auswahl. Eine „Inkarnation“ des C#-Interpreters ist das „C# interactive“-Fenster (Abb. 2), das nach der Installation der Roslyn-CTP im Ansicht-Menü von Visual Studio zur Verfügung steht (ein Visual-Basic-Pendant gibt es leider nicht, da die erforderlichen Klassen anscheinend nicht in der Roslyn-CTP enthalten sind). Auch wenn sich Microsoft in diesem Punkt noch sehr bedeckt hält, wäre es nicht ganz ausgeschlossen, dass ein interaktives Visual Basic eines Tages VBA in Microsoft Office ablösen könnte. Auch ein PowerShell-Ersatz wäre auf dieser Grundlage theoretisch denkbar, wenngleich die Stärke der PowerShell weniger in dem Umstand liegt, dass sie die Ausführung einzelner Befehle und von Skripten erlaubt, sondern dass dies auf der Grundlage einer Befehlspipeline geschieht.

Abb. 2: Das C#-interactive-Fenster erlaubt die direkte Ausführung von C#-Befehlen
Abb. 2: Das C#-interactive-Fenster erlaubt die direkte Ausführung von C#-Befehlen

Wie einfach sich ein „C#-Skripthost“ umsetzen lässt, macht ein kleines Beispiel deutlich, das in den Listings 3, 4 und 5 zu sehen ist (Abb. 3). Listing 3 zeigt die ScriptingHost-Klasse, die den C# Scripting Host repräsentiert. Neben dem Konstruktor, in dem die ScriptEngine-Klasse instanziiert wird, ist die Methode AppControl einen Hinweis wert, denn sie stellt einen individuellen Befehl dar, der im Rahmen des Scripting Hosts ausgeführt wird. Der Befehl gibt lediglich eine Instanz der AppControl-Klasse zurück, die wiederum eine Reihe von Aktionen als Methoden anbietet. Listing 4 zeigt die Klasse AppControl, die lediglich aus einer Reihe von „Dummy-Methoden“ besteht, die in der Praxis zum Beispiel eine Anwendung automatisieren oder im Rahmen einer Administratoranwendung Systembefehle darstellen könnten. Listing 5 enthält die Main-Methode, in der syntaktisch korrekte C#-Befehle über die Tastatur entgegengenommen und ausgeführt werden.

Abb. 3: Der C#-Skripthost führt C#-Befehle interaktiv aus
Abb. 3: Der C#-Skripthost führt C#-Befehle interaktiv aus

Ganz neu ist die Idee eines C#-Interpreters natürlich nicht, mit paxScript.NET gibt es seit Längerem ein Produkt, das als Assembly-DLL vorliegt und sowohl C#-Code (basierend auf C# 2.0) als auch VB.NET-Code ausführen kann. Auch das Open-Source-Framework Mono bietet bereits seit Längerem mit CsharpRep eine interaktive C#-Shell (sogar mit Autovervollständigung während der Eingabe). Die Möglichkeiten, die Microsoft über Roslyn zur Verfügung stellt, gehen jedoch deutlich weiter. Wer den Besuchern einer Webseite die Möglichkeit geben möchte, C#-Befehle einzugeben, die auf dem Server ausgeführt werden, kann dies mit wenig Aufwand realisieren (und dabei einschränken, dass nur bestimmte Befehle ausgeführt werden können).

Ausblick

Roslyn bietet ein großes Potenzial, keine Frage. Sowohl für Hersteller von Visual-Studio-Erweiterungen als auch für Entwickler, die ihren Anwendern die Möglichkeit geben wollen, die Anwendung auf der Basis einer Standardsprache skripten oder erweitern zu können. Wann und in welcher Form Roslyn in eine kommende Version von C# und Visual Basic einfließen wird, ist noch offen. Das betrifft auch die Frage, welche Pläne man in Redmond mit einer C#-Interpretersprache haben könnte. Die Roslyn-CTP zeigt zwar sehr schön, was alles möglich sein kann, weist aber noch viele weiße Flecken auf, insbesondere was die Unterstützung von C#-Sprachelementen angeht. Zudem ist die Unterstützung für C# in der CTP umfangreicher als für Visual Basic. Die CTP enthält neben Samples auch ein lesenswertes Whitepaper, das einen guten Überblick über die Ziele gibt, die sich Microosft mit der neuen Compiler-Technologie gesetzt hat.

Ein wenig irritierend ist der Umstand, dass es um Roslyn in den letzten Monaten wieder sehr ruhig geworden ist und auf die erste CTP keine weiteren Releases folgten. Das könnte eine einfache Erklärung haben: Bei Microsoft ist der Fokus aktuell komplett auf Windows 8 gerichtet, sodass andere Projekte keine allzu hohe Priorität besitzen dürften. Dass Roslyn Teil einer kommenden Version des .NET Framework sein wird, dürfte trotzdem als sicher gelten.

Listing 3: Die ScriptingHost-Klasse

public class ScriptingHost {
  private ScriptEngine engine;
  private Session session;

  public AppControl InitAktion(string UserName) {
  return new AppControl(UserName);
  }

  public ScriptingHost() {
    session = Session.Create(this);
    engine = new ScriptEngine(new Assembly[] {
    typeof(Console).Assembly,
    typeof(ScriptingHost).Assembly,
    typeof(IEnumerable<>).Assembly,
    typeof(IQueryable<>).Assembly},
    new string[] {
            "System",
           "System.Collections"
            }
            );
        }

   public object Execute(string code) {
    return engine.Execute(code, session);
  }

  public T Execute(string code) {
    return engine.Execute(code, session);
  }
}  
Listing 4: Die Klasse AppControl stellt eine Reihe individueller Aktionen zur Verfügung

public class AppControl {
  private string _UserName;

  public AppControl(string UserName) {
    _UserName = UserName;
  }

  public void Aktion1() {
     Console.WriteLine(_UserName + "führt Aktion 1 aus...");
  }

  public  void Aktion2() {
    Console.WriteLine(_UserName + "führt Aktion 2 aus...");
  }
}  
Listing 5: Der Einsprungspunkt des C#-Interpreters

static void Main(string[] args) {
  var host = new ScriptingHost();
  string BefehlsZeile = String.Empty;
  Console.WriteLine("Befehlszeile ist bereit - Abbruch mit 'q')");
  Console.Write(">");
  while ((BefehlsZeile = Console.ReadLine()) != "q") {
    try {
      var res = host.Execute(BefehlsZeile);
      if (res != null)
        Console.WriteLine(res.ToString());
       }
      catch (Exception ex) {
        Console.WriteLine("Fehler: " + ex.Message);
        }
        Console.Write(">");
}  

Peter Monadjemi ist freier Trainer mit dem Schwerpunkt PowerShell und .NET Framework, Entwickler und Buchautor und lebt in Esslingen am Neckar.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -