c# - monkey - Incrustar el motor de JavaScript en.NET
spidermonkey javascript (22)
solo me pregunto si alguien alguna vez ha intentado incrustar e integrar un motor js en el entorno .net. Pude encontrar y realmente usar (después de MUCHO dolor y esfuerzo, ya que es bastante anticuado 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 el Spidermonkey de Mozilla (usándolo para miniframework de Rails para componentes personalizados dentro de la aplicación ASP.NET principal), pero todavía me encantaría explorar un poco más 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 realmente la aplicación en sí mismo en el servidor javascript. Se utiliza únicamente para escribir subapplicaciones de usuario personalizadas (puede verse como algún tipo de DSL). Es mucho más fácil (y más seguro) permitir que la gente normal programe en js que en C #.
Acabo de probar remobjects.com/script.aspx .
Funciona, aunque tuve que usar una fábrica estática ( var a=A.createA();
) desde JavaScript en lugar de la var a=new A()
sintaxis var a=new A()
. (¡La función ExposeType solo expone estadísticas!) No hay mucha documentación y la fuente está escrita con Delphi Prism, que es bastante inusual para mí y para el reflector de RedGate.
Por lo tanto: fácil de usar y configurar, pero no es de mucha ayuda para escenarios avanzados.
También tener que instalar algo en lugar de simplemente colocar los ensamblajes en un directorio es negativo para mí ...
Ahora es posible con el ASP.Net MVC4 Razor
View. 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 Razor
no es solo para MVC4 u otra aplicación web y puede usarlo en aplicaciones de escritorio fuera de línea.
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 realmente familiarizado es con 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 buena compatibilidad para enlazar 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 en 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
Cualquiera que esté sintonizando también echa un vistazo a Jurassic:
edición: esto se ha movido a github (y parece activo a primera vista)
El intérprete de JavaScript de código abierto Jint ( jint.codeplex.com ) hace exactamente lo que está buscando.
Editar:
El proyecto ha sido completamente reescrito y ahora está alojado en Github en https://github.com/sebastienros/jint
Hay una implementación de un host ActiveX Scripting Engine en C # disponible aquí: analizar y ejecutar JS by C #
Permite usar Javascript (o VBScript) directamente desde C #, en procesos nativos de 32 bits o 64 bits. La fuente completa es ~ 500 líneas de código C #. Solo tiene una dependencia implícita de la DLL del motor de JScript (o VBScript) instalado.
Por ejemplo, el siguiente código:
Console.WriteLine(ScriptEngine.Eval("jscript", "1+2/3"));
se mostrará 1.66666666666667
Hey, eche un vistazo a Javascript .NET en codeplex ( http://javascriptdotnet.codeplex.com/ ) con la versión 0.3.1, hay algunas características nuevas muy buenas que le interesarán.
Echa un vistazo a 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"));
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 de script. La lógica puede participar en los objetos .NET que haya colocado en el contexto de las secuencias de comandos.
Esta respuesta proporciona una aplicación que lo hace, con código:
Pruebe ReoScript , un intérprete de JavaScript de código abierto implementado en C #.
ReoScript hace que tu aplicación pueda ejecutar JavaScript. Tiene una amplia variedad de metones de extensión, como SetVariable, Function Extension, utilizando 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
Pruebe Javascript .NET . Se encuentra alojado en GitHub. Se alojó originalmente en CodePlex, http://javascriptdotnet.codeplex.com/ )
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 suministrar objetos CLI para que también los utilice el código JavaScript. Genera código nativo desde JavaScript.
Puede probar ironJS, parece prometedor aunque está en un desarrollo pesado. https://github.com/fholm/IronJS
Puede usar el motor Rhino a Mozilla Javascript escrito en Java, y usarlo con IKVM, aquí hay algunas instrucciones.
Instrucciones: https://www.codeproject.com/Articles/41792/Embedding-JavaScript-into-C-with-Rhino-and-IKVM
Puedes usar el motor Chakra en C #. Aquí hay un artículo en msdn que muestra cómo:
http://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880
Sé que estoy abriendo un hilo viejo, pero he trabajado mucho en smnet (spidermonkey-dotnet). En los años recientes. Su principal foco de desarrollo ha sido la integración perfecta de objetos .net en el motor spidermonkey. Admite una amplia variedad de conversiones de valores js a objetos .net. Algunos de ellos incluyen delegados y eventos.
Solo digo que podría valer la pena comprobar que ahora hay un desarrollo constante :). Mantengo el repo de SVN actualizado con correcciones de errores y nuevas características. Los archivos de la fuente y la solución del proyecto están configurados para construirse exitosamente 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 de javascript administrado, pero de todos los javascript administrados que he usado, todos carecen de algunas características clave que ayudan a que sean robustos y fáciles de utilizar. Yo mismo estoy esperando a que IronJS madure un poco. Mientras espero, me divierto jugando con spidermonkey-dotnet =)
Proyecto spidermonkey-dotnet y página de descarga.
Edición: documentación creada en la página wiki de esta tarde.
Se me ocurrió una solución mucho más simple en su lugar.
Construí un archivo .dll
usando Javascript y luego lo compilé usando el compilador de Javascript que está disponible en un indicador de comando del desarrollador VS2013.
Una vez que tenemos el archivo .dll
, simplemente lo agregamos a la carpeta /Support
y luego lo referenciamos en el proyecto que necesitaba para evaluar las declaraciones de Javascript.
Pasos detallados para crear un .dll
:
Cree un archivo en el Bloc de notas con solo estos contenidos:
class EvalClass { function Evaluate(expression: String) { return eval(expression); } }
Guarde el archivo como
C:/MyEval.js
Abra un símbolo del sistema VS2005 (Inicio, Programas, VS2005, Herramientas VS2005)
Escribe
Cd/
para llegar aC:/
Tipo
jsc /t:library C:/MyEval.js
Se crea un nuevo archivo llamado
MyEval.dll
.Copie
MyEval.dll
al proyecto y haga referencia a él (también haga referencia aMicrosoft.Jscript.dll
).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
Si el idioma no es un problema (cualquier script en un espacio aislado) entonces hay LUA para .NET . La versión Silverlight de .NET framework también se encuentra en un espacio aislado.
Supongo que todavía no tengo claro qué es lo que intentas hacer, pero vale la pena analizar JScript.NET, aunque parece que ManScript JScript puede ser más apropiado para tus necesidades (es más como JavaScript que JScript.NET) .
Personalmente, pensé que sería genial integrar V8 de alguna manera, pero no conseguí descargar el código fuente; Ojalá tuviera tiempo de hacer algo con eso.
También existe el MsieJavaScriptEngine que utiliza el motor Chakra de Internet Explorers
También puede interesarle Microsoft ClearScript, que está alojado en GitHub y publicado bajo la licencia Ms-Pl.
No soy un fanboy de Microsoft, pero debo admitir que el soporte de V8 tiene aproximadamente las mismas funcionalidades que Javascript.Net, y más importante aún, 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 interesaban estas cosas antiguas.
ps: es compatible con .NET 4.0 y 4.5+
Use JSCRIPT.NET para obtener una biblioteca (dll) de js. Luego haga referencia a esta dll en su aplicación .NET y estará allí. ¡HECHO!
Script# compila C # a js y es el hijo del cerebro de uno de los equipos de ASP.Net. Rick Strahl también tiene algunas publicaciones sobre la incorporación de js como motor de tiempo de ejecución para la evaluación de expresiones.
V8.NET es un chico nuevo en el bloque (a partir de abril de 2013) que se ajusta más a la funcionalidad del motor V8 nativo. Permite un mayor control sobre la implementación.