Domanda

Qualcuno sa di reale (i .. non vaporware) implementazioni ECMAScript mira il .NET CLR / DLR ? Idealmente qualcosa come ciò che Rhino è per Java . Una porta solida di Rhino in esecuzione su .NET Framework / Mono quadro sarebbe perfetto.

ho visto solo una manciata di progetti citati, ma mai visto nessuno venire alla luce o, in realtà, tutto ciò che io abbia mai stato in grado di eseguire script. Ecco quello che so già:

  • MSScriptControl ActiveX Control : per quanto ne so, questo è stato ultimo vero implementaiton ECMAScript-compatibile di Microsoft (corre JScript 5.7). Ho integrato con MSScriptControl ma non considero interoperabilità COM di essere una risposta a questa domanda. x64 è un killer per questa opzione.

  • JScript.NET : non conto JScript.NET come potrebbe mai analizzare correttamente nessuno dei miei script reali. Sembra avere problemi con le chiusure.

  • Managed JScript : Suona come quello che voglio, ma sembra essere morto in acqua. E 'stato un esempio di implementazione importante per la DLR, ma poi impigliato con Silverlight e sembra aver sbiadita come una priorità dal 2007. fonti credibile sullo stato di questo sarebbe utile.

  • MyJScript : Costruito come un'implementazione tutorial per la DLR . Qualcuno sa come completa di un'implementazione questo è?

  • jint : interprete JavaScript per NET. Non di come ancora sostenere Currying o try - catch -. finally

  • RemObjects Script for .NET : An interessante concorrente ancora in lavorazione. Sono confuso dalla loro introduzione sul mercato, come a quello che sarà effettivamente, ma suona come potrebbe eventualmente essere una misura. Se qualcuno sa più su di esso che sarebbe utile pure.

  • V8 per NET : Questo sarebbe bello se qualcuno portato V8 a .NET. Per quanto ne so, non c'è un grande sforzo intorno a questa operazione. Il collegamento è a un'idea per la chiamata in essa da un wrapper gestito C ++.

Per fondo, voglio essere in grado di eseguire JavaScript dall'interno .NET; cioè caricare un insieme di script nel contesto e rimettere in tale contesto e recuperare i risultati di esecuzione. Attualmente mi salti mortali per usare MSScriptControl via ingombrante COM Interop. L'inconsistenza di COM rende veramente difficile per la distribuzione e garantire l'esecuzione coerente.

Mi piacerebbe essere in grado di eseguire ragionevolmente complessi test harness JavaScript dall'interno NET. Questo non è per la creazione di macro utente o semplici script molto piccoli; Ho bisogno di un vero e proprio ambiente di JavaScript come Rhino. Se l'applicazione è in esecuzione in cima al CLR (anziché COM) questo sarebbe davvero aiutare con alcuni dei problemi attuali.

È stato utile?

Soluzione

Al momento, ho modificato una versione del EcmaScript.NET dentro la mia YUICompressor.NET porta (progetto).

Se si afferra il codice sorgente da qui , ho incluso il mio codice modificato nel progetto, che è possibile fare riferimento. Questa è l'unica fonte di codice che ho trovato in .NET in grado di gestire javascript analisi, lato server.

Purtroppo, non riesco a ricordare come ho finalmente trovato. E 'stato un processo difficile, devo ammettere. Credo di aver trovato alcuni riferimenti Mozilla pagine dev qualche parte su Rhino (il codice Java), che mi ha portato a trovare che implimentation C # .NET.

ho dovuto modificarlo leggermente per la sincronizzazione con alcune modifiche i ragazzi YUI Compressor fatto a loro ramo di codice. Così il ramo modificato ho potrebbe non essere il migliore .. ma è la più vicina che ho visto al ramo originale Java.

Il codice originale c # per EcmaScript.NET non è stato toccato dal 2007 ... almeno per la pagina di download.

Forse questo potrebbe aiutare ??

HTH.

Altri suggerimenti

