2. 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)
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.
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:
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.
19. 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
21. 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
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