Laden...

C# / Mono um Scriptsprache erweitern

Erstellt von burli70 vor 6 Jahren Letzter Beitrag vor 6 Jahren 4.216 Views
B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren
C# / Mono um Scriptsprache erweitern

Ich möchte ein C# Projekt um eine Scriptsprache erweitern. Die Scripte sollen beim Start geladen und ausgeführt werden. Es soll möglich sein, von C# aus bestimmte Befehle aufzurufen.

Außerdem bräuchte ich die Möglichkeit, neue Befehle zu der Scriptsprache hinzuzufügen, die dann selbst in C# programmiert sind

Es kann eine einfache Scriptsprache wie Lua sein. Welche Möglichkeiten gibt es da?

Bisher gefunden hab ich Iron python, mit F# soll so was gehen und es gibt wohl C# Script.

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Ich habe gerade S# entdeckt. Die Sprache kannte ich bisher nicht, klingt aber nach einer Möglichkeit

Eine Sache ist besonders wichtig: die Scriptsprache sollte schnell sein. Ich bin ein wenig von LuaJIT verwöhnt, aber ich weiß auch, dass da keine andere Scriptsprache auch nur in die Nähe kommt.

W
195 Beiträge seit 2008
vor 6 Jahren

Da die .NET-Runtime unter anderem auch den C# Compiler enthält, kannst Du Deine 'Scripte' auch komplett in C# schreiben. Schau Dir hierzu mal die Klasse CodeDomProvider und da insbesondere die Methode CompileAssemblyFromSource an...

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Achso, dass geht auch. Wäre eine Möglichkeit. Muss mir mal Gedanken machen. Leider hab ich derzeit nur Internet via Handy, deshalb komm ich am PC nicht wirklich weiter

16.806 Beiträge seit 2008
vor 6 Jahren

3 Sekunden in Google mit den Worten "c# script" investieren und Du wärst binnen Sekunden auf https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples gestoßen.

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Bitte entschuldige, dass ich nach ".NET scripting" gesucht habe. Ich bin nicht davon ausgegangen, dass man mit C# scripten kann.

Der Link taucht da auch auf, aber so weit bin ich nicht gekommen. Ich habe halt nach einer Scriptsprache gesucht

Ich vergaß zu erwähnen dass es mit Mono laufen soll. Dieses Roslyn sieht nach .NET only aus. Oder wie kann man das in Mono installieren?

Edit: ich nehme das zurück. Habe gerade gesehen das mono-roslyn schon installiert ist

Jetzt muss ich leider nochmals nachhaken. Ich weiß nicht, wie ich das benutzen kann.

Erst mal mein System: ich habe Ubuntu 16.04 und ich habe Mono 5.0 über externe Pakete installiert. Darunter ist das Paket mono-roslyn 5.0.0.100-0xamarin4. Außerdem verwende ich Monodevelop 5.10

using Microsoft.CodeAnalysis.CSharp.Scripting; ergibt aber leider einen Fehler. Es gibt bereits CodeAnalysis nicht.

Über Pakete kann ich nichts zu dem Projekt hinzufügen, weil ich keine Internetverbindung habe und da nur in der nuget Gallery gesucht wird. In den Verweisen ist auch nichts zu finden.

Wo ist mein Fehler? Was muss ich tun, um die Scripting API nutzen zu können?

16.806 Beiträge seit 2008
vor 6 Jahren

Gut gemeinter Rat, aber wenn Du anständige Hilfe willst, dann stell die Frage auch so, dass man Dir helfen kann.
Ebenso les Dir das Zeug erstmal durch, bevor Du irgendwas sinnfrei rum probierst. Das kostet Dich und potentielle Helfer nur Zeit.
Du hast mit keinem Wort erwähnt, dass Du von Mono redest.
Da Du das verschwiegen und den Link wohl nicht richtig gelesen hast, hat Dich das nun ~2h gekostet.

Und nein, Microsoft.CodeAnalysis.CSharp.Scripting; gibts in Mono (noch) nicht; steht auch nicht in den unterstützten Plattformen in meinem Link.
Mit Mono wirste nicht viel Alternativen haben, evtl. scriptcs.

PS: in diesem Forum kann man Beiträge auch editieren.

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Ja, sorry. Ich Gurke hier gerade mit einem Smartphone und 2G Bandbreite rum. Ich nahm fälschlicherweise an, dass durch meine anderen Beiträge schon bekannt wäre, dass ich Mono verwende. Werde das mal in die Signatur schreiben, damit ich das nicht dauernd wiederholen muss

Ich bin inzwischen weiter. Es gibt das Scripting. Ich musste nur die DLL suchen und als Verweis hinzufügen. Code Completion findet es zumindest schon mal. Mehr mach ich heute aber nicht mehr

D
985 Beiträge seit 2014
vor 6 Jahren

Ich nahm fälschlicherweise an, dass durch meine anderen Beiträge schon bekannt wäre, dass ich Mono verwende.

Also ich führe nebenbei keine Statistik wer in welchen Fragen zu welcher Plattform etwas fragt um in anderen Fragen zu wissen, welche Plattform denn nun gemeint sein könnte.

Ich nahm (hoffentlich nicht fälschlicherweise) an, dass muss man auch nicht 😁

Bei einigen würde es auch schwierig, denn die sind auf mehreren Plattformen gleichzeitig unterwegs.

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Wie sieht es denn mit der Performance von C# Scripten aus? Ist das genauso schnell wie normaler C# Code?