Ancora Circa vivo:

  • Jurassic (Aveva un commit nel corso dell'ultimo anno.)
  • jint (attualmente in corso le richieste di pull.)

Altri progetti, la maggior parte morti:

Crazy Metodo:

  • Rhino oltre IKVM (menzionato nei commenti, ma ecco un link per ulteriori informazioni a farlo.)

Nessuno ha menzionato http://jurassic.codeplex.com/ Non so quanto è buono in generale (performance, usabilità, ecc) ma almeno analizza belle script complessi (altre implementazioni non lo fanno) e supporta ECMAScript 5 spec. Ho appena aggiungo il link qui per riferimento.

Nessuno ha menzionato ClearScript, quindi ClearScript .

Non è un'implementazione; si tratta di un wrapper di interoperabilità che supporta V8, JScript e VBScript, con una bella API per chiamare in loro dal codice .NET.

Esempio di codice dalla pagina CodePlex:

using System;
using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;

// create a script engine
using (var engine = new V8ScriptEngine())
{
    // expose a host type
    engine.AddHostType("Console", typeof(Console));
    engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)");

    // expose a host object
    engine.AddHostObject("random", new Random());
    engine.Execute("Console.WriteLine(random.NextDouble())");

    // expose entire assemblies
    engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core"));
    engine.Execute("Console.WriteLine(lib.System.DateTime.Now)");

    // create a host object from script
    engine.Execute(@"
        birthday = new lib.System.DateTime(2007, 5, 22);
        Console.WriteLine(birthday.ToLongDateString());
    ");

    // use a generic class from script
    engine.Execute(@"
        Dictionary = lib.System.Collections.Generic.Dictionary;
        dict = new Dictionary(lib.System.String, lib.System.Int32);
        dict.Add('foo', 123);
    ");

    // call a host method with an output parameter
    engine.AddHostObject("host", new HostFunctions());
    engine.Execute(@"
        intVar = host.newVar(lib.System.Int32);
        found = dict.TryGetValue('foo', intVar.out);
        Console.WriteLine('{0} {1}', found, intVar);
    ");

    // create and populate a host array
    engine.Execute(@"
        numbers = host.newArr(lib.System.Int32, 20);
        for (var i = 0; i < numbers.Length; i++) { numbers[i] = i; }
        Console.WriteLine(lib.System.String.Join(', ', numbers));
    ");

    // create a script delegate
    engine.Execute(@"
        Filter = lib.System.Func(lib.System.Int32, lib.System.Boolean);
        oddFilter = new Filter(function(value) {
            return (value & 1) ? true : false;
        });
    ");

    // use LINQ from script
    engine.Execute(@"
        oddNumbers = numbers.Where(oddFilter);
        Console.WriteLine(lib.System.String.Join(', ', oddNumbers));
    ");

    // call a script function
    engine.Execute("function print(x) { Console.WriteLine(x); }");
    engine.Script.print(DateTime.Now.DayOfWeek);

    // examine a script object
    engine.Execute("person = { name: 'Fred', age: 5 }");
    Console.WriteLine(engine.Script.person.name);
}

Si può dare un'occhiata a jint ( http://jint.codeplex.com ) che è un open-source ECMAScript interprete.

Aggiorna

Di recente riscritto versione disponibile su Github a https://github.com/sebastienros/jint

Si dovrebbe cercare Javascript .NET ( http://javascriptdotnet.codeplex.com/ ) su CodePlex. Hanno avvolto V8 con gestita C ++ e quindi è possibile utilizzare questa libreria con un'applicazione .NET e funziona come un fascino. La open source offre alcuni piuttosto buone caratteristiche se mi chiedete.

Saluti.

È possibile utilizzare Jscript.net e sarà effettivamente lavorare con arbitrario codice javascript; Hai solo bisogno di disattivare la "modalità veloce" di compilazione con jsc /fast- bar.js

Non ho ancora testato questo; Ho appena notato che durante la lettura questo post e capito sarebbe un'altra soluzione ragionevole. MSDN ha la documentazione per questa opzione e quali sono i limiti se non ne fanno uso .

V8.NET

Questo è probabilmente il migliore che abbia mai incontrato ancora
https:. //V8dotnet.codeplex .com / documentazione

Inoltre la sua state costruite fin dall'inizio con una porta Mono in mente. Ti dà il pieno controllo del potere del motore V8 da codice gestito.

Io preferisco jint piuttosto che il altri.

jint può essere lento, ma è facile da mettere a punto e di interagire le proprie classi .NET. (E 'difficile impostare [ComVisile] attributi ogni volta per jscript.dll ecc).

In termini di filettatura, jint e il lavoro Jurassic come mi aspettavo. Per poter lavorare con il motore JScript o Google V8, si deve prestare attenzione al problema UI-threading.

Tuttavia, jint è fuori-datato in qualche aspetto, perché ho difficoltà a compilare JQuery 1.5 o versione successiva.

Spero Jurassic può rimuovere il limite di attaccare la propria classe di lavorare con la creazione 'AllowBob'sCLRClass=true'.

devo riscrivere l'intera classe. E 'difficile ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top