web-dev-qa-db-de.com

Verwendung eines .NET DLL in Node.js / serverseitigem Javascript

Ich habe ein Lieblingsprojekt, bei dem es sich um ein Online-Spiel handelt, die gesamte Spiel-Engine ist in C # geschrieben und ich möchte wissen, ob ich die Funktionen dieser vorhandenen Assembly (.dll) aus einer mit Node.JS erstellten Lösung aufrufen kann , Socket.IO, Express etc?

Die Spiel-Engine selbst ist ziemlich vollständig. getestet und robust. Ich hoffe, dass es eine nette Möglichkeit gibt, seine Funktionalität ohne zu großen Aufwand zu präsentieren.

[~ # ~] Update [~ # ~] :

Um meine eigene Frage ein wenig zu beantworten. Ich habe den Aufbau meines eigenen Web-Socket-Servers (basierend auf dem aktuellsten Web-Socket-Protokolldokument) beendet. Es ist in C # geschrieben und mit Mono kompiliert, sodass es auf einer Linux-Box mit Mono gehostet werden kann und ich daher (mit ein paar Änderungen) meine vorhandene Spiel-Engine verwenden kann.

UPDATE 2 Ein Projekt, das genau das tut, wonach ich ursprünglich gesucht habe, existiert jetzt - http://tjanczuk.github.io/Edge/ # /

UPDATE 3 Edge.js unterstützt die letzten Versionen des Knotens und den .net-Core mit einem neuen Edge-js Paket.

Unterstützung für Node.Js 6.x, 7.x, 8.x, 9.x, 10.x, 11.x Unterstützung für .NET Core 1.0.1 - 2.x unter Windows/Linux/macOS. Unterstützung für Mono Runtime 4.8.x - 5.x.

Kann von https://www.npmjs.com/package/Edge-js installiert werden

58
Dve

Wenn Sie nur einen einfachen HTTP-Server hochfahren möchten, während Sie noch mit C # und .Net programmieren, sollten Sie Kayak eine Chance geben. Es ist ein leichter HTTP-Server für C # und verhält sich in diesem Sinne ähnlich wie node.js.

kayakhttp

Update:

Wenn Sie nach einem schlanken HTTP-Server suchen, um Webanforderungen zu verarbeiten, haben Sie heute einige Alternativen:

  • ServiceStack (empfohlen)
  • Microsoft WebAPI
  • NancyFx

Soweit ich weiß, funktionieren alle oben genannten Funktionen in einigen Versionen von Mono, sodass Sie sie weiterhin auf Windows- und Unix-basierten Systemen hosten können.

17

Schauen Sie sich das Edge.js-Projekt an, das ich gestartet habe ( http://tjanczuk.github.com/Edge ). Es bietet einen Mechanismus zum Ausführen von .NET- und node.js-Code in-process. Mit Edge.js können Sie .NET-Code aus node.js und node.js-Code aus .NET aufrufen. Es stellt Daten zwischen .NET und node.js zusammen und gleicht die Threading-Modelle zwischen Multi-Threaded-CLR und Single-Threaded-V8 ab.

Mit Edge.js können Sie über node.js auf Inseln mit bereits vorhandenem .NET-Code zugreifen, was Ihrem Szenario zu entsprechen scheint.

28
Tomasz Janczuk

Ich bin vor kurzem mit der gleichen Herausforderung konfrontiert worden (Anforderung, C # -Code von node.js Javascript aufzurufen). Ich hatte 1000 Zeilen komplexen C # -Codes, den ich wirklich nicht gerne nach Javascript portierte.

Ich habe wie folgt gelöst.

  • Der relevante C # -Code besteht im Grunde genommen aus 1-2 Klassen in einer DLL Assembly
  • Definierte eine COM-Schnittstelle, die eine Teilmenge der Schnittstelle der C # -Klasse ist, und implementierte diese Schnittstelle in der C # -Klasse. Auf diese Weise wurde die DLL zu einem In-Process-COM-Server.
  • Implementierte eine node.js-Erweiterung DLL, die meine C # COM-Klasse unter Verwendung der Standard-Win32-COM-API instanziiert und Methodenaufrufe von node.js-Javascript über die COM-Schnittstelle an C # -Code weiterleitet.

Dies löst das Problem, wenn man nur in eine Richtung telefonieren möchte. Ich hatte auch die Anforderung, Anrufe von C # nach Javascript zu tätigen. Das ist viel schwieriger. Einer muss:

  • Implementieren Sie ein COM-Objekt in der node.js-Erweiterung DLL (ATL hilft hier)
  • Übergeben Sie eine Schnittstellenreferenz dieses COM-Objekts an C # -Code (COM-Interop).
  • Leiten Sie Anrufe über das COM-Objekt an V8-Objekte in node.js weiter

Wenn ich etwas mehr Zeit habe, könnte ich vielleicht ein Beispielprojekt daraus machen.

26
Kyberias

.Net-Addons können geschrieben werden. Kurz gesagt, Sie schreiben ein reguläres natives Addon und fügen .Net-Aufrufe über CLI/C++ -Aufrufe zu .Net-DLLs hinzu.

In der Praxis erstellen Sie normalerweise eine C # -Dll-Bibliothek, die Sie dann aus einem CLI/C++ - Knoten-Addon-Projekt aufrufen. Es gibt einige Feinheiten, wie zum Beispiel sicherzustellen, dass die eigentliche Node-Add-On-Definitionsdatei ohne CLR-Unterstützung kompiliert wird, damit Node sie korrekt laden kann.

Sie können Folgendes überprüfen: https://github.com/saary/node.net , um ein Beispiel dafür zu erhalten, wie dies erreicht werden kann.

8
saary

Die folgende Antwort ist veraltet, aber immer noch hilfreich für das Verständnis von Node.js ab der ersten Veröffentlichung
Node.js ist jetzt auch für Windows unter nodejs.org verfügbar. Keine Cygwin-Anforderung oder anderweitig.

Erstens gibt es im Moment keinen nativen Windows-Port von Node.js, sondern nur eine Cygwin-Version (aber ich vermute, dass Sie das bereits gewusst haben).

Irgendwo an den GitHubs schwebte ein Knotenmodul herum, das Wrapper für den Aufruf nativer Bibliotheken bereitstellte, aber iirc, das nur mit .so - Bibliotheken funktionierte.

Wenn Sie eine C # -DLL verwenden möchten, müssen Sie daher zuerst eine native Node.js-Erweiterung als Schnittstelle schreiben:
https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/

Von dieser Erweiterung aus müssen Sie die DLL und die Aufrufe von Node.js in den C # -Code einbinden, dh Sie müssen C/C++ - Code auf niedriger Ebene schreiben und C # -Werte in V8 konvertieren Zeug.

Ich habe nur Erfahrung mit C++ und V8, der Einstieg ist etwas schwierig, da die Codebeispiele etwas spärlich sind. Auch das Umbrechen von C++ - Klassen ist nicht das trivial. Aber ich habe ein kleines Art von JS-Game-Engine geschrieben, das ein C++ OpenGL-Backend verwendet. Es ist unvollendet (und es gibt kaum Kommentare), aber es könnte Ihnen einige Ideen geben.

Hinweis: Es gibt einige Projekte in freier Wildbahn, die eine einigermaßen automatische Generierung von Wrappern für V8 ermöglichen, aber dies sind nur C++.

Abschließend denke ich, dass es ziemlich abenteuerlich sein wird, die C # -Umhüllungen zum Laufen zu bringen, aber es sollte möglich sein.

7
Ivo Wetzel

Vielleicht haben Sie etwas Glück mit diesem Projekt , das ist eine Portierung von Node.js nach .NET. Ich habe es selbst nicht benutzt, aber mit einer nativen .NET-Implementierung sollten Sie theoretisch in der Lage sein, das zu tun, was Sie brauchen.

Sie können auch in die andere Richtung gehen und versuchen, Ihre C # -Spiel-Engine auf Mono zu portieren (auch bekannt als: recompile, es sei denn, Sie sind tief in Windows eingebunden) und dann Wrapper daraus zu erstellen.

2
mattmc3

Ich weiß, dass es eine alte Frage ist, wollte aber eine aktuelle Antwort einbringen. Mit IIS 7.5 und .Net 4.x werden Websockets unterstützt, die Verwendung der SignalR-Bibliothek ist jedoch wahrscheinlich der Pfad mit dem geringsten Widerstand. Sie ähnelt der socket.io-Bibliothek für NodeJS.

Für den Zugriff auf .Net-Code über NodeJS stehen Edge.js zur Verfügung, mit denen eine gemischte native Assembly mit C/C++ erstellt und der .Net-Code entweder über eine Befehlszeilenanwendung (am besten über Pipes für die Eingabe/Ausgabe) oder über verfügbar gemacht wird ein Dienst (TCP oder andere).

Ich finde, dass Edge.js sehr begrenzt ist und nicht viel über eine Pipe-Konsole-Schnittstelle bietet. An diesem Punkt erledigen Sie möglicherweise den Rest des Projekts in .Net am besten, es sei denn, Sie haben eine Investition in NodeJS, die diese Schwierigkeiten beseitigt.

1
Tracker1

Edge.js unterstützt die letzten Versionen des Knotens und den .net-Core mit einem neuen Edge-js Paket.

Unterstützung für Node.Js 6.x, 7.x, 8.x, 9.x, 10.x, 11.x Unterstützung für .NET

Core 1.0.1 - 2.x unter Windows/Linux/macOS. Unterstützung für Mono-Laufzeit

4.8.x - 5.x.

Kann installiert werden (npm i Edge-js) von https://www.npmjs.com/package/Edge-js

0
Hamit YILDIRIM