Question Utiliser une DLL .NET dans le javascript Node.js / serverside


J'ai un projet animalier qui est un jeu en ligne, le moteur de jeu entier est écrit en C # et j'aimerais savoir s'il y a de toute façon je peux appeler les fonctions de cet assemblage existant (.dll) à partir d'une solution construite avec Node.JS , Socket.IO, Express etc?

Le moteur de jeu lui-même est assez complet. testé et robuste. J'espère qu'il y a un moyen pratique d'exposer ses fonctionnalités sans trop de frais généraux.

METTRE À JOUR:

Pour répondre un peu à ma propre question .. J'ai fini par créer mon propre serveur de socket Web (basé sur le document de protocole de socket Web le plus récent). Il est écrit en C # et compilé à l'aide de Mono afin qu'il puisse être hébergé sur une machine Linux exécutant mono et, par conséquent, avec quelques modifications, je peux utiliser mon moteur de jeu existant.

MISE À JOUR 2 Un projet qui fait exactement ce que je cherchais à l'origine existe maintenant - http://tjanczuk.github.io/edge/#/


57
2018-01-11 01:49


origine


Réponses:


Si tout ce que vous voulez faire est de faire tourner un serveur HTTP léger tout en programmant avec C # et .Net, vous devriez donner une chance à Kayak. C'est un serveur HTTP léger pour C # et se comporte un peu comme node.js dans ce sens.

kayakhttp

Mettre à jour:

Si vous recherchez un serveur HTTP léger pour gérer les requêtes Web, vous avez plusieurs alternatives aujourd'hui:

  • ServiceStack (recommandé)
  • Microsoft WebAPI
  • NancyFx

A ma connaissance, toutes les fonctionnalités ci-dessus fonctionnent sur certaines versions de Mono, vous pouvez donc toujours les héberger sur des systèmes Windows et Unix.


17
2018-01-26 18:46



J'ai été récemment confronté au même défi (exigence d'appeler le code C # à partir de Javascript.js javascript). J'ai eu des milliers de lignes de code C # complexe que je n'aimais vraiment pas porter sur javascript.

J'ai résolu si comme suit.

  • Le code C # correspondant est essentiellement 1-2 classes dans un assembly DLL
  • Défini une interface COM qui est un sous-ensemble de l'interface de la classe C # et implémenté cette interface dans la classe C #. Ainsi, la DLL est devenue un serveur COM in-process.
  • Implémentation d'une DLL d'extension node.js qui instancie ma classe C # COM à l'aide de l'API COM Win32 standard et des appels de méthode routes de javascript node.js au code C # à l'aide de l'interface COM.

Cela résout le problème si l'on veut seulement faire des appels dans une direction. J'ai également eu besoin de passer des appels de C # vers javascript. C'est beaucoup plus difficile. Quelqu'un doit:

  • Implémenter un objet COM dans la DLL d'extension node.js (ATL aide ici)
  • Passer une référence d'interface de cet objet COM au code C # (COM Interop)
  • Acheminer les appels via l'objet COM vers les objets V8 dans node.js

Peut-être que si j'ai un peu de temps supplémentaire, je pourrais en faire un exemple.


24
2018-01-15 19:12



Découvrez le projet edge.js que j'ai commencé (http://tjanczuk.github.com/edge). Il fournit un mécanisme pour exécuter le code .NET et node.js en cours de traitement. Edge.js vous permet d'appeler le code .NET à partir de code node.js et node.js à partir de .NET. Il regroupe les données entre .NET et node.js et rapproche les modèles de threads entre le CLR multithread et le V8 mono-thread.

En utilisant edge.js, vous pouvez accéder aux îlots de code .NET préexistant à partir de node.js, ce qui semble correspondre à votre scénario.


23
2018-03-26 06:16



Les addons .Net peuvent être écrits, en bref, vous écrivez un addon natif normal et ajoutez des appels .Net via des appels CLI / C ++ à des DLL .Net.

En pratique, vous créez généralement une bibliothèque C # dll que vous appelez ensuite à partir d'un projet d'adaptateur de noeud CLI / C ++. Il y a un peu de délicatesse, par exemple en vous assurant que le fichier de définition de l'ajout de nœud est compilé sans le support CLR, donc le nœud peut le charger correctement.

Vous pouvez vérifier: https://github.com/saary/node.net pour un exemple de la façon dont cela peut être réalisé.


8
2017-11-22 22:55



La réponse suivante est obsolète, mais reste utile pour comprendre Node.js à partir de la première version
  Node.js est maintenant également disponible en natif pour Windows sur nodejs.org. Aucune exigence de cygwin ou autre.

Tout d'abord, il n'y a actuellement aucun port Windows natif de Node.js, il n'y a qu'une version cygwin (mais je pense que vous le saviez déjà).

Il y avait un module de noeud flottant quelque part dans les GitHubs qui fournissaient des wrappers pour appeler les bibliothèques natives, mais iirc, qui fonctionnait uniquement avec .so libs.

Par conséquent, si vous souhaitez utiliser une DLL C #, vous devrez d'abord écrire une extension Node.js native en tant qu'interface:
https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/

À partir de cette extension, vous devez charger la DLL et envelopper les appels de Node.js vers le code C #, ce qui signifie que vous devez écrire du code C / C ++ de bas niveau et convertir les valeurs C # en V8.

Je n’ai qu’une expérience avec C ++ et V8, c’est un peu difficile à démarrer car les exemples de code sont un peu clairsemés. cette banal. Mais j'ai écrit petit Moteur de jeu JS genre de chose, qui utilise un backend C ++ OpenGL, il est inachevé (et il n'y a pratiquement pas de commentaires) mais cela pourrait vous donner quelques idées.

Remarque: Certains projets dans la nature offrent une génération automatique de wrappers vers la version V8, mais ceux-ci sont uniquement en C ++.

Donc, pour conclure, je pense qu'il sera très audacieux de faire fonctionner les wrappers C #, mais cela devrait être possible.


7
2018-01-11 10:58



Vous pourriez avoir de la chance avec ce projet, qui est un port de Node.js vers .NET. Je ne l'ai pas utilisé moi-même, mais avec une implémentation native .NET, vous devriez théoriquement pouvoir faire ce que vous devez.

Vous pourriez aussi vouloir aller dans l'autre direction et essayer de porter (aka: recompiler à moins que vous ne soyez connecté profondément dans Windows) votre moteur de jeu C # à Mono et voir si vous pouvez ensuite construire des wrappers avec ça.


2
2018-01-25 18:04



Je sais que c'est une vieille question, mais je voulais y ajouter une réponse actuelle. Avec IIS 7.5 et .Net 4.x, les Websockets sont pris en charge, bien que l'utilisation de la bibliothèque SignalR soit probablement le chemin de moindre résistance. Il est similaire à la bibliothèque socket.io pour NodeJS.

En ce qui concerne l'accès au code .Net via NodeJS, vos meilleures options sont Edge.js, en construisant un assemblage natif mixte avec C / C ++, en exposant votre code .Net via une application en ligne de commande (il est préférable d'utiliser des canaux pour les entrées / sorties) ou via un service (TCP ou autre).

Je trouve que Edge.js est très limité et ne propose pas beaucoup sur une interface de console. Et je pense qu'un service peut être le mieux pour une interface plus complexe. À ce stade, vous feriez peut-être mieux de faire le reste du projet dans .Net, à moins que vous n'ayez un investissement dans NodeJS qui remplace les difficultés susmentionnées.


1
2018-04-18 08:48