Einbetten der JavaScript-Engine in .NET [geschlossen]


216

Ich frage mich nur, ob jemals jemand versucht hat, eine js-Engine in die .net-Umgebung einzubetten und tatsächlich zu integrieren. Ich konnte finden und tatsächlich nutzt (nach einer LOT von Schmerz und Mühe, da es ziemlich veraltet ist und nicht ganz fertig) Spidermonkey-Dotnet - Projekt. Jemand mit Erfahrung in diesem Bereich? Motoren wie SquirrelFish, V8 ..

Nicht, dass ich mit Mozillas Spidermonkey (der es für Rails-ähnliche Miniframeworks für benutzerdefinierte Komponenten in der ASP.NET-Kernanwendung verwendet) nicht zufrieden bin, aber ich würde trotzdem gerne etwas weiter mit den Optionen arbeiten. Die Befehlszeilenlösungen sind nicht das, was ich brauche. Ich kann mich nur auf CLR verlassen. Ich muss Methoden von / zu JavaScript / C # -Objekten aufrufen.

// c# class
public class A
{
    public string Hello(string msg)
    {
        return msg + " whatewer";
    }
}

// js snippet
var a = new A();
console.log(a.Hello('Call me')); // i have a console.log implemented, don't worry, it's not a client-side code :)

Nur zur Klarstellung: Ich versuche nicht, die Anwendung selbst in serverseitigem Javascript zu programmieren . Es wird ausschließlich zum Schreiben von benutzerdefinierten Benutzerunteranwendungen verwendet (kann als eine Art DSL angesehen werden). Es ist viel einfacher (und sicherer), normalen Leuten das Programmieren in js als C # zu erlauben.

Antworten:


98

Versuchen Sie es mit Javascript .NET . Es wird gehostet von GitHub Es wurde ursprünglich auf CodePlex gehosteten, hier )

Projektdiskussionen: http://javascriptdotnet.codeplex.com/discussions

Es implementiert Google V8. Sie können damit JavaScript direkt aus .NET-Code kompilieren und ausführen und CLI-Objekte bereitstellen, die auch vom JavaScript-Code verwendet werden. Es generiert nativen Code aus JavaScript.


+1. Es ist einfach und scheint großartig zu funktionieren.
JC Inacio

6
Es gibt Behauptungen, dass dies in den Diskussionsforen des Projekts nicht mehr funktioniert, die Dokumentation über ein einfaches Beispiel hinaus schlecht ist und ich Probleme habe, einem .Net-Ereignis in einem Skript einen JavaScript-Ereignishandler hinzuzufügen.
Alan Macdonald

6
Noesis (ursprüngliches Entwicklungsunternehmen) verlor das Interesse an dem Projekt, beschloss jedoch schließlich, der Community die Kontrolle zu geben. Folglich gibt es jetzt eine neue Version, die viele Fehlerkorrekturen enthält. Leider werden JavaScript-Rückrufe von .Net noch nicht unterstützt.
Oliver Bock

Ein weiterer Hinweis für die Zukunft: Es scheint, dass das Nuget-Paket irgendwie kaputt ist ... es funktioniert derzeit nicht "nur", wenn Sie das Paket installieren.
Chris Pfohl

3
Da javascriptdotnet tot ist, sollten Sie stattdessen ClearScript verwenden (siehe diese Antwort )
JB. Mit Monica.

86

