2008-12-10 7 views
34

Estoy construyendo una aplicación .NET 3.5 y tengo la necesidad de evaluar el código JS en el servidor, básicamente un conjunto de reglas proporcionado por el usuario que puede funcionar dentro de un navegador o en el servidor. Managed JS no es una opción, porque el código JS se proporcionaría en tiempo de ejecución. Jaxer de Aptana tampoco es una opción. Así que estaba buscando utilizar una versión del motor V8 dentro de mi aplicación.Haciendo referencia al motor V8 de Google desde una aplicación .NET

Creé el origen correctamente en una DLL, pero esa DLL no es una biblioteca administrada y tampoco es COM. V8 es simplemente C++.

¿Alguna idea de cómo interoperar con este tipo de DLL en C#? Además, estoy abierto a otras sugerencias para SpiderMonkey u otro motor JS.

Gracias de antemano.

ACTUALIZACIÓN:

pude utilizar la solución de Ryan. Acabo de actualizar las referencias a la compilación para lo último de trunk. Funcionó muy bien. Gracias Ryan.

+0

Como un lado, ¿dónde puedo obtener una copia de la DLL compilada? (Dado que soy demasiado vago para compilarlo, principalmente porque no tengo VS configurado para hacer C++) –

+0

He actualizado mi publicación con un enlace para descargar el proyecto de prueba que creé. –

+0

Para aquellos que acaban de encontrar esta página, ahora también existe V8.NET en Codeplex. –

Respuesta

33

Me doy cuenta de que esta puede no ser una respuesta exacta a su pregunta, pero pensé que pondría mi valor de 2 centavos ya que dudo que muchas personas lo hayan intentado.

Lo hice funcionar por creado un contenedor administrado utilizando el modo mixto C++. Hay otras formas de hacerlo, pero iba a intentar crear un contenedor completo que se pudiera usar desde cualquier lenguaje .Net.

Conseguir que la biblioteca compilara de tal forma que pudiera incluirse en un proyecto de modo mixto era un desafío. Tuve que modificar la biblioteca de tiempo de ejecución (en el archivo SConstruct) utilizada para/MD y/MDd para que fuera compatible con el modificador/clr.

Hasta ahora solo tengo scripts simples en ejecución ya que no he implementado devoluciones de llamada, métodos personalizados, objetos y demás.

Aquí es una muestra rápida de lo que el uso se parece a una de mis aplicaciones de prueba:

V8DotNet.Shell shell = new V8DotNet.Shell(); 

shell.ExecuteScript(@"print('V8 version is: ' + version());"); 

Se ejecuta las secuencias de comandos más complicados como una multa codificador de base 64 también. Pero por ahora solo puedo agregar elementos personalizados desde el lado de C++.

Estoy dispuesto a proporcionar más información + código si alguien está interesado, ya que es posible que nunca vuelva a seleccionar este proyecto. Pero, me temo que es mucho código entrar en una publicación aquí, así que tendríamos que encontrar algún otro medio como google code o codePlex.

Editar:


OK, he subido el código. Tengo que poner un descargo de responsabilidad en esto: El proyecto es muy temprano y soy un aficionado en C++ en el mejor de los casos, así que no tengas tantas esperanzas. Además, este proyecto fue creado/hecho justo después de que se lanzó Chrome, por lo que la versión de v8 incluida puede ser antigua.

Dicho esto, aquí está: http://ryanscook.com/Files/V8-DotNet.zip (21.5 MB)

En el paquete encontrará los siguientes puntos de interés:

V8Net-Biblioteca \ V8.Net \ V8.Net.sln - Este es la solución que tiene la administrado C++ wrapper proj y una aplicación de consola C# para probar.

Dependencias \ V8 - Este es mi código V8 que utilicé para construir la lib de V8.

Espero que ayude!

+0

"Tuve que modificar la biblioteca de tiempo de ejecución (en el archivo SConstruct) utilizada para/MD y/MDd para que fuera compatible con el modificador/clr. " - ¡No es un desafío muy difícil! :) – leppie

+7

Bien encontrando lo que había que hacer era. El tipeo es siempre la parte fácil. Supongo que mi falta de experiencia con C++ aumentó la frustración un poco. –

+0

¡Por supuesto, sígalo! –

0

Por lo que he oído compilar con IJW (Managed C++) debería funcionar, pero puedo estar realmente equivocado, nunca he tocado MC++.

1

Microsoft are building a real javascript - not "JScript" - runtime (junto con IronPython, IronRuby y VB10) en el CLR usando el DLR, pero no puedo encontrar ninguna descarga ni contenido para él. Quizás esto llegará con C# 4?

+0

Sí, ya había oído hablar de la implementación de JS DLR hace un tiempo, así que primero lo investigué. Pero, desafortunadamente, MSFT no parece haber lanzado nada para JS todavía, solo IronPython. Gorrón. – NathanD

+1

El JavaScript administrado en el DLR está muerto. Ver esta respuesta: http://code.google.com/apis/v8/design.html –

+1

No entiendo cómo los documentos de diseño V8 tienen algo que ver con Javascript en el DLR. El punto de javascript en el DLR no sería solo para la velocidad pura (aunque sería una buena ventaja), sino para interoperar limpiamente con el ecosistema .NET existente, que V8 no hace –

13

Echa un vistazo v8sharp. Es compatible con la ejecución de JS dentro de una aplicación .NET. También le permite registrar tipos .NET con el motor v8 para que su código JS pueda interactuar con su código .NET. Estoy en el proceso de agregar soporte para la función de enganche/delegar soporte.

+0

¡Esto es genial! ¡Gracias! podemos tener mas ejemplos por favor? – shawndumas

+0

v8sharp es grandte, lo he usado en mi proyecto. – guaike

18

Puede probar Javascript .NET:

http://javascriptdotnet.codeplex.com/

Te permite crear un contexto V8 de .NET y registrar objetos CLI en él para que pueda manipularlos y llamar a los miembros del código Javascript. Compila el Javascript en tiempo de ejecución.

Échale un vistazo.

+1

cierto, muy bueno, pero muy inadecuado para el uso del servidor ... porque el motor V8 no es seguro para subprocesos. (ver: http://javascriptdotnet.codeplex.com/workitem/7062) Esto fue un fastidio ... –

+1

javascriptdotnet ahora es threadsafe. Se pueden ejecutar varias instancias (aislamientos) de v8 simultáneamente, pero no pueden interactuar. –

0

Usted puede intentar V8.NET también.

http://v8dotnet.codeplex.com/

Se le permite integrar fácilmente el código con el V8 a un nivel inferior al de muchos otros envoltorios.

Cuestiones relacionadas