RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
Robin Sedlaczek
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
 CTO der Fairmas GmbH in Berlin
 Community Leader DNUG Berlin
 Blogger / .NET Code Geek
 Sprecher
 MSDN Moderator
 Freier Autor
(Entwickler.de, Heise, DotNetPro, Informatik aktuell)
 Open Source
(SharpGL, Roslyn, FxCopAnalyzers, Force Feedback)
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# Scripting – Wozu das denn?
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING – WOZU DAS DENN?
 C# Script-Engine im eigenen Code
 Ermöglicht Ausführen von C# Code-Snippets
 Ganz einfach und zu jeder Zeit!
 Keine Solution, Projekte, Namespaces oder Klassen-Deklarationen nötig
 Nichts muss, alles kann
 Nur kompilierbar sollte es sein. 
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING – VORTEILE?
 Einfach einsetzbar
 Voller Sprachumfang und Komfort von C# nutzbar
 Typisiert !!
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING – NACHTEILE?
Nö!
 Doch:
Sicherheit ist ein Thema!
Ach ja, noch was: die Referenzen… 
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# Scripting - Übersicht
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - ÜBERSICHT
 Ermöglicht einfaches Ausführen von C# Code-Snippets, zu jeder Zeit
 Teil der Microsoft .NET Compiler Plattform („Roslyn“)
 https://github.com/dotnet/roslyn
 NuGet-Paket: Microsoft.CodeAnalysis.CSharp.Scripting (v1.3.2, Stand September 2016)
 http://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Scripting/1.3.2
 v2.0.0 zur Zeit in Preview/Beta-Status, kommt mit Visual Studio 15
 Momentan nur C# Scripting unterstützt
 VB.NET Scripting geplant, Roadmap aber ungewiss
 Min. Target Framework: .NET Framework 4.6
 .NET Core, .NET Native, UWP momentan nicht unterstützt
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - ÜBERSICHT
 Hinzufügen zur Solution oder zum Projekt mit
 NuGet Package Manager UI in Visual Studio oder
 NuGet Package Manager Console: Install-Package Microsoft.CodeAnalysis.CSharp.Scripting
 Namespace-Import: using Microsoft.CodeAnalysis.CSharp.Scripting
 Einstieg in die API bildet die statische Klasse CSharpScript:
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# Scripting - API
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Evaluieren von Skripten mit CSharpScript.EvaluateAsync():
 EvaluteAsync<T>() führt Skript aus und gibt Ergebnis zurück
 Ergebnis ist vom Typ Task<T> (im Beispiel Task<int>)
 CompilationErrorException wenn Typangabe nicht zu Ergebnistyp passt
 Nicht-generische Überladung führt implizite Typkonvertierung nicht durch
// Value of result will be 3 of explicit type int.
int result = await CSharpScript.EvaluateAsync<int>("1 + 2");
// Value of result will be 3 of type object.
object result = await CSharpScript.EvaluateAsync("1 + 2");
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Ausführen von Skripten mit CSharpScript.RunAsync():
 RunAsync<T>() führt Skript aus und kapselt Ergebnis in ScriptState<T>
 Ergebnis ist vom Typ Task<ScriptState<T>> (im Beispiel Task<ScriptState<int>>)
 CompilationErrorException wenn Typangabe nicht zu Ergebnistyp passt
 Nicht-generische Überladung führt implizite Typkonvertierung nicht durch, Ergebnistyp ist dann Task<ScriptState>
 ScriptState<T> kapselt Ergebnis und weitere Informationen über das Skript
// Variable result will contain return value 3 of explicit type int.
ScriptState<int> result = await CSharpScript.RunAsync<int>("1 + 2");
// Variable result will contain return value 3 of type object.
ScriptState<object> result = await CSharpScript.RunAsync("1 + 2");
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Skript-Ergebnisse auswerten – die Klasse ScriptState:
 ScriptState beinhaltet Laufzeitinformationen über das Skript
 Skript-Variablen und ihre Werte über Eigenschaft Variables abrufbar
 Skript-Rückgabewert über Eigenschaft ReturnValue abrufbar
 Ableitung ScriptState<T> typisiert ReturnValue mit generischem Typ
 Skript-Abstraktion über Eigenschaft Script abrufbar