Der Open-Source-JavaScript-Interpreter Jint ( http://jint.codeplex.com ) macht genau das, wonach Sie suchen.

Bearbeiten:
Das Projekt wurde komplett neu geschrieben und wird jetzt auf Github unter https://github.com/sebastienros/jint gehostet


6
Eine weitere Möglichkeit, die auf dem DLR aufbaut: RemObjects Script für .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
Aprilkind

Ich denke, es ist auf Delphi Prism / Oxygen geschrieben und als Quellcode bereitgestellt. Wenn Sie also keine Lizenz für die oben genannten Produkte erworben haben, ist es nicht so nützlich. Liege ich falsch? Wenn es irgendwo eine Version in binärer Form gibt, würde ich sie gerne ausprobieren.
Andrew Savinykh

2
RemObjects Script ist in Oxygene geschrieben, richtig, aber Sie benötigen keine Oxygene-Lizenz, um es zu verwenden. Zum einen können Sie das binäre Installationsprogramm von remobjects.com/free herunterladen , zum anderen können Sie sogar den kostenlosen Oxygene-Befehlszeilen-Compiler herunterladen , wenn Sie mussten es selbst aus der Quelle neu erstellen. Einer der großen Vorteile der .NEt-Plattform ist schließlich die Sprachunabhängigkeit. Es spielt keine Rolle, in welcher Sprache eine Bibliothek geschrieben ist, damit Sie sie verwenden können.
Marc Hoffman

1
Letzte Veröffentlichung im Jahr 2011 ... Jurassic scheint besser zu sein.
Roman Starkov

3
Letzte Veröffentlichung im Jahr 2014 tatsächlich: github.com/sebastienros/jint
Sébastien Ros - MSFT

54

Möglicherweise interessieren Sie sich auch für Microsoft ClearScript , das auf GitHub gehostet und unter der Ms-Pl-Lizenz veröffentlicht wird.

Ich bin kein Microsoft-Fan, aber ich muss zugeben, dass die V8-Unterstützung ungefähr die gleichen Funktionen wie Javascript.Net hat, und was noch wichtiger ist, das Projekt wird weiterhin beibehalten. Für mich funktioniert die Unterstützung für Delegierte auch besser als mit Spidermonkey-dotnet.

ps: Es unterstützt auch JScript und VBScript, aber dieses alte Zeug hat uns nicht interessiert.

ps: Es ist kompatibel mit .NET 4.0 und 4.5+


3
+1 Ich war mir dieses Projekts überhaupt nicht bewusst, scheint vielversprechend zu sein. Hoffen wir, dass es nicht wie die meisten anderen Projekte stirbt, die versuchen, dasselbe zu tun!
Peter

Eine Sache, die ich in ClearScript mithilfe der Windows.JScript-Engine anders gefunden habe, ist, dass bei .net-Objekten jetzt zwischen Groß- und Kleinschreibung unterschieden wird, wobei das ältere ScriptControl-Objekt keine Rolle spielte.
Brain2000

Hier ist mein Problem mit ClearScript. Beim Ausführen wird beanstandet, dass DLLs fehlen. Dann werde ich gebeten, zusätzliche Visual Studio-Komponenten zu installieren. Das ist kein Problem, außer dass ich keine Administratorrechte habe, in denen ich den Code ausführen werde. Es wäre schön, wenn es in einer DLL völlig eigenständig wäre.
TatiOverflow

38

Jeder, der sich gerade einschaltet, schaut sich auch Jurassic an:

http://jurassic.codeplex.com/

edit: dies ist zu github übergegangen (und scheint auf den ersten blick aktiv zu sein)

https://github.com/paulbartrum/jurassic


3
Es scheint, dass dies eines der wenigen Projekte ist, das sowohl nativen .NET-Code enthält (anstatt f.ex. die V8-Engine zu verwenden) als auch weiterhin unterstützt zu werden scheint (Ecmascript.net, jscript.net und einige andere scheinen dies zu sein) tot). +1 und danke für den Link!
atlaste

2
Nachdem ich mir jedes einzelne Projekt angesehen habe, das in diesen Antworten aufgeführt ist, habe ich mich bei Jurassic angemeldet. Es ist eines von nur zwei oder drei, die noch aktiv gewartet werden. Es ist echtes JS, hoch getestet und reines .NET.
Roman Starkov

Würde meine Unterstützung für Jurassic hinzufügen. Es kann auch den Ausführungsstatus des Ausführungskontexts serialisieren. Das bedeutet, dass Sie Ihre JavaScript-Laufzeit, Variablen und alles buchstäblich beibehalten können. In einigen Fällen äußerst nützliche Funktion.
Jerome Haltom

Hallo wasabi, ich konnte nichts darüber finden, wie der Ausführungsstatus des Ausführungskontexts serialisiert werden kann. Wie haben Sie das erreicht?
Henning

8

Sie können ironJS ausprobieren, sieht vielversprechend aus, obwohl es sich in einer starken Entwicklung befindet. https://github.com/fholm/IronJS


Wir verwenden derzeit IronJS, aber es ist heutzutage ein totes Projekt und der Compiler ist in F # geschrieben, mit dem ich umgehen kann, das ich aber nicht beherrsche.
Russbischof

7

Ich denke, ich bin immer noch unklar, was Sie versuchen, aber JScript.NET könnte einen Blick wert sein, obwohl Managed JScript für Ihre Anforderungen besser geeignet zu sein scheint (es ähnelt eher JavaScript als JScript.NET). .

Persönlich dachte ich, es wäre cool, V8 irgendwie zu integrieren, aber ich bin nicht daran vorbei gekommen, den Quellcode herunterzuladen. Ich wünschte, ich hätte die Zeit, etwas damit zu tun.


