Pregunta

¿Alguien sabe de real (i) .. no vaporware implementaciones de ECMAScript dirigidas a la .NET CLR / DLR ? Lo ideal sería algo así como lo Rhino es para Java . Un puerto sólida de Rhino se ejecuta en .NET Framework / Marco Mono sería perfecto.

Sólo he visto un puñado de proyectos mencionados pero nunca había visto ninguna salen a la luz, o en realidad cualquier cosa que nunca he sido capaz de ejecutar secuencias de comandos en. Esto es lo que sé acerca ya:

  • MSScriptControl Control ActiveX : Que yo sepa, esta última era implementaiton ECMAScript compatible reales de Microsoft (corre JScript 5.7). Me he integrado con MSScriptControl pero no considero la interoperabilidad COM a ser una respuesta a esta pregunta. 64 es un asesino para esta opción.

  • JScript.NET : yo no cuento JScript.NET ya que nunca pudo analizar correctamente cualquiera de mis guiones reales. Parece que tiene problemas con los cierres.

  • Managed JScript : Se parece lo que quiero, pero parece que está muerto en el agua. Fue un gran ejemplo de implementación para el DLR pero luego se enredó con Silverlight y parece haberse desvanecido como una prioridad desde 2007. fuentes Acreditable en el estado de este sería de gran ayuda.

  • MyJScript : Construido como un tutorial para la implementación del DLR . Alguien sabe cómo completo de una aplicación que es esto?

  • Jint : intérprete de JavaScript para .NET. no hasta el momento apoyar currying o try - catch -. finally

  • RemObjects Guión para .NET : Un competidor interesante todavía en las obras. Estoy confundido por su comercialización en cuanto a lo que en realidad será, pero suena como el tiempo podría ser un ajuste. Si alguien sabe más sobre él que sería útil también.

  • V8 para .NET : Esto sería grande si alguien portado V8 de .NET. Por lo que yo sé que no es un gran esfuerzo en torno a este bien. El enlace es a una idea para llamar a ella desde un contenedor administrado C ++.

En el fondo, yo quiero ser capaz de ejecutar código JavaScript desde dentro de .NET; es decir, cargar un conjunto de scripts en su contexto y poner en ese contexto y recuperar los resultados de la ejecución. Actualmente me salta a través de aros para usar MSScriptControl a través de COM Interop engorroso. La inconsistencia de COM hace que sea muy difícil para el despliegue y la garantía de ejecución consistente.

Me gustaría ser capaz de ejecutar razonablemente complejos arneses de prueba de JavaScript desde dentro de .NET. Esto no es para crear macros de usuario o secuencias de comandos simples diminutos; Necesito un entorno real como JavaScript Rhino. Si la aplicación se ejecuta en la parte superior de la CLR (en lugar de COM) esto realmente ayudar con algunos de los temas de actualidad.

¿Fue útil?

Solución

En la actualidad, he modificado una versión de la EcmaScript.NET dentro de mi YUICompressor.NET puerto (proyecto).

Si agarras el código fuente de aquí , he incluido mi código modificado en el proyecto, lo que se puede hacer referencia. Esta es la única fuente de código que he encontrado en .NET que puede manejar análisis de JavaScript, del lado del servidor.

Por desgracia, no puedo recordar cómo, finalmente lo encontré. Fue un proceso duro, debo admitir. Creo que he encontrado algunas referencias páginas dev Mozilla algún lugar sobre Rhino (el código java) que me llevó a descubrir que implimentation C # .NET.

tuve que modificarlo levemente para sincronizar con algunos cambios en los tipos de compresor YUI hicieron a su rama de código. Así que la rama modificada Tengo podría no ser el mejor .. pero es el más cercano que he visto a la rama original de Java.

El código C # original para EcmaScript.NET no se ha tocado desde 2007 ... por lo menos para la página de descargas.

Tal vez esto podría ayudar ??

HTH.

Otros consejos

Todavía vida Aproximadamente:

  • Jurásico (Had a cometer en el último año).
  • Jint (actualmente tomando las solicitudes de extracción.)

Otros proyectos, casi muerto:

loco Método:

  • Rhino sobre IKVM (mencionado en los comentarios, pero aquí hay un enlace a más información acerca de hacerlo.)

Nadie ha mencionado http://jurassic.codeplex.com/ No sé lo bueno que es en general (rendimiento, facilidad de uso, etc.), pero al menos Analiza bonitas guiones complejos (otras implementaciones no lo hacen) y es compatible con ECMAScript 5 spec. Acabo de añadir el enlace aquí por referencia.

Nadie ha mencionado ClearScript, por lo ClearScript .

No es una aplicación; se trata de un contenedor de interoperabilidad que soporta V8, JScript y VBScript, con una muy agradable para llamar a la API en ellos a partir del código .NET.

código de ejemplo 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);
}

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

Actualizar

recién reescrito versión disponible en Github en https://github.com/sebastienros/jint

Usted debe tratar Javascript .NET ( http://javascriptdotnet.codeplex.com/ ) en CodePlex. Lo envolvieron con v8 manejado C ++ y entonces usted puede utilizar esta biblioteca con una aplicación .NET y funciona como un encanto. El código abierto ofrece unas buenas características si usted me pregunta.

Saludos.

Puede utilizar Jscript.net y que en realidad va a trabajar con arbitraria código javascript; Sólo tiene que desactivar la opción "modo rápido" al compilar con jsc /fast- bar.js

No he probado esto; Me he dado cuenta de que mientras se lee este post y pensé que sería otra solución razonable. MSDN tiene la documentación para esta opción y cuáles son las limitaciones si no lo usa .

V8.NET

Este es probablemente el mejor que he encontrado todavía turismo Els href="https://v8dotnet.codeplex.com/documentation" rel="nofollow"> https:. //V8dotnet.codeplex .com / documentación

su sido construido desde el principio con un puerto Mono en cuenta

Plus. Se le da un control total sobre la potencia del motor V8 de código administrado.

Yo prefiero JINT en lugar de la otros.

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

En cuanto a la rosca, y el trabajo JINT Jurásico como lo esperaba. Para poder trabajar con el motor de JScript o Google V8, hay que prestar atención a la cuestión de IU-threading.

Sin embargo, JINT está fuera de moda en algún aspecto, porque tengo problemas para compilar jQuery 1.5 o posterior.

Espero Jurásico puede eliminar su límite para pegar su propia clase para trabajar con la creación de 'AllowBob'sCLRClass=true'.

Tengo que volver a escribir toda la clase. Es difícil ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top