Usando a.NET DLL en el nodo.js / serverside javascript


Tengo un proyecto mascota que es un juego en línea, todo el motor del juego está escrito en C# y me gustaría saber si hay de todos modos puedo llamar a las funciones de este ensamblaje existente (.dll) de una solución construida usando Node.JS, Socket.IO, Exprese el etc?

El motor del juego en sí es bastante completo; probado y robusto. Espero que haya alguna forma ordenada de exponer su funcionalidad sin demasiada sobrecarga.

ACTUALIZACIÓN :

Para responder un poco a mi propia pregunta.. He terminado de construir mi propio servidor web socket (basado en el documento de protocolo web socket más actual). Está escrito en C# y compilado usando Mono para que pueda ser alojado en una caja Linux corriendo mono y por lo tanto (con algunos ajustes) puedo usar mi motor de juego existente.

ACTUALIZACIÓN 2 Ahora existe un proyecto que hace exactamente lo que estaba buscando originalmente - http://tjanczuk.github.io/edge/#/

Author: Maggie, 2011-01-11

7 answers

Si todo lo que quieres hacer es poner en marcha un servidor HTTP ligero mientras sigues programando con C# y.Net deberías darle una oportunidad a Kayak. Es un servidor HTTP ligero para C# y se comporta como un nodo.js en ese sentido.

Kayakhttp

Actualización:

Si está buscando un servidor HTTP ligero para manejar solicitudes web, hoy tiene un par de alternativas:

  • ServiceStack (recomendado)
  • Microsoft WebAPI
  • NancyFx

Que yo sepa, todo lo anterior funciona en alguna versión de Mono, por lo que aún puede hospedarlos en sistemas basados en Windows y Unix.

 17
Author: Khalid Abuhakmeh,
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-01 00:35:43

Recientemente me he enfrentado al mismo desafío (requisito de llamar al código C# desde el nodo.js javascript). Tenía 1000 líneas de código C# complejo que realmente no me gustaba portar a javascript.

Resolví si de la siguiente manera.

  • El código C # relevante es básicamente 1-2 clases en un ensamblado DLL
  • Definió una interfaz COM que es un subconjunto de la interfaz de la clase C# e implementó esa interfaz en la clase C#. Por lo tanto, el DLL se convirtió en un servidor COM en proceso.
  • Implementado un nodo.DLL de extensión js que crea una instancia de mi clase COM de C # utilizando la API COM de Win32 estándar y enruta las llamadas a métodos desde el nodo.js javascript a código C # usando la interfaz COM.

Esto resuelve el problema si uno solo quiere hacer llamadas en una dirección. También tenía el requisito de hacer llamadas desde C# a javascript. Esto es mucho más difícil. Uno tiene que:

  • Implementa un objeto COM en el nodo.js extensión DLL (ATL ayuda aquí)
  • Pasar una interfaz referencia de este objeto COM al código C# (COM Interop)
  • Enrutar llamadas a través del objeto COM a objetos V8 en node.js

Tal vez si tengo algo de tiempo extra, podría hacer un proyecto de ejemplo de esto.

 24
Author: Kyberias,
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-01-15 19:12:22

Echa un vistazo al borde.js project I started ( http://tjanczuk.github.com/edge ). Proporciona un mecanismo para ejecutar. NET y node.código js en proceso. Borde.js le permite llamar código. NET desde el nodo.js y node.el código js de. NET. It gestiona los datos entre.NET y node.js, así como reconcilia los modelos de roscado entre CLR multihilo y V8 de rosca simple.

Usando edge.js puede acceder a islas de código. NET preexistente desde el nodo.js, que parece coincidir con su escenario.

 24
Author: Tomasz Janczuk,
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-03-26 06:16:30

Se pueden escribir complementos.Net, en resumen, se escribe un complemento nativo normal y se agregan llamadas. Net a través de llamadas CLI/C++ a dll. Net.

En la práctica, normalmente se crea una biblioteca dll de C# que luego se llama desde un proyecto de complemento de nodo CLI/C++. Hay un poco de delicadeza, como asegurarse de que el nodo real add on definition file se compila sin soporte CLR para que node pueda cargarlo correctamente.

Usted puede comprobar hacia fuera: https://github.com/saary/node.net para un ejemplo de cómo esto se puede lograr.

 8
Author: saary,
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-08-03 22:09:38

La siguiente respuesta está desactualizada, pero sigue siendo útil para comprender el nodo.js de la primera versión
Nodo.js ahora también está disponible de forma nativa para Windows en nodejs.org. Ningún requisito de cygwin o de otra manera.

En primer lugar, por el momento no hay un puerto nativo de Windows del Nodo.js, solo hay una versión de cygwin(pero sospecho que ya lo sabías).

Había un módulo de nodo flotando en algún lugar de los GitHubs que proporcionaba envoltorios para llamar a bibliotecas nativas, pero iirc, que solo funcionaban con libs .so.

Por lo tanto, si desea utilizar una DLL de C#, primero tendrá que escribir un nodo nativo.js extensión, como el interface:
https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/

Desde esa extensión tienes que cargar el DLL y envolver las llamadas desde el nodo.js al código C#, eso significa que tienes que escribir código C/C++ de bajo nivel y convertir valores de C # a V8 cosa.

Solo tengo experiencia con C++ y V8, es un poco difícil comenzar ya que los ejemplos de código son un poco escasos, también envolver clases de C++ no es que trivial. Pero escribí algo pequeño JS game engine, que usa un backend OpenGL de C++, está inacabado (y casi no hay comentarios), pero podría darte algunas ideas.

Nota: Hay algunos proyectos en la naturaleza que proporcionan la generación algo automática de envoltorios para V8, pero esos son solo C++.

Así que para concluir, creo que será bastante aventurero conseguir que las envolturas de C# funcionen, pero debería ser posible.

 7
Author: Ivo Wetzel,
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-02-14 10:33:08

Puede que tengas algo de suerte con este proyecto, que es un puerto de Nodo.js to. NET. No lo he usado yo mismo, pero con una implementación nativa de. NET teóricamente debería ser capaz de hacer lo que necesita.

Es posible que también desee ir en la otra dirección e intentar portar (también conocido como: recompilar a menos que esté enganchado profundamente en Windows) su motor de juego de C# a Mono y ver si puede construir envoltorios a partir de eso.

 2
Author: mattmc3,
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-01-25 18:04:13

Sé que es una pregunta antigua, pero quería agregar una respuesta actual. Con IIS 7.5 y. Net 4.x Websockets son compatibles, aunque el uso de la biblioteca SignalR probablemente será la ruta de menor resistencia. Es similar a la socket.io biblioteca para NodeJS.

En cuanto al acceso al código.Net a través de NodeJS, sus mejores opciones son Edge.js, construyendo un ensamblado nativo mixto con C / C++, exponiendo su código. Net a través de una aplicación de línea de comandos (lo mejor es usar tuberías para entrada/salida) o a través de servicio (TCP u otro).

Encuentro Edge.js ser muy limitado, y no ofrecen mucho sobre una interfaz de consola canalizada.. y sentir que un servicio puede ser mejor para una interfaz más compleja. En ese momento es posible que sea mejor hacer el resto del proyecto en.Net, a menos que tenga una inversión en NodeJS que supere dichas dificultades.

 1
Author: Tracker1,
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-04-18 08:48:29