Tatsächlich ist Managed JScript meinen Anforderungen am nächsten. Ich wusste, dass es in Silverlight war, wusste nicht, dass es veröffentlicht wurde. JScript.NET ist keine Option. Ich möchte Benutzern wirklich keinen Zugriff auf den gesamten .NET-Stack gewähren. Ich brauche nur ein paar integrierte Kernobjekte, die sie für ihre Anwendungen verwenden können.
Aprilkind

17
Es ist 2009 und Managed JScript ist jetzt tot.
Alexander Abramov

5

Wenn die Sprache kein Problem darstellt (ein Sandbox-Skript), gibt es LUA für .NET . Die Silverlight-Version des .NET-Frameworks ist ebenfalls afaik sandboxed.


5

Hey, schauen Sie nach Javascript .NET auf Codeplex ( http://javascriptdotnet.codeplex.com/ ) mit der Version 0.3.1. Es gibt einige ziemlich süße neue Funktionen, die Sie wahrscheinlich interessieren werden.

Schauen Sie sich einen Beispielcode an:

// Initialize the context
JavascriptContext context = new JavascriptContext();

// Setting the externals parameters of the context
context.SetParameter("console", new SystemConsole());
context.SetParameter("message", "Hello World !");
context.SetParameter("number", 1);

// Running the script
context.Run("var i; for (i = 0; i < 5; i++) console.Print(message + ' (' + i + ')'); number += i;");

// Getting a parameter
Console.WriteLine("number: " + context.GetParameter("number"));

Funktioniert dies für .NET-Objekte? Beispiel: Wenn ich eine Employee-Klasse habe, kann ich das Objekt an V8 übergeben und das Employee-Objekt über JavaScript bearbeiten?
Joy George Kunjikkuru


5

Ich habe stattdessen eine viel einfachere Lösung gefunden.

Ich habe eine .dllDatei mit Javascript erstellt und sie dann mit dem Javascript-Compiler kompiliert, der in einer VS2013-Entwickler-Eingabeaufforderung verfügbar ist.

Sobald wir das haben, .dllfügen wir es einfach dem \SupportOrdner hinzu und verweisen dann auf es im Projekt, das Javascript-Anweisungen auswerten musste.

Detaillierte Schritte zum Erstellen eines .dll:

  1. Erstellen Sie im Editor eine Datei mit nur folgenden Inhalten:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
  2. Speichern Sie die Datei unter C:\MyEval.js

  3. Öffnen Sie eine VS2005-Eingabeaufforderung (Start, Programme, VS2005, VS2005-Tools).

  4. Geben Sie ein Cd\, um zu gelangenC:\

  5. Art

    jsc /t:library C:\MyEval.js
  6. Eine neue Datei mit dem Namen wird erstellt MyEval.dll.

  7. Kopieren Sie MyEval.dllin das Projekt und referenzieren Sie es (auch Referenz Microsoft.Jscript.dll).

  8. Dann sollten Sie es so nennen können:

    Dim jScriptEvaluator As New EvalClass
    Dim objResult As Object
    objResult = jScriptEvaluator.Evaluate(“1==1 && 2==2”)

Ziel ist True.


4

Ich habe gerade RemObjects Script für .Net ausprobiert .

Es funktioniert, obwohl ich var a=A.createA();anstelle der var a=new A()Syntax eine statische Factory ( ) aus JavaScript verwenden musste . (Die ExposeType-Funktion macht nur Statik verfügbar!) Nicht viel Dokumentation und die Quelle ist mit Delphi Prism geschrieben, was für mich und den RedGate Reflector eher ungewöhnlich ist.

Also: Einfach zu bedienen und einzurichten, aber für fortgeschrittene Szenarien nicht viel Hilfe.

Auch etwas installieren zu müssen, anstatt nur die Assemblys in einem Verzeichnis abzulegen, ist für mich negativ ...



2

Hier ist eine Implementierung eines ActiveX Scripting Engine-Hosts in C # verfügbar: Analysieren und Ausführen von JS nach C #

Es ermöglicht die Verwendung von Javascript (oder VBScript) direkt aus C # in nativen 32-Bit- oder 64-Bit-Prozessen. Die vollständige Quelle sind ~ 500 Zeilen C # -Code. Es besteht nur eine implizite Abhängigkeit von der installierten JScript- (oder VBScript-) Engine-DLL.

Zum Beispiel der folgende Code:

Console.WriteLine(ScriptEngine.Eval("jscript", "1+2/3"));

zeigt 1.66666666666667 an



1

Ich glaube, alle wichtigen OpenSource-JS-Engines (JavaScriptCore, SpiderMonkey, V8 und KJS) bieten Einbettungs-APIs. Das einzige, mit dem ich tatsächlich direkt vertraut bin, ist JavaScriptCore (der Name der JS-Engine, in der SquirrelFish lebt), die eine reine C-API bereitstellt. Wenn Speicher zur Verfügung steht (es ist schon eine Weile her, seit ich .NET verwendet habe), unterstützt .NET die Verknüpfung in C-APIs recht gut.

Ich bin mir ehrlich gesagt nicht sicher, wie die APIs für die anderen Engines aussehen, aber ich weiß, dass sie alle von ihnen bereitgestellt werden.

Abhängig von Ihren Zwecken ist JScript.NET möglicherweise am besten geeignet, da Sie bei all diesen anderen Engines diese in Ihre App aufnehmen müssen, da JSC das einzige ist, das tatsächlich mit einem Betriebssystem geliefert wird, dieses Betriebssystem jedoch MacOS: D ist


2
Ja, alle wichtigen Motoren sind im Allgemeinen einbettbar, aber es gibt einfach zu viele Hindernisse. Ich habe gehofft, dass bereits einige Arbeiten zur Integration durchgeführt werden. JScript.NET kann nicht verwendet werden, der eigentliche Code wird von Internetbenutzern geschrieben und ausgeführt.
Aprilkind

1

Ich weiß, dass ich einen alten Thread öffne, aber ich habe viel an smnet (spidermonkey-dotnet) gearbeitet. In den letzten Jahren. Das Hauptaugenmerk der Entwicklung lag auf der nahtlosen Einbettung von .net-Objekten in die Spidermonkey-Engine. Es unterstützt eine Vielzahl von Konvertierungen von js-Werten in .net-Objekte. Einige davon, einschließlich Delegierte und Veranstaltungen.

Nur zu sagen, es könnte sich lohnen, jetzt nachzuschauen, da es eine stetige Entwicklung gibt :). Ich halte das SVN-Repo mit Fehlerkorrekturen und neuen Funktionen auf dem neuesten Stand. Die Quell- und Projektlösungsdateien sind so konfiguriert, dass sie beim Download erfolgreich erstellt werden. Wenn es Probleme bei der Verwendung gibt, können Sie gerne eine Diskussion eröffnen.