var a = 5;
var b = 7;
return a + b;
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Skripte erzeugen und verwalten mit CSharpScript.Create():
var snippet =
@"
var a = 5;
var b = 7;
return a + b;
";
// Creates script with return type of int.
Script<int> script2 = CSharpScript.Create<int>(snippet);
// Creates script with return type of object.
Script script = CSharpScript.Create(snippet);
 CSharpScript.Create<T>() kapselt Code-Snippet in einer Instanz
der Klasse Script<T>
 Code-Snippet wird dabei aber nicht sofort ausgeführt
 Die Klasse Script<T> liefert Informationen und bietet viele
Funktionen für den Umgang mit Skripten
 Z.B. kann über die Eigenschaft ReturnType der Typ des
Rückgabewertes des Skriptes abgerufen werden
 Typparameter T bestimmt Rückgabetyp
 Nicht-generische Überladung gibt Instanz von Script<object>
zurück  Rückgabetyp ist dann object
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Umgang mit Skripten – die Klasse Script:
 ScriptState beinhaltet Laufzeitinformationen über das Skript
 erfüllt verschiedene Aufgaben, wie z.B. das Ausführen von Skripten zu späteren
Zeitpunkten, Fortführung von Skripten, Bereitstellung von Compiler-Informationen,
Bereitstellung von Kontext innerhalb von Skripten etc.
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
Visual Studio | C# Interactive
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# INTERACTIVE
 Ab Visual Studio 2015 Update 1
 REPL = read-eval-print-loop
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
Real World Example | Application Scripting
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
APPLICATION SCRIPTING
 eigene Anwendung Script-fähig machen
 C# als Script-Sprache verwenden
 Roslyn bietet dafür die C# Scripting API
Fallbeispiel ModelR
 Kollaboratives 3D Modelling Tool
 Client-Server-Anwendung (basierend auf SignalR)
 Integriertes Scripting mit der C# Scripting API
 Script-Editor mit Syntax Highlighting
 Ausgabe von Kompilierfehlern
 Live Script Execution beim Tippen
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
APPLICATION SCRIPTING
 Script erlaubt direkten Zugriff auf Anwendungsobjekte
 es können aber auch eigene Objekte erzeugt werden
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
APPLICATION SCRIPTING
 Nutzen für Benutzer
 Flexibilität – Anwendung kann in sich erweitert werden, ohne Neukompilierung durch den Benutzer
 Erweiterbarkeit – Anwendung kann von allen Benutzer beliebig erweitert werden
 Effektivität – komplexe wiederkehrende Prozesse können vom Benutzer automatisiert werden
 Anpassbarkeit – ein Nutzer kann sich die Anwendung nach seinen Vorstellungen/Vorgaben anpassen
 Nutzen für Entwickler
 Beliebige APIs können dem Scripting zur Verfügung gestellt werden
 APIs sind dann zur Anwendungslaufzeit verfügbar und können dort ausprobiert werden
 Kontextwechsel zwischen Kodieren und Programmausführung fällt weg
 Code kann dort geschrieben werden, wo er seine Auswirkung hat
 Direktes Feedback der Auswirkungen sichtbar
 Steigerung der Effizienz
 Reduktion von Entwicklungskosten
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
APPLICATION SCRIPTING
 ModelR - Code & HowTo
 WaveDev.ModelR von Robin Sedlaczek
 Quellcode ist Open Source auf GitHub: https://github.com/robinsedlaczek/ModelR
 Clonen, Kompilieren, Ausführen: WaveDev.ModelR.Server zuerst starten, danach WaveDev.ModelR
 4 vordefinierte ModelR-Benutzer: Robin (PW: robin), Sarah (PW: sarah), Jan (PW: jan), Sebastian (PW: sebastian)
 Script-Kontext über globale Eigenschaft „ModelR“ bereitgestellt
 Über den Script-Kontext kann auf die Anwendungsobjekte zugegriffen werden (Users, SceneObjects)
 Neue Objekte werden aus Script ausgelesen und automatisch in die Szene übernommen
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# Script in Action
„Und jetzt seid Ihr dran…“
RobinSedlaczek.wordpress.com
RobinSedlaczek
RobinSedlaczek@live.de

