Incorporamento del motore JavaScript in .NET [chiuso]


217

chiedo solo se qualcuno ha mai provato a incorporare e integrare effettivamente qualsiasi motore js nell'ambiente .net. Ho potuto trovare e effettivamente utilizzare (dopo MOLTO dolore e fatica, dato che è piuttosto obsoleto e non del tutto finito) progetto spidermonkey-dotnet. Qualcuno con esperienza in questo settore? Motori come SquirrelFish, V8 ..

Non che non sia soddisfatto dello Spidermonkey di Mozilla (usandolo per il miniframe simile a Rails per i componenti personalizzati all'interno dell'applicazione ASP.NET di base), ma mi piacerebbe comunque esplorare un po 'di più con le opzioni. Le soluzioni da riga di comando non sono ciò di cui avrei bisogno, non posso fare affidamento su nient'altro che CLR, ho bisogno di chiamare metodi da / a oggetti JavaScript / C #.

// 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 :)

Solo per chiarire: non sto cercando di programmare effettivamente l'applicazione stessa in javascript sul lato server. Viene utilizzato esclusivamente per la scrittura di applicazioni secondarie personalizzate dell'utente (può essere visto come una sorta di DSL). È molto più facile (e più sicuro) consentire alle persone normali di programmare in js che in C #.

Risposte:


98

Prova Javascript .NET . È ospitato su GitHub È stato originariamente ospitato su CodePlex, qui )

Discussioni sul progetto: http://javascriptdotnet.codeplex.com/discussions

Implementa Google V8. È possibile compilare ed eseguire JavaScript direttamente dal codice .NET con esso e fornire oggetti CLI da utilizzare anche con il codice JavaScript. Genera codice nativo da JavaScript.


+1. È semplice e sembra funzionare alla grande.
JC Inacio,

6
Ci sono affermazioni che questo è morto nei forum di discussione del progetto, la documentazione al di là di un esempio di base è scarsa e sto lottando per aggiungere un gestore di eventi JavaScript a un evento .Net con esso in uno script.
Alan Macdonald,

6
Noesis (società in via di sviluppo originale) ha perso interesse nel progetto, ma alla fine ha deciso di dare il controllo alla comunità. Di conseguenza ora è disponibile una nuova versione che include molte correzioni di bug. Purtroppo i callback JavaScript da .Net non sono ancora supportati.
Oliver Bock,

Un'altra nota per il futuro: sembra che il pacchetto Nuget sia in qualche modo corrotto ... al momento non "funziona" quando si installa il pacchetto.
Chris Pfohl,

3
Poiché javascriptdotnet è morto, considera invece l'utilizzo di ClearScript (vedi questa risposta )
JB. Con Monica.

86

L'interprete JavaScript open source Jint ( http://jint.codeplex.com ) fa esattamente quello che stai cercando.

Modifica:
il progetto è stato interamente riscritto ed è ora ospitato su Github all'indirizzo https://github.com/sebastienros/jint


6
Un'altra possibilità costruita sopra DLR: RemObjects Script per .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
aprilchild

Penso che sia scritto su Delphi Prism / Oxygen e fornito come codice sorgente, quindi se non hai acquistato una licenza per i prodotti di cui sopra non è così utile. Ho sbagliato? Se esiste una versione in forma binaria ovunque mi piacerebbe provarla.
Andrew Savinykh,

2
RemObjects Script è scritto in Oxygene, corretto, ma in realtà non hai bisogno di una licenza Oxygene per usarlo - per uno, puoi ottenere il programma di installazione binario da remobjects.com/free , per un altro potresti persino ottenere il compilatore gratuito della riga di comando Oxygene se dovevi ricostruirlo da solo, dalla fonte. Dopotutto, uno dei grandi vantaggi della piattaforma .NEt è l'indipendenza della lingua. non importa in quale lingua è scritta una biblioteca, per poterla usare.
Marc Hoffman,

1
Ultima versione nel 2011 ... Jurassic sembra migliore.
Roman Starkov,

3
Ultima versione nel 2014 in realtà: github.com/sebastienros/jint
Sébastien Ros - MSFT

54

Potresti anche essere interessato a Microsoft ClearScript che è ospitato su GitHub e pubblicato sotto la licenza Ms-Pl.

Non sono un fan di Microsoft, ma devo ammettere che il supporto V8 ha circa le stesse funzionalità di Javascript.Net e, cosa più importante, il progetto è ancora mantenuto. Per quanto mi riguarda, anche il supporto per i delegati funziona meglio che con Spidermonkey-dotnet.

