¿Hay any.NET ¿Implementaciones CLR / DLR de ECMAScript?


¿alguien sabe de real (i.. no vaporware) implementaciones de ECMAScript dirigidas a . NET CLR/DLR? Idealmente algo como qué es Rhino para Java. Un puerto sólido de Rhino que se ejecute en. NET Framework / Mono Framework sería perfecto.

Solo he visto un puñado de proyectos mencionados, pero nunca he visto ningún salir a la luz o en realidad cualquier cosa que he sido capaz de ejecutar script en. Esto es lo que sé sobre ya:

  • MSScriptControl Control ActiveX: AFAIK, esta fue la última implementación real compatible con ECMAScript de Microsoft (ejecuta JScript 5.7). He integrado con MSScriptControl pero no considero COM interop para ser una respuesta a esta pregunta. x64 es un asesino para esta opción.

  • JScript.NET: Yo no cuento JScript.NET ya que nunca pudo analizar con éxito ninguno de mis guiones reales. Parece tener problemas con cierre.

  • JScript administrado: Suena como lo que quiero pero parece estar muerto en el agua. Fue un ejemplo importante de implementación para el DLR, pero luego se enredó con SilverLight y parece haberse desvanecido como una prioridad desde 2007. Sería útil contar con fuentes fidedignas sobre el estado de esta cuestión.

  • MyJScript: Construido como una implementación tutorial para el DLR. Cualquiera sabe lo completa de una implementación de este es?

  • Jint: El intérprete de JavaScript para. NET. Todavía no soporta Currying o try-catch-finally.

  • RemObjects Script para. NET: Un contendiente interesante todavía en las obras. Estoy confundido por su marketing en cuanto a lo que realmente será, pero suena como que eventualmente podría ser un ajuste. Si alguien sabe más al respecto, eso también sería útil.

  • V8 para. NET: Esto sería genial si alguien portó V8 a. NET. Por lo que sé, tampoco hay un gran esfuerzo en torno a esto. El enlace es a una idea para llamar a ella desde un contenedor de C++ administrado.

Para el fondo, quiero ser capaz de ejecutar JavaScript desde.NET; es decir, cargar un conjunto de scripts en contexto y llamar a ese contexto y recuperar los resultados de la ejecución. Actualmente salto a través de aros para utilizar MSScriptControl a través de engorroso COM Interop. La inconsistencia de las es realmente difícil para la implementación y garantizar una ejecución consistente.

Me gustaría poder ejecutar arneses de prueba de JavaScript razonablemente complejos desde dentro de .NET. Esto no es para crear macros de usuario o simples scripts pequeños; necesito un entorno JavaScript real como Rhino. Si la implementación se ejecutara sobre el CLR (en lugar de COM), esto realmente ayudaría con algunos de los problemas actuales.

Author: Community, 2009-07-02

9 answers

Actualmente, he modificado una versión del EcmaScript.NET dentro de mi YUICompressor.NET puerto (proyecto).

Si tomas el código fuente desde aquí, he incluido mi código modificado en el proyecto, al que puedes hacer referencia. Esta es la única fuente de código que he encontrado en.NET que puede manejar el análisis de javascript, lado del servidor.

Desafortunadamente, no puedo recordar cómo finalmente lo encontré. Fue un proceso difícil, debo admitir. Creo que encontré algunas referencias Mozilla dev páginas en algún lugar sobre Rhino (el código java) que me llevó a encontrar que la implimentación C#. NET.

Tuve que modificarlo ligeramente para sincronizar con algunos cambios que los chicos de YUI Compressor hicieron a su rama de código. Así que la rama modificada que tengo podría no ser la mejor .. pero es lo más cercano que he visto a la rama Java original.

El código original de c # para EcmaScript.NET no ha sido tocado desde 2007 ... al menos para la página de descargas.

Tal vez esto podría ayuda??

HTH.

 17
Author: Pure.Krome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-03 00:28:28

Nadie ha mencionado jurásico http://jurassic.codeplex.com/ No sé lo bueno que es en general (rendimiento, usabilidad, etc.), pero al menos analiza scripts bastante complejos (otras implementaciones no lo hacen) y soporta ECMAScript 5 spec. Solo añado el enlace aquí para referencia.

 12
Author: AC.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-21 15:58:06

Todavía más o menos vivo:

  • Jurassic (Tuvo un commit en el último año.)
  • Jint (actualmente tomando pull requests.)

Otros Proyectos, En Su Mayoría Muertos:

Método loco:

  • Rhino sobre IKVM (Mencionado en los comentarios, pero aquí hay un enlace para obtener más información sobre cómo hacerlo.)
 11
Author: Sean McMillan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-27 15:08:24

Nadie ha mencionado ClearScript, así que ClearScript.

No es una implementación; es un envoltorio interop que soporta V8, JScript y VBScript, con una API realmente agradable para llamar a ellos desde código.NET.

Ejemplo de código de la página 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);
}
 7
Author: Mark Rendle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-20 11:35:56

Puedes echar un vistazo a Jint ( http://jint.codeplex.com ) que es un intérprete ECMAScript de código abierto.

Actualización

Nueva versión reescrita disponible en Github en https://github.com/sebastienros/jint

 7
Author: Sébastien Ros - MSFT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-06 19:46:17

Deberías probar Javascript. NET ( http://javascriptdotnet.codeplex.com / ) en Codeplex. Envolvieron v8 con C++ administrado y luego puede usar esta biblioteca con una aplicación. NET y funciona como un encanto. El código abierto ofrece algunas características bastante buenas si me preguntas.

Salud.
 6
Author: Deacon Frost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-25 02:47:04

Puede utilizar Jscript.net y realmente funcionará con código javascript arbitrario; Solo necesita desactivar "modo rápido" compilando con jsc /fast- bar.js

No he probado esto; solo lo noté mientras leía este post y pensé que sería otra solución razonable. MSDN Tiene los documentos para esta opción y cuáles son las limitaciones si no la usa.

 4
Author: Sean McMillan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-22 21:36:29

V8.NET

Este es probablemente el mejor que he encontrado todavía.
https://v8dotnet.codeplex.com/documentation

Además se ha construido desde el principio con un puerto Mono en mente. Le da un control total sobre la potencia del motor V8 desde el código administrado.

 4
Author: Donny V.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-29 13:34:33

Prefiero JINT en lugar de la otros.

JINT puede ser lento, pero es fácil depurar e interactuar con sus propias clases.NET. (Es difícil establecer atributos [ComVisile] cada vez para jscript.dll, etc.).

En términos de threading, JINT y trabajo jurásico como esperaba. Con el fin de trabajar con JScript engine o Google V8, usted tiene que prestar atención a la interfaz de usuario-threading problema.

Sin embargo, JINT está anticuado en algún aspecto, porque tengo problemas para compilar jQuery 1.5 o tarde.

Espero que Jurassic pueda eliminar su límite para pegar su propia clase con la que trabajar creando 'AllowBob'sCLRClass=true'.

Tengo que reescribir toda la clase. Es difícil...

 1
Author: ultra mother hacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-15 19:58:07