#ADC 2016 - C# Script in Action

  • 1.
  • 2.
    Robin Sedlaczek RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de  CTOder Fairmas GmbH in Berlin  Community Leader DNUG Berlin  Blogger / .NET Code Geek  Sprecher  MSDN Moderator  Freier Autor (Entwickler.de, Heise, DotNetPro, Informatik aktuell)  Open Source (SharpGL, Roslyn, FxCopAnalyzers, Force Feedback)
  • 3.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# Scripting –Wozu das denn? Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 4.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING –WOZU DAS DENN?  C# Script-Engine im eigenen Code  Ermöglicht Ausführen von C# Code-Snippets  Ganz einfach und zu jeder Zeit!  Keine Solution, Projekte, Namespaces oder Klassen-Deklarationen nötig  Nichts muss, alles kann  Nur kompilierbar sollte es sein. 
  • 5.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING –VORTEILE?  Einfach einsetzbar  Voller Sprachumfang und Komfort von C# nutzbar  Typisiert !!
  • 6.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING –NACHTEILE? Nö!  Doch: Sicherheit ist ein Thema! Ach ja, noch was: die Referenzen… 
  • 7.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# Scripting -Übersicht Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 8.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -ÜBERSICHT  Ermöglicht einfaches Ausführen von C# Code-Snippets, zu jeder Zeit  Teil der Microsoft .NET Compiler Plattform („Roslyn“)  https://github.com/dotnet/roslyn  NuGet-Paket: Microsoft.CodeAnalysis.CSharp.Scripting (v1.3.2, Stand September 2016)  http://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Scripting/1.3.2  v2.0.0 zur Zeit in Preview/Beta-Status, kommt mit Visual Studio 15  Momentan nur C# Scripting unterstützt  VB.NET Scripting geplant, Roadmap aber ungewiss  Min. Target Framework: .NET Framework 4.6  .NET Core, .NET Native, UWP momentan nicht unterstützt
  • 9.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -ÜBERSICHT  Hinzufügen zur Solution oder zum Projekt mit  NuGet Package Manager UI in Visual Studio oder  NuGet Package Manager Console: Install-Package Microsoft.CodeAnalysis.CSharp.Scripting  Namespace-Import: using Microsoft.CodeAnalysis.CSharp.Scripting  Einstieg in die API bildet die statische Klasse CSharpScript:
  • 10.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# Scripting -API Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 11.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Evaluieren von Skripten mit CSharpScript.EvaluateAsync():  EvaluteAsync<T>() führt Skript aus und gibt Ergebnis zurück  Ergebnis ist vom Typ Task<T> (im Beispiel Task<int>)  CompilationErrorException wenn Typangabe nicht zu Ergebnistyp passt  Nicht-generische Überladung führt implizite Typkonvertierung nicht durch // Value of result will be 3 of explicit type int. int result = await CSharpScript.EvaluateAsync<int>("1 + 2"); // Value of result will be 3 of type object. object result = await CSharpScript.EvaluateAsync("1 + 2");
  • 12.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Ausführen von Skripten mit CSharpScript.RunAsync():  RunAsync<T>() führt Skript aus und kapselt Ergebnis in ScriptState<T>  Ergebnis ist vom Typ Task<ScriptState<T>> (im Beispiel Task<ScriptState<int>>)  CompilationErrorException wenn Typangabe nicht zu Ergebnistyp passt  Nicht-generische Überladung führt implizite Typkonvertierung nicht durch, Ergebnistyp ist dann Task<ScriptState>  ScriptState<T> kapselt Ergebnis und weitere Informationen über das Skript // Variable result will contain return value 3 of explicit type int. ScriptState<int> result = await CSharpScript.RunAsync<int>("1 + 2"); // Variable result will contain return value 3 of type object. ScriptState<object> result = await CSharpScript.RunAsync("1 + 2");
  • 13.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Skript-Ergebnisse auswerten – die Klasse ScriptState:  ScriptState beinhaltet Laufzeitinformationen über das Skript  Skript-Variablen und ihre Werte über Eigenschaft Variables abrufbar  Skript-Rückgabewert über Eigenschaft ReturnValue abrufbar  Ableitung ScriptState<T> typisiert ReturnValue mit generischem Typ  Skript-Abstraktion über Eigenschaft Script abrufbar var a = 5; var b = 7; return a + b;
  • 14.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Skripte erzeugen und verwalten mit CSharpScript.Create(): var snippet = @" var a = 5; var b = 7; return a + b; "; // Creates script with return type of int. Script<int> script2 = CSharpScript.Create<int>(snippet); // Creates script with return type of object. Script script = CSharpScript.Create(snippet);  CSharpScript.Create<T>() kapselt Code-Snippet in einer Instanz der Klasse Script<T>  Code-Snippet wird dabei aber nicht sofort ausgeführt  Die Klasse Script<T> liefert Informationen und bietet viele Funktionen für den Umgang mit Skripten  Z.B. kann über die Eigenschaft ReturnType der Typ des Rückgabewertes des Skriptes abgerufen werden  Typparameter T bestimmt Rückgabetyp  Nicht-generische Überladung gibt Instanz von Script<object> zurück  Rückgabetyp ist dann object
  • 15.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Umgang mit Skripten – die Klasse Script:  ScriptState beinhaltet Laufzeitinformationen über das Skript  erfüllt verschiedene Aufgaben, wie z.B. das Ausführen von Skripten zu späteren Zeitpunkten, Fortführung von Skripten, Bereitstellung von Compiler-Informationen, Bereitstellung von Kontext innerhalb von Skripten etc.
  • 16.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de Visual Studio |C# Interactive Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 17.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# INTERACTIVE  AbVisual Studio 2015 Update 1  REPL = read-eval-print-loop
  • 18.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de Real World Example| Application Scripting Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 19.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de APPLICATION SCRIPTING  eigeneAnwendung Script-fähig machen  C# als Script-Sprache verwenden  Roslyn bietet dafür die C# Scripting API Fallbeispiel ModelR  Kollaboratives 3D Modelling Tool  Client-Server-Anwendung (basierend auf SignalR)  Integriertes Scripting mit der C# Scripting API  Script-Editor mit Syntax Highlighting  Ausgabe von Kompilierfehlern  Live Script Execution beim Tippen
  • 20.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de APPLICATION SCRIPTING  Scripterlaubt direkten Zugriff auf Anwendungsobjekte  es können aber auch eigene Objekte erzeugt werden
  • 21.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de APPLICATION SCRIPTING  Nutzenfür Benutzer  Flexibilität – Anwendung kann in sich erweitert werden, ohne Neukompilierung durch den Benutzer  Erweiterbarkeit – Anwendung kann von allen Benutzer beliebig erweitert werden  Effektivität – komplexe wiederkehrende Prozesse können vom Benutzer automatisiert werden  Anpassbarkeit – ein Nutzer kann sich die Anwendung nach seinen Vorstellungen/Vorgaben anpassen  Nutzen für Entwickler  Beliebige APIs können dem Scripting zur Verfügung gestellt werden  APIs sind dann zur Anwendungslaufzeit verfügbar und können dort ausprobiert werden  Kontextwechsel zwischen Kodieren und Programmausführung fällt weg  Code kann dort geschrieben werden, wo er seine Auswirkung hat  Direktes Feedback der Auswirkungen sichtbar  Steigerung der Effizienz  Reduktion von Entwicklungskosten
  • 22.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de APPLICATION SCRIPTING  ModelR- Code & HowTo  WaveDev.ModelR von Robin Sedlaczek  Quellcode ist Open Source auf GitHub: https://github.com/robinsedlaczek/ModelR  Clonen, Kompilieren, Ausführen: WaveDev.ModelR.Server zuerst starten, danach WaveDev.ModelR  4 vordefinierte ModelR-Benutzer: Robin (PW: robin), Sarah (PW: sarah), Jan (PW: jan), Sebastian (PW: sebastian)  Script-Kontext über globale Eigenschaft „ModelR“ bereitgestellt  Über den Script-Kontext kann auf die Anwendungsobjekte zugegriffen werden (Users, SceneObjects)  Neue Objekte werden aus Script ausgelesen und automatisch in die Szene übernommen
  • 23.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# Script inAction „Und jetzt seid Ihr dran…“ RobinSedlaczek.wordpress.com RobinSedlaczek RobinSedlaczek@live.de

Hinweis der Redaktion