web-dev-qa-db-fra.com

Utilisation d'un .NET DLL dans Node.js / javascript côté serveur

J'ai un projet pour animaux de compagnie qui est un jeu en ligne, l'intégralité du moteur de jeu est écrit en C # et je voudrais savoir s'il y a de toute façon je peux appeler les fonctions de cet assembly existant (.dll) à partir d'une solution construite en utilisant 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 une bonne façon d'exposer ses fonctionnalités sans trop de frais généraux.

[~ # ~] mise à jour [~ # ~] :

Pour répondre un peu à ma propre question. J'ai fini de 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é en Mono afin qu'il puisse être hébergé sur une box Linux fonctionnant en mono et donc (avec quelques ajustements) 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/ # /

MISE À JOUR 3 Edge.js prenant en charge les dernières versions du nœud et le noyau .net avec un nouveau Edge-js package.

Prise en charge de Node.Js 6.x, 7.x, 8.x, 9.x, 10.x, 11.x Prise en charge de .NET Core 1.0.1 - 2.x sous Windows/Linux/macOS. Prise en charge du runtime Mono 4.8.x - 5.x.

Peut être installé à partir de https://www.npmjs.com/package/Edge-js

58
Dve

Si tout ce que vous voulez faire est de faire tourner un serveur HTTP léger tout en continuant à programmer 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

Mise à jour:

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

  • ServiceStack (recommandé)
  • Microsoft WebAPI
  • NancyFx

À ma connaissance, tout ce qui précède fonctionne sur certaines versions de Mono, vous pouvez donc les héberger sur les systèmes Windows et Unix.

17
Khalid Abuhakmeh

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. Edge.js vous permet d'appeler du code .NET à partir de node.js et du code node.js à partir de .NET. Il rassemble les données entre .NET et node.js et réconcilie les modèles de thread entre le CLR multi-thread et le V8 à thread unique.

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

28
Tomasz Janczuk

J'ai été récemment confronté au même défi (obligation d'appeler du code C # à partir de javascript node.js). J'avais 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 DLL Assembly
  • 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, le DLL est devenu un serveur COM en cours).
  • Implémentation d'une extension node.js DLL qui instancie ma classe C # COM à l'aide de l'API COM Win32 standard et achemine les appels de méthode du 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 seule direction. J'ai également eu la nécessité de passer des appels de C # vers javascript. C'est beaucoup plus difficile. Quelqu'un doit:

  • Implémentez un objet COM dans l'extension node.js DLL (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 du temps supplémentaire, je pourrais faire un exemple de projet à partir de cela.

26
Kyberias

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

Dans la pratique, vous créez généralement une bibliothèque de DLL C # que vous appelez ensuite à partir d'un projet de module complémentaire de nœud CLI/C++. Il y a un peu de délicates telles que faire en sorte que le fichier de définition ajouté au nœud réel soit compilé sans prise en charge CLR afin que le nœud puisse le charger correctement.

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

8
saary

La réponse suivante est obsolète, mais toujours utile pour comprendre Node.js depuis la première version
Node.js est désormais également disponible en mode natif pour Windows sur nodejs.org. Aucune exigence cygwin ou autre.

Tout d'abord, pour le moment il n'y a pas de port natif Windows de Node.js, il n'y a qu'une version cygwin (mais je soupçonne que vous le saviez déjà).

Il y avait un module de nœud flottant quelque part dans les GitHubs qui fournissait des wrappers pour appeler dans les bibliothèques natives, mais iirc, qui ne fonctionnait qu'avec .so libs.

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

À partir de cette extension, vous devez charger le DLL et encapsuler les appels de Node.js au code C #, cela signifie que vous devez écrire du code C/C++ de bas niveau et convertir les valeurs C # en V8 des trucs.

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, envelopper les classes C++ n'est pas ça trivial. Mais j'ai écrit petit genre de moteur de jeu JS , qui utilise un backend C++ OpenGL, c'est inachevé (et il n'y a pratiquement pas de commentaires) mais cela pourrait vous donner quelques idées.

Remarque: Il y a quelques projets dans la nature qui fournissent une génération quelque peu automatique de wrappers à V8, mais ceux-ci sont uniquement C++.

Donc, pour conclure, je pense que ce sera assez aventureux de faire fonctionner les wrappers C #, mais cela devrait être possible.

7
Ivo Wetzel

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 de .NET, vous devriez théoriquement être capable de faire ce dont vous avez besoin.

Vous pouvez également vouloir aller dans l'autre sens et essayer de porter (alias: recompiler à moins que vous ne soyez accroché profondément à Windows) votre moteur de jeu C # à Mono et voir si vous pouvez ensuite construire des wrappers à partir de cela.

2
mattmc3

Je sais que c'est une vieille question, mais je voulais ajouter une réponse actuelle. Avec IIS 7.5 et .Net 4.x Websockets sont pris en charge, bien que l'utilisation de la bibliothèque SignalR soit probablement le chemin de moindre résistance. Elle 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, la construction d'un assemblage natif mixte avec C/C++, exposant votre code .Net soit via une application en ligne de commande (mieux utiliser des tuyaux pour les entrées/sorties) ou via un service (TCP ou autre).

Je trouve que Edge.js est très limité et n'offre pas grand-chose sur une interface de console canalisée .. et je pense qu'un service peut être le meilleur pour une interface plus complexe. À ce stade, vous feriez mieux de faire le reste du projet dans .Net, à moins que vous n'ayez un investissement dans NodeJS qui remplace lesdites difficultés.

1
Tracker1

Edge.js prenant en charge les dernières versions du nœud et le noyau .net avec un nouveau Edge-js paquet.

Prise en charge de Node.Js 6.x, 7.x, 8.x, 9.x, 10.x, 11.x Prise en charge de .NET

Core 1.0.1 - 2.x sur Windows/Linux/macOS. Prise en charge de l'exécution Mono

4.8.x - 5.x.

Peut être installé (npm i Edge-js) de https://www.npmjs.com/package/Edge-js

0
Hamit YILDIRIM