ps: supporta anche JScript e VBScript ma non eravamo interessati a queste vecchie cose.

ps: è compatibile con .NET 4.0 e 4.5+


3
+1 Non ero assolutamente a conoscenza di questo progetto, sembra promettente, lascia sperare che non muoia come la maggior parte degli altri progetti che cercano di fare la stessa cosa!
Peter,

Una cosa che ho trovato diverso in ClearScript usando il motore Windows.JScript è che gli oggetti .net ora fanno distinzione tra maiuscole e minuscole, dove l'oggetto ScriptControl precedente non contava.
Brain2000,

Ecco il mio problema con ClearScript. Quando viene eseguito, si lamenta che mancano le DLL. Quindi mi viene chiesto di installare componenti extra di Visual Studio. Non è un problema, tranne che non avrò alcun privilegio di amministratore in cui eseguirò il codice. Sarebbe bello se fosse totalmente autonomo in una dll.
TatiOverflow il

38

Chiunque si sintonizzi, controlla anche Jurassic:

http://jurassic.codeplex.com/

modifica: questo è passato a github (e sembra attivo a prima vista)

https://github.com/paulbartrum/jurassic


3
Sembra che questo sia uno dei pochi progetti che ha sia il codice .NET nativo (invece di usare f.ex. il motore V8) e sembra ancora essere supportato (Ecmascript.net, jscript.net e molti altri sembrano essere morto). +1 e grazie per il link!
atlaste,

2
Dopo aver verificato ogni singolo progetto elencato in queste risposte, sono arrivato a Jurassic. È uno dei soli due o tre che sono ancora attivamente mantenuti, è vero JS, altamente testato ed è puro .NET.
Roman Starkov,

Aggiungerei il mio supporto per Jurassic. Ha anche la possibilità di serializzare lo stato di esecuzione del contesto di esecuzione. Ciò significa che puoi letteralmente mantenere il tuo runtime JavaScript, le variabili e tutto il resto. Funzionalità estremamente utile per alcuni casi.
Jerome Haltom,

Ciao wasabi, non sono riuscito a trovare nulla su come serializzare lo stato di esecuzione del contesto di esecuzione. Come ci sei riuscito?
Henning,


7

Immagino di non essere ancora chiaro su cosa stai cercando di fare, ma JScript.NET potrebbe valere la pena esaminarlo, sebbene Managed JScript sembra essere più appropriato per le tue esigenze (è più simile a JavaScript che a JScript.NET) .

Personalmente, ho pensato che sarebbe stato bello integrare V8 in qualche modo, ma non sono riuscito a scaricare il codice sorgente; vorrei avere il tempo di fare davvero qualcosa con esso.


attualmente Managed JScript è la cosa più vicina alle mie esigenze. Sapevo che era in Silverlight, non sapevo che fosse rilasciato. JScript.NET non è un'opzione. Non voglio davvero dare agli utenti l'accesso all'intero stack .NET. Ho solo bisogno di un paio di oggetti incorporati che possono usare per le loro applicazioni.
aprile

17
È il 2009 e Managed JScript è morto ora.
Alexander Abramov,

5

Se la lingua non è un problema (qualsiasi script con sandbox) allora c'è LUA per .NET . Anche la versione Silverlight di .NET framework è in formato sandbox afaik.


5

Dai un'occhiata a Javascript .NET su codeplex ( http://javascriptdotnet.codeplex.com/ ) con la versione 0.3.1 c'è alcune nuove piuttosto dolce caratteristiche che vi probly interessarti.

Guarda un codice di esempio:

// 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"));

Funziona con oggetti .Net. es: se ho una classe Employee posso passare l'oggetto a V8 e manipolare l'oggetto Employee da JavaScript?
Joy George Kunjikkuru,


5

Invece ho trovato una soluzione molto più semplice.

Ho costruito un .dll file usando Javascript e poi l'ho compilato usando il compilatore Javascript che è disponibile nel prompt dei comandi dello sviluppatore VS2013.

Una volta che abbiamo il .dllsemplicemente lo aggiungiamo al\Support cartella e quindi riferimento nel progetto che aveva bisogno di valutare le istruzioni Javascript.

Passaggi dettagliati per creare un .dll:

  1. Crea un file in Blocco note con solo questi contenuti:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
  2. Salva il file come C:\MyEval.js

  3. Apri un prompt dei comandi VS2005 (Start, Programmi, VS2005, Strumenti VS2005)

  4. Digita Cd\per arrivare aC:\

  5. genere

    jsc /t:library C:\MyEval.js
  6. Viene creato un nuovo file denominato MyEval.dll.

  7. Copia MyEval.dllnel progetto e fai riferimento (anche riferimento Microsoft.Jscript.dll).

  8. Quindi dovresti essere in grado di chiamarlo in questo modo:

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