Ich verstehe den Wunsch nach einer verwalteten Javascript-Lösung, aber von allen verwalteten Javascript-Lösungen, die ich verwendet habe, fehlen ihnen einige wichtige Funktionen, die dazu beitragen, dass sie sowohl robust als auch einfach zu handhaben sind. Ich selbst warte darauf, dass IronJS ein wenig reift. Während ich warte, habe ich Spaß beim Spielen mit spidermonkey-dotnet =)

spidermonkey-dotnet Projekt und Download-Seite

Bearbeiten: Dokumentations-Wiki-Seite heute Nachmittag erstellt.


1

Probieren Sie ReoScript aus , einen in C # implementierten Open-Source-JavaScript-Interpreter.

Mit ReoScript kann Ihre Anwendung JavaScript ausführen. Es verfügt über eine Vielzahl von Erweiterungsmethoden wie SetVariable, Function Extension, CLR-Typ, .Net-Ereignisbindung usw.

Hallo Welt:

ScriptRunningMachine srm = new ScriptRunningMachine();
srm.Run(" alert('hello world!'); ");

Und hier ist ein Beispiel für ein Skript, das eine Winform erstellt und zeigt.

import System.Windows.Forms.*;        // import namespace

var f = new Form();                   // create form
f.click = function() { f.close(); };  // close when user clicked on form

f.show();                             // show 

0

Verwenden Sie JSCRIPT.NET, um eine Bibliothek (DLL) der js abzurufen. Verweisen Sie dann in Ihrer .NET-Anwendung auf diese DLL, und Sie sind einfach da. GETAN!



0

V8.NET ist ein neues Kind auf dem Block (Stand April 2013), das die native V8-Engine-Funktionalität genauer umschließt . Dies ermöglicht eine bessere Kontrolle über die Implementierung.


-5

Mit der ASP.Net MVC4 RazorView-Engine ist dies jetzt möglich . Der Code lautet wie folgt:

// c# class
public class A
{
    public string Hello(string msg)
    {
        return msg + " whatewer";
    }
}

// js snippet
<script type="text/javascript">
var a = new A();
console.log('@a.Hello('Call me')'); // i have a console.log implemented, don't worry, it's not a client-side code :)
</script>

und Razorist nicht nur für MVC4 oder andere Webanwendungen und Sie können es in Offline-Desktop-Anwendungen verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.