Und wie ist das mit der Sicherheit? Kann man von einem Script alles was man in einem normalen C# Programm auch kann (vor allem Dateizugriffe und ähnliches) oder muss das vom Host zugelassen werden? Soweit ich das bisher verstanden habe kann man mit der #r Direktive beliebige Assemblies nachladen.

M
368 Beiträge seit 2006
vor 6 Jahren

Mono verwende. Werde das mal in die Signatur schreiben,

(offtopic) hierfür gibt es den passenderen Punkt "In welcher Entwicklungsumgebung entwickelst Du zur Zeit?" unter http://www.mycsharp.de/wbb2/usercp.php?action=profile_edit

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Danke, erledigt

S
248 Beiträge seit 2008
vor 6 Jahren

Wie sieht es denn mit der Performance von C# Scripten aus? Ist das genauso schnell wie normaler C# Code?

Ja, dieser ist so schnell wie C# Code. Er wird wie der "normale" Code vor der ersten Ausführung vom JIT kompiliert, d.h. der erste Aufruf ist minimal langsamer.

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Ich poste Mal ein paar Links, die ich gefunden und für hilfreich befunden habe

Roslyn-Based DSLs vs. Standard C# Scripts

Adding C# scripting to your development arsenal – Part 1

Using Roslyn to build a simple C# interactive script engine

Ich freue mich über jeden weiteren hilfreichen Link über C# Scripting, sei es Tutorial oder Codebeispiele

Hinweis von gfoidl vor 6 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 3.1

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 3.1

Ich hatte das vom Handy gepostet. Von da aus ist es etwas umständlich, den Text zu formatieren

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Du hast mit keinem Wort erwähnt, dass Du von Mono redest.

Doch, hab ich. Steht von Anfang an im Titel

Und nein, Microsoft.CodeAnalysis.CSharp.Scripting; gibts in Mono (noch) nicht; steht auch nicht in den unterstützten Plattformen in meinem Link.
Mit Mono wirste nicht viel Alternativen haben, evtl. scriptcs.

In Mono 5.0 wird Microsoft.CodeAnalysis.CSharp.Scripting; mitgeliefert. Jedenfalls gibt es hier das Verzeichnis /usr/lib/mono/msbuild/15.0/bin/Roslyn mit einer csi.exe und den entsprechenden DLL's darin. Ich habe in meiner Solution die DLL's zu den Referenzen hinzugefügt und folgenden Code geschrieben

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Scripting;
using Microsoft.CodeAnalysis.CSharp.Scripting;

namespace csscripting
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			Console.WriteLine("Hello World!");
			ScriptEngine();
		}

		private static async Task ScriptEngine()
		{
			object result = await CSharpScript.EvaluateAsync("1+2");
			Console.WriteLine(result);
		}
	}
}

Das Programm wird im Grunde ausgeführt. Monodevelop zeigt mir aber bei CSharpScript.EvaluateAsync einen Error an.

The type 'Task<>' is defined in an assemply that is not referenced. You must add a reference to assembly 'System.Threading.Tasks, Version 4.0.10.0, Culture=neutral, PublicKey Token=....'

Ich habe hier 7 System.Threading.Tasks.dll Dateien, ich weiß allerdings nicht, ob ich da eine bestimmte verwenden muss.

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Ich habe glaube ich endlich was gefunden, was das tut was ich möchte. Allerdings gibt es noch ein Problem, wenn man die Packages aktualisiert, aber das lässt sich lösen

ScriptCS Hosting Example

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo burli70,

ist https://github.com/filipw/dotnet-script was?

Gruss

Coffeebean

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

So wie ich das verstehe dient das ja nur dazu, um C# Scripte von der Kommandozeile zu starten. Ich will ja C# Scripte von einem compilierten C# Programm aus ausführen, also Script Hosting.

Ich denke, ScriptCS ist da schon das richtige. Ich muss es nur noch verstehen 😉

463 Beiträge seit 2009
vor 6 Jahren

Hi Burli70,

kleiner Tipp von meiner Seite: ich habe das Gefühl du verennst dich gerade etwas. Du fängst gerade an 1000 Ecken an - wie ich dir schon mal geschrieben habe: Fang doch erst mal mit einer Sache an und arbeite dich schrittweise vor. Ansonsten wird dein Spiel niemals fertig werden, da du über die Evaluierung nicht hinauskommen wirst...

Viele Grüße
Stefan

B
burli70 Themenstarter:in
57 Beiträge seit 2016
vor 6 Jahren

Jain. Du hast schon Recht, dass ich mich gerade mit mehreren Sachen befasse. Aber zum einen brauche ich für den Start auch schon mehrere Sachen und zum anderen schaue ich mir einiges zwar schon mal kurz an, befasse mich damit aber noch nicht wirklich.

Ich schaue mich zB nach einer Game Engine um, obwohl der Client noch in relativ weiter Ferne ist. Intensiv befassen tu ich mich damit aber noch nicht.

Aber Scripting ist ein wesentliches Element von dem, was ich vor habe. Mein Projekt ist kein eigentliches Spiel sondern nur ein Framework für Voxel Games. Das eigentliche Spiel soll komplett gescripted werden. Deshalb ist Host Scripting ein zentrales Element und die Performance ist deshalb auch so wichtig. Mit Python wäre das nicht möglich