objResult è True.


4

Ho appena provato RemObjects Script per .Net .

Funziona, anche se ho dovuto usare una factory statica ( var a=A.createA();) da JavaScript invece divar a=new A() sintassi. (La funzione ExposeType espone solo statica!) Non c'è molta documentazione e la fonte è scritta con Delphi Prism, il che è piuttosto insolito per me e per RedGate Reflector.

Così: facile da usare e da configurare, ma non di grande aiuto per scenari avanzati.

Anche dover installare qualcosa invece di rilasciare gli assembly in una directory è un aspetto negativo per me ...



2

C'è un'implementazione di un host ActiveX Scripting Engine in C # disponibile qui: analizzare ed eseguire JS da C #

Permette di usare Javascript (o VBScript) direttamente da C #, in processi nativi a 32-bit o 64-bit. La fonte completa è ~ 500 righe di codice C #. Ha solo una dipendenza implicita dalla DLL del motore JScript (o VBScript) installata.

Ad esempio, il seguente codice:

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

visualizzerà 1.66666666666667



1

credo che tutti i principali motori JS open source (JavaScriptCore, SpiderMonkey, V8 e KJS) forniscano API di incorporamento. L'unico che conosco direttamente è JavaScriptCore (che è il nome del motore JS in cui vive SquirrelFish) che fornisce un'API C pura. Se la memoria serve (è da un po 'che non uso .NET). NET ha un buon supporto per il collegamento nelle API C.

Onestamente non sono sicuro di come siano le API per gli altri motori, ma so che tutte le forniscono.

Detto questo, a seconda dei tuoi scopi JScript.NET potrebbe essere il migliore, poiché tutti questi altri motori richiedono di includerli con la tua app, poiché JSC è l'unico che viene effettivamente fornito con un sistema operativo, ma quel sistema operativo è MacOS: D


2
sì, tutti i principali motori sono generalmente incorporabili, ma ci sono semplicemente troppi ostacoli. studiando la guida all'incorporamento, imparando l'API C (++) .. speravo che ci fosse già qualche lavoro sull'integrazione fatto. JScript.NET non può essere utilizzato, il codice effettivo viene scritto ed eseguito dagli utenti di Internet.
aprile

1

So che sto aprendo un vecchio thread, ma ho lavorato molto su smnet (spidermonkey-dotnet). Negli ultimi anni Il suo obiettivo principale di sviluppo è stato l'incorporamento continuo di oggetti .net nel motore spidermonkey. Supporta un'ampia varietà di conversioni dai valori js agli oggetti .net. Alcuni di quelli tra cui delegati ed eventi.

Solo dicendo che potrebbe valere la pena di verificare ora che ci sia un certo sviluppo costante :). Tengo aggiornato il repository SVN con correzioni di bug e nuove funzionalità. I file della soluzione di origine e di progetto sono configurati per essere compilati correttamente al download. In caso di problemi durante l'utilizzo, sentiti libero di aprire una discussione.

Capisco il desiderio di avere una soluzione javascript gestita, ma di tutti i javascript gestiti che ho usato sono tutti carenti di alcune funzionalità chiave che li aiutano a renderli robusti e facili da usare. Io stesso aspetto che IronJS maturi un po '. Mentre aspetto, mi diverto a giocare con spidermonkey-dotnet =)

progetto spidermonkey-dotnet e pagina di download

Modifica: ha creato la pagina wiki della documentazione questo pomeriggio.


1

Prova ReoScript , un interprete JavaScript open source implementato in C #.

ReoScript rende l'applicazione in grado di eseguire JavaScript. Dispone di una vasta gamma di metron di estensione come SetVariable, Extension di funzioni, utilizzando il tipo CLR, .Net Event Binding e così via.

Ciao mondo:

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

Ed ecco un esempio di script che crea una winform e la mostra.

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

Utilizzare JSCRIPT.NET per ottenere una libreria (dll) di js. Quindi fai riferimento a questa dll nell'applicazione .NET e sei lì. FATTO!



0

V8.NET è un nuovo bambino sul blocco (da aprile 2013) che avvolge più da vicino la funzionalità del motore V8 nativo. Consente un maggiore controllo sull'implementazione.


-5

È possibile ora con ASP.Net MVC4 RazorView engine. il codice sarà questo:

// 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>

e Razornon è solo per MVC4 o altre applicazioni Web e puoi usarlo in applicazioni desktop offline.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.