18
C# Script in Action Robin Sedlaczek | CTO Fairmas GmbH | .NET User Group Berlin RobinSedlaczek RobinSedlaczek.wordpress.com [email protected]

BASTA! Spring 2017 - C# Script in Action

Embed Size (px)

Citation preview

Page 1: BASTA! Spring 2017 - C# Script in Action

C# Script in Action Robin Sedlaczek | CTO Fairmas GmbH | .NET User Group Berlin

RobinSedlaczek

[email protected]

Page 2: BASTA! Spring 2017 - C# Script in Action

Robin Sedlaczek

RobinSedlaczek

[email protected]

Fairmas GmbH Berlin (CTO) Community Leader DNUG Berlin Freier Autor (Windows Developer, Entwickler.de, Heise, DNP...) Open Source (ForceFeedback, Roslyn, SharpGL, FxCopAnalyzers...) Sprecher (BASTA!, .NET Summit, ParallelConf, DevOpenSpace, MDD...) Blogger / .NET Code Geek MSDN Moderator

Page 3: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]

Was sind Skriptsprachen?

Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH

Page 4: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected] SIND SKRIPTSPRACHEN?

Auch als „Glue“-Sprachen bezeichnet Fügen Dinge zusammen

Beispiele: Bash, Cmd, PowerShell TCL, LUA, Sleep, S-Lang, GNU Guile VBA, VBScript BPEL

Page 5: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected] SIND SKRIPTSPRACHEN?

Dynamische Typisierung PHP: Typen/Klassen ab Version 7 JavaScript: Klassen mit ECMAScript 6/2015 – ECMAScript 2016 ebenfalls

fertig TypeScript

Interpretiert zur Laufzeit, keine Kompilierphase PHP wird kompiliert vor der Ausführung ASM.JS, WebAssembly

Automatische Speicherverwaltung (automatische Speicherbereinigung)

Page 6: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected] SIND SKRIPTSPRACHEN?

Geeignet für kleine Aufgaben/Programme, nicht für große Systeme und Serveranwendungen (Wikipedia) NodeJS PHP

Und jetzt auch noch C# !

Page 7: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected] SIND SKRIPTSPRACHEN?

Skriptsprachen Kombinieren Dinge, wofür sie nicht gedacht

waren! Jede Sprache kann eine Skripsprache sein. Skripte werden quelloffen ausgeliefert.

Page 8: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]

Visual Studio | C# Interactive

Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH

Page 9: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]

C# Scripting - Übersicht

Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH

Page 10: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]# SCRIPTING - ÜBERSICHT

Ermöglicht einfaches Ausführen von C# Code zu jeder Zeit Teil der Microsoft .NET Compiler Plattform („Roslyn“)

https://github.com/dotnet/roslyn

NuGet-Paket: Microsoft.CodeAnalysis.CSharp.Scripting (v1.3.2) http://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Scripting/1.3.2 v2.0.0 kommt mit Visual Studio 2017

Min. Target Framework: .NET Framework 4.6+ (v1.3.2) .NET Core ab 1.1 (seit Roslyn v2.0.0-rc3) Universal Windows Application & .NET Native nicht unterstützt Momentan nur C# Scripting unterstützt

VB.NET Scripting geplant, Roadmap aber ungewiss

Page 11: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]# SCRIPTING - ÜBERSICHT

Hinzufügen zur Solution oder zum ProjektInstall-Package Microsoft.CodeAnalysis.CSharp.Scripting

Namespace-Import: using Microsoft.CodeAnalysis.CSharp.Scripting

Einstieg in die API bildet die statische Klasse CSharpScript:

Page 12: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]

C# Scripting - API

Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH

Page 13: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]# 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");

Page 14: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]# 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");

Page 15: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]# 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;

Page 16: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]# 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

Page 17: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]# 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.

Page 18: BASTA! Spring 2017 - C# Script in Action

RobinSedlaczek

[email protected]

C# Script in ActionHave Fun!

RobinSedlaczek.wordpress.comRobinSedlaczek

[email protected]