59 votes

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

J'ai un petit projet qui est un jeu en ligne, l'ensemble du moteur de jeu est écrit en C# et je voudrais savoir s'il y a un moyen d'appeler les fonctions de cette assemblée existante (.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 existe un moyen efficace d'exposer ses fonctionnalités sans trop de frais généraux.

UPDATE :

Pour répondre un peu à ma propre question J'ai fini de construire mon propre serveur web socket (basé sur le document le plus récent du protocole web socket). Il est écrit en C# et compilé en utilisant Mono de sorte qu'il peut être hébergé sur une boîte Linux exécutant mono et donc (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/#/

MISE À JOUR 3 Edge.js prenant en charge les dernières versions de node et .net core avec une nouvelle 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. Support pour le runtime Mono 4.8.x - 5.x.

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

0 votes

@Dve : Je suis à peu près dans le même bateau que toi maintenant. Était-il difficile d'écrire votre propre serveur de sockets web ? Je me demande si je dois essayer ça aussi, ou regarder les serveurs web C# existants. Plus important encore, qu'avez-vous fait du côté client ? Avez-vous simplement envoyé des requêtes ajax à votre serveur personnalisé, ou avez-vous continué à utiliser node.js/socket.io côté client pour envoyer les requêtes à votre serveur ?

0 votes

@Mark le projet est allé sur l'attente, mais est maintenant de retour dans l'action grâce au projet iisnode - github.com/tjanczuk/iisnode

0 votes

@Dve Je suis sur le même chemin. Je suis encore nouveau dans le domaine de l'edge. Comment avez-vous créé des objets et autres à partir de nodejs ?

30voto

Tomasz Janczuk Points 1391

Consultez le projet edge.js que j'ai lancé ( http://tjanczuk.github.com/edge ). Il fournit un mécanisme permettant d'exécuter du code .NET et node.js en cours de processus. Edge.js vous permet d'appeler du code .NET depuis node.js et du code node.js depuis .NET. Il met en commun les données entre .NET et node.js et concilie les modèles de threads entre le CLR multithread et le V8 single thread.

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

0 votes

Merci pour l'utilité du module edge nodejs. Je pourrais l'utiliser pour appeler ProtectedData.Unprotect api pour lire la configuration sécurisée.

0 votes

J'essaie vraiment de trouver un exemple fonctionnel d'importation d'une DLL et d'exécution de ses méthodes à l'aide d'edge-js... Une aide ?

3 votes

Ce projet est mort, j'ai eu des difficultés à construire une version pour node v15.

27voto

Kyberias Points 999

J'ai été récemment confronté au même défi (obligation d'appeler du code C# à partir de node.js javascript). J'avais des milliers de lignes de code C# complexe que je n'aimais vraiment pas porter en javascript.

Je l'ai résolu comme suit.

  • Le code C# correspondant est essentiellement composé de 1 ou 2 classes dans un assemblage DLL.
  • Définir une interface COM qui est un sous-ensemble de l'interface de la classe C# et implémenter cette interface dans la classe C#. Ainsi, la DLL est devenue un serveur COM en cours de traitement.
  • Mise en œuvre d'une DLL d'extension node.js qui instancie ma classe COM C# à l'aide de l'API COM standard Win32 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 ne veut faire que des appels dans une seule direction. J'avais également besoin de faire des appels de C# vers javascript. C'est beaucoup plus difficile. Il faut :

  • Implémenter un objet COM dans la DLL de l'extension node.js (ATL est utile 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 projet d'exemple.

2 votes

Ce serait tellement bien si vous veniez avec un exemple... Quand même, j'ai voté pour l'inspiration.

0 votes

+1 - si vous avez le temps, un tutoriel étape par étape serait génial.

1 votes

Une dernière chose ici, j'ai fait à peu près ce que vous disiez, jusqu'à la préparation du module, mais maintenant je suis bloqué. J'obtiens : Unhandled Exception : System.IO.FileNotFoundException : Impossible de charger le fichier ou l'assemblage 'Mon fichier avec interface COM' ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié. Un extrait serait le bienvenu.

18voto

Khalid Abuhakmeh Points 4711

Si tout ce que vous voulez faire est de créer un serveur HTTP léger tout en continuant à programmer avec C# et .Net, vous devriez donner une chance à Kayak. Il s'agit d'un serveur HTTP léger pour C# qui se comporte un peu comme node.js dans ce sens.

kayakhttp

Mise à jour :

Si vous êtes à la recherche d'un serveur HTTP léger pour traiter les requêtes web, vous disposez aujourd'hui de plusieurs alternatives :

  • ServiceStack (recommandé)
  • Microsoft WebAPI
  • NancyFx

À ma connaissance, toutes les applications ci-dessus fonctionnent avec une version de Mono, de sorte que vous pouvez les héberger sur des systèmes Windows et Unix.

0 votes

Mise à jour de cette réponse. Vous n'êtes pas obligé d'utiliser Kayak de nos jours. Vous pouvez utiliser WebAPI qui est livré avec la nouvelle version d'ASP.Net.

0 votes

Lien cassé :( On dirait que les squatters du domaine l'ont eu.

8voto

saary Points 71

Il est possible d'écrire des addons .Net. En résumé, vous écrivez un addon natif normal et vous ajoutez des appels .Net via des appels CLI/C++ vers des dlls .Net.

En pratique, vous créez généralement une bibliothèque dll C# que vous appelez ensuite à partir d'un projet d'addon CLI/C++ node. Il y a un peu de délicatesse comme s'assurer que le fichier de définition de l'addon node est compilé sans support CLR pour que node puisse le charger correctement.

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

1 votes

Les réponses ne contenant que des liens peuvent être inutiles si la page liée disparaît. Pouvez-vous la résumer un peu comme le font les autres réponses ?

0 votes

-1 node.net est un hareng rouge. Vérifiez la dernière étape : "Changez l'option "Common Language Runtime Support" en No Common Language RunTime Support". En d'autres termes, pas de CLR

0 votes

C'est très certainement no un hareng rouge. La dernière étape parle du fichier de liaison de l'addon node.js qui est le seul fichier compilé sans support CLR (ce qui est tout à fait logique puisque node.js est natif).

6voto

Ivo Wetzel Points 27802

La réponse suivante n'est plus d'actualité, mais elle reste utile pour comprendre Node.js depuis sa première version.
Node.js est désormais également disponible en version native pour Windows sur nodejs.org. Aucune exigence de cygwin ou autre.

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

Il y avait un module node flottant quelque part dans les GitHubs qui fournissait des enveloppes pour appeler les bibliothèques natives, mais il me semble qu'il ne fonctionnait qu'avec le module .so libs.

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

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

Je n'ai de l'expérience qu'avec le C++ et le V8, c'est un peu difficile de commencer car les exemples de code sont un peu clairsemés, aussi l'habillage des classes C++ n'est pas que triviale. Mais j'ai écrit de petites Moteur de jeu JS qui utilise un backend C++ OpenGL, il n'est pas terminé (et il n'y a pratiquement pas de commentaires) mais il peut vous donner quelques idées.

Nota: Il existe quelques projets dans la nature qui fournissent une génération quelque peu automatique de wrappers pour V8, mais ils ne concernent que le C++.

Pour conclure, je pense qu'il sera assez difficile de faire fonctionner les wrappers C#, mais cela devrait être possible.

0 votes

Toutes mes excuses pour la lenteur de ma réponse. Merci pour l'information, mais aussi intéressante qu'elle soit, elle semble trop désordonnée et c'est ce que j'ai essayé d'éviter. Plus je regarde le projet, plus je souhaite ne pas avoir codé l'ensemble du moteur de jeu en C#, ce qui semble limiter mes options maintenant !

3 votes

Ce n'est plus exact. Node est natif sur Windows maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X