Incrustar el motor de JavaScript en .NET [cerrado]


216

Me pregunto si alguien ha intentado integrar e integrar algún motor js en el entorno .net. Pude encontrar y realmente usar (después de MUCHO dolor y esfuerzo, ya que está bastante desactualizado y no está terminado) el proyecto spidermonkey-dotnet. ¿Alguien con experiencia en esta área? Motores como SquirrelFish, V8 ..

No es que no esté satisfecho con Spidermonkey de Mozilla (utilizándolo para miniframe similar a Rails para componentes personalizados dentro de la aplicación ASP.NET central), pero aún me encantaría explorar un poco más con las opciones. Las soluciones de línea de comandos no son lo que necesitaría, no puedo confiar en otra cosa que no sea CLR, necesito llamar a métodos desde / a objetos 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 para aclarar: no estoy tratando de programar la aplicación en en JavaScript del lado del servidor. Se usa únicamente para escribir subaplicaciones de usuario personalizadas (puede verse como algún tipo de DSL). Es mucho más fácil (y más seguro) permitir que las personas normales programen en js que C #.

Respuestas:


98

Prueba Javascript .NET . Está alojado en GitHub Fue alojado originalmente en CodePlex, aquí )

Discusiones del proyecto: http://javascriptdotnet.codeplex.com/discussions

Implementa Google V8. Puede compilar y ejecutar JavaScript directamente desde el código .NET con él, y proporcionar objetos CLI para que también los use el código JavaScript. Genera código nativo de JavaScript.


+1. Es simple y parece funcionar muy bien.
JC Inacio

66
Hay afirmaciones de que esto está muerto en los paneles de discusión del proyecto, la documentación más allá de un ejemplo básico es deficiente y estoy luchando por agregar un controlador de eventos JavaScript a un evento .Net con un script.
Alan Macdonald

66
Noesis (compañía de desarrollo original) perdió interés en el proyecto, pero finalmente decidió dar el control a la comunidad. En consecuencia, ahora hay una nueva versión que incluye muchas correcciones de errores. Lamentablemente, las devoluciones de llamada de JavaScript de .Net aún no son compatibles.
Oliver Bock

Otra nota para el futuro: parece que el paquete Nuget está borrado de alguna manera ... actualmente no "solo funciona" cuando instala el paquete.
Chris Pfohl

3
Como javascriptdotnet está muerto, considere usar ClearScript en su lugar (vea esta respuesta )
JB. Con monica.

86

El intérprete de JavaScript de código abierto Jint ( http://jint.codeplex.com ) hace exactamente lo que está buscando.

Editar:
El proyecto ha sido reescrito por completo y ahora está alojado en Github en https://github.com/sebastienros/jint


66
Otra posibilidad construida sobre DLR: RemObjects Script para .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
abril April

Creo que está escrito en Delphi Prism / Oxygen y se proporciona como código fuente, por lo que si no ha comprado una licencia para los productos mencionados anteriormente, no es tan útil. ¿Me equivoco? Si hay una versión en forma binaria en algún lugar, me gustaría probarlo.
Andrew Savinykh

2
RemObjects Script está escrito en Oxygene, correcto, pero en realidad no necesita una licencia de Oxygene para usarlo; por un lado, puede obtener el instalador binario en remobjects.com/free , por otro incluso puede obtener el compilador de línea de comandos Oxygene gratuito si necesitabas reconstruirlo tú mismo, desde la fuente. Una de las grandes ventajas de la plataforma .NEt es la independencia del idioma, después de todo. no importa en qué idioma esté escrita una biblioteca, para que la use.
Marc Hoffman

1
Último lanzamiento en 2011 ... Jurassic parece mejor.
Roman Starkov

3
Última versión en 2014 en realidad: github.com/sebastienros/jint
Sébastien Ros - MSFT

54

También podría estar interesado en Microsoft ClearScript que está alojado en GitHub y publicado bajo la licencia Ms-Pl.

No soy fanático de Microsoft, pero debo admitir que el soporte V8 tiene las mismas funcionalidades que Javascript.Net, y lo que es más importante, el proyecto aún se mantiene. En lo que a mí respecta, el soporte para delegados también funciona mejor que con Spidermonkey-dotnet.

ps: también es compatible con JScript y VBScript, pero no nos interesaron estas cosas viejas.

ps: es compatible con .NET 4.0 y 4.5+


3
¡+1 no estaba totalmente al tanto de este proyecto, parece prometedor, esperemos que no muera como la mayoría de los otros proyectos que intentan hacer lo mismo!
Peter

Una cosa que he encontrado diferente en ClearScript usando el motor Windows.JScript es que los objetos .net ahora distinguen entre mayúsculas y minúsculas, donde el objeto ScriptControl anterior no importaba.
Brain2000

Aquí está mi problema con ClearScript. Cuando se ejecuta, se queja de que faltan dlls. Luego me piden que instale componentes de estudio visual adicionales. Eso no es problema, excepto que no tendré privilegios de administrador donde ejecutaré el código. Sería bueno si fuera totalmente autónomo en un dll.
TatiOverflow

38

Cualquiera que esté sintonizando también echa un vistazo a Jurassic:

http://jurassic.codeplex.com/

editar: esto se ha movido a github (y parece activo a primera vista)

https://github.com/paulbartrum/jurassic


3
Parece que este es uno de los pocos proyectos que tiene código nativo .NET (en lugar de usar f.ex. el motor V8) y aún parece ser compatible (Ecmascript.net, jscript.net y muchos otros parecen ser muerto). +1 y gracias por el enlace!
atlaste

2
Después de revisar todos los proyectos enumerados en estas respuestas, me he centrado en Jurassic. Es uno de los dos o tres que aún se mantienen activamente, es verdadero JS, altamente probado y es puro .NET.
Roman Starkov

Agregaría mi apoyo a Jurassic. También tiene la capacidad de serializar el estado de ejecución del contexto de ejecución. Eso significa que literalmente puede persistir su tiempo de ejecución de JavaScript, variables y todo. Característica extremadamente útil para algunos casos.
Jerome Haltom

Hola wasabi, no pude encontrar nada sobre cómo serializar el estado de ejecución del contexto de ejecución. ¿Cómo lo lograste?
Henning


7

Supongo que todavía no tengo claro qué es lo que está tratando de hacer, pero vale la pena analizar JScript.NET, aunque parece que JScript administrado puede ser más apropiado para sus necesidades (es más parecido a JavaScript que a JScript.NET) .

Personalmente, pensé que sería genial integrar V8 de alguna manera, pero no pude descargar el código fuente; Ojalá tuviera tiempo de hacer algo con eso.


En realidad Managed JScript es lo más parecido a mis necesidades. Sabía que estaba en Silverlight, no sabía que se había lanzado. JScript.NET no es una opción. Realmente no quiero darles a los usuarios acceso a toda la pila .NET. Solo necesito un par de objetos básicos integrados que pueden usar para sus aplicaciones.
abril April

17
Es 2009 y Managed JScript está muerto ahora.
Alexander Abramov

5

Si el idioma no es un problema (cualquiera con scripts de espacio aislado), existe LUA para .NET . La versión Silverlight de .NET Framework también está protegida por afaik.


5

Eche un vistazo a Javascript .NET en codeplex ( http://javascriptdotnet.codeplex.com/ ) con la versión 0.3.1, hay algunas nuevas características bastante interesantes que probablemente le interesarán.

Mira un código de muestra:

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

¿Funciona esto para objetos .Net? Por ejemplo: si tengo una clase Employee, ¿puedo pasar el objeto a V8 y manipular el objeto Employee desde JavaScript?
Joy George Kunjikkuru


5

En su lugar, se me ocurrió una solución mucho más simple.

.dllCreé un archivo usando Javascript y luego lo compilé usando el compilador Javascript que está disponible en un símbolo del sistema del desarrollador VS2013.

Una vez que tenemos el .dll, simplemente lo agregamos a la \Supportcarpeta y luego lo referenciamos en el proyecto que necesitaba evaluar las declaraciones de Javascript.

Pasos detallados para crear un .dll:

  1. Cree un archivo en el Bloc de notas con solo estos contenidos:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
  2. Guarde el archivo como C:\MyEval.js

  3. Abra un símbolo del sistema VS2005 (Inicio, Programas, VS2005, Herramientas VS2005)

  4. Escriba Cd\para llegar aC:\

  5. Tipo

    jsc /t:library C:\MyEval.js
  6. Se crea un nuevo archivo llamado MyEval.dll.

  7. Copia MyEval.dllal proyecto y referencialo (también referencia Microsoft.Jscript.dll).

  8. Entonces deberías poder llamarlo así:

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

objResult es True.


4

Acabo de probar RemObjects Script para .Net .

Funciona, aunque tuve que usar una fábrica estática ( var a=A.createA();) de JavaScript en lugar de la var a=new A()sintaxis. (¡La función ExposeType solo expone estadísticas!) No hay mucha documentación y la fuente está escrita con Delphi Prism, lo cual es bastante inusual para mí y el Reflector RedGate.

Entonces: fácil de usar y configurar, pero no mucha ayuda para escenarios avanzados.

También tener que instalar algo en lugar de simplemente soltar los ensamblajes en un directorio es algo negativo para mí ...


2

La forma documentada de Microsoft de agregar extensibilidad de script a cualquier cosa es IActiveScript. Puede usar IActiveScript desde cualquier aplicación .NET para llamar a la lógica del script. La lógica puede formar parte de los objetos .NET que ha colocado en el contexto de secuencias de comandos.

Esta respuesta proporciona una aplicación que lo hace, con código:


2

Hay una implementación de un host de ActiveX Scripting Engine en C # disponible aquí: analizar y ejecutar JS por C #

Permite usar Javascript (o VBScript) directamente desde C #, en procesos nativos de 32 o 64 bits. La fuente completa es ~ 500 líneas de código C #. Solo tiene una dependencia implícita en la DLL del motor JScript (o VBScript) instalada.

Por ejemplo, el siguiente código:

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

mostrará 1.66666666666667



1

Creo que todos los principales motores JS de código abierto (JavaScriptCore, SpiderMonkey, V8 y KJS) proporcionan API de incrustación. El único con el que estoy directamente familiarizado es JavaScriptCore (que es el nombre del motor JS en el que vive SquirrelFish) que proporciona una API C pura. Si la memoria funciona (ha pasado un tiempo desde que usé .NET) .NET tiene bastante buen soporte para vincular en API de C.

Sinceramente, no estoy seguro de cómo son las API para los otros motores, pero sí sé que todas las proporcionan.

Dicho esto, dependiendo de sus propósitos, JScript.NET puede ser el mejor, ya que todos estos otros motores requerirán que los incluya con su aplicación, ya que JSC es el único que realmente se envía con un sistema operativo, pero ese sistema operativo es MacOS: D


2
Sí, todos los motores principales son generalmente integrables, pero simplemente hay demasiados obstáculos. estudiando la guía de incrustación, aprendiendo la API de C (++). Esperaba que ya se hiciera algún trabajo de integración. JScript.NET no se puede usar, el código real es escrito y ejecutado por los usuarios de internet.
abril

1

Sé que estoy abriendo un hilo antiguo, pero he trabajado mucho en smnet (spidermonkey-dotnet). En los años recientes. Su enfoque principal de desarrollo ha sido la integración perfecta de objetos .net en el motor de spidermonkey. Admite una amplia variedad de conversiones de valores js a objetos .net. Algunos de los que incluyen delegados y eventos.

Solo digo que valdría la pena comprobar ahora que hay un desarrollo constante :). Mantengo el repositorio SVN actualizado con correcciones de errores y nuevas características. Los archivos de origen y solución de proyecto están configurados para compilarse correctamente en la descarga. Si hay algún problema al usarlo, siéntase libre de abrir una discusión.

Entiendo el deseo de tener una solución javascript administrada, pero de todos los javascript administrados que he usado, todos carecen de algunas características clave que ayuden a que sean robustos y fáciles de trabajar. Yo mismo estoy esperando que IronJS madure un poco. Mientras espero, me divierto jugando con spidermonkey-dotnet =)

proyecto spidermonkey-dotnet y página de descarga

Editar: página de wiki de documentación creada esta tarde.


1

Pruebe ReoScript , un intérprete de JavaScript de código abierto implementado en C #.

ReoScript hace que su aplicación pueda ejecutar JavaScript. Tiene una amplia variedad de methons de extensión como SetVariable, Function Extension, usando CLR Type, .Net Event Binding y etc.

Hola Mundo:

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

Y aquí hay un ejemplo de script que crea una forma de victoria y la muestra.

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

Use JSCRIPT.NET para obtener una biblioteca (dll) de js. Luego, haga referencia a este dll en su aplicación .NET y ya está allí. ¡HECHO!



0

V8.NET es un nuevo chico en el bloque (a partir de abril de 2013) que envuelve más de cerca la funcionalidad nativa del motor V8. Permite un mayor control sobre la implementación.


-5

Ahora es posible con ASP.Net MVC4 RazorView engine. el código será este:

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

y Razorno es solo para MVC4 u otras aplicaciones web y puede usarlo en aplicaciones de escritorio sin conexión.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.