web-dev-qa-db-ja.com

.NET DLL Node.js /サーバー側javascriptでの使用

オンラインゲームであるペットプロジェクトがあり、ゲームエンジン全体がC#で記述されており、Node.JSを使用して構築されたソリューションからこの既存のアセンブリ(.dll)の関数を呼び出すことができるかどうかを知りたい、Socket.IO、Expressなど?

ゲームエンジン自体はかなり完成しています。テスト済みで堅牢です。私は、あまりにも多くのオーバーヘッドなしでその機能を公開するきちんとした方法があることを望んでいます。

[〜#〜] update [〜#〜]

私自身の質問に少し答えるために..(最新のWebソケットプロトコルドキュメントに基づいて)独自のWebソケットサーバーの構築を終了しました。 C#で記述され、Monoを使用してコンパイルされているため、monoを実行しているLinuxボックスでホストできるため、既存のゲームエンジンを(少し調整して)使用できます。

UPDATE 2私が当初探していたものを正確に実行するプロジェクトが存在します- http://tjanczuk.github.io/Edge/ #/

UPDATE 3Edge.jsは、新しいEdge-jsパッケージ。

Node.Js 6.x、7.x、8.x、9.x、10.x、11.xのサポートWindows/Linux/macOSでの.NET Core 1.0.1-2.xのサポート。 Monoランタイム4.8.x-5.xのサポート。

https://www.npmjs.com/package/Edge-js からインストールできます

58
Dve

C#と.Netでプログラミングしながら軽量のHTTPサーバーを起動するだけであれば、Kayakにチャンスを与える必要があります。 C#用の軽量HTTPサーバーであり、その意味でnode.jsのように動作します。

kayakhttp

更新:

Webリクエストを処理する軽量のHTTPサーバーを探しているなら、今日いくつかの選択肢があります。

  • ServiceStack(推奨)
  • Microsoft WebAPI
  • NancyFx

私の知る限り、上記のすべてはMonoの一部のバージョンで機能するため、WindowsおよびUnixベースのシステムでホストすることができます。

17

私が始めたEdge.jsプロジェクトをチェックしてください( http://tjanczuk.github.com/Edge )。インプロセスで.NETおよびnode.jsコードを実行するためのメカニズムを提供します。 Edge.jsでは、node.jsから.NETコードを、.NETからnode.jsコードを呼び出すことができます。 .NETとnode.jsの間でデータをマーシャリングし、マルチスレッドCLRとシングルスレッドV8の間でスレッドモデルを調整します。

Edge.jsを使用して、node.jsから既存の.NETコードのアイランドにアクセスできます。これはシナリオに一致しているようです。

28
Tomasz Janczuk

最近、同じ課題に直面しました(node.js javascriptからC#コードを呼び出す必要があります)。私は本当にJavaScriptに移植したくない複雑なC#コードを何千行も持っていました。

次のように解決しました。

  • 関連するC#コードは、基本的にDLL Assembly
  • C#クラスのインターフェイスのサブセットであるCOMインターフェイスを定義し、そのインターフェイスをC#クラスに実装しました。したがって、DLLはインプロセスCOMサーバーになりました。
  • Node.js拡張を実装しましたDLL標準のWin32 COM APIを使用してC#COMクラスをインスタンス化し、COMインターフェイスを使用してnode.js javascriptからC#コードにメソッド呼び出しをルーティングします。

これは、1方向にのみ呼び出しを行う場合の問題を解決します。また、C#からjavascriptを呼び出す必要がありました。これはかなり難しいです。 1つは:

  • Node.js拡張でCOMオブジェクトを実装するDLL(ATLはここで役立ちます)
  • このCOMオブジェクトのインターフェイス参照をC#コードに渡します(COM Interop)
  • COMオブジェクトを介してnode.jsのV8オブジェクトに呼び出しをルーティングする

余分な時間があれば、これからサンプルプロジェクトを作成するかもしれません。

26
Kyberias

.Netアドオンを作成できます。つまり、通常のネイティブアドオンを作成し、CLI/C++呼び出しを介して.Net dllに.Net呼び出しを追加します。

実際には、通常C#dllライブラリを作成し、CLI/C++ノードアドオンプロジェクトから呼び出します。実際のノードアドオン定義ファイルがCLRのサポートなしでコンパイルされていることを確認するなど、ノードが正しくロードできるようにするためのちょっとした工夫があります。

以下を確認できます。 https://github.com/saary/node.net これを実現する方法の例。

8
saary

次の回答は古くなっていますが、最初のリリースからNode.jsを理解するのにまだ役立ちます
Node.jsは、nodejs.orgでWindows用にネイティブで利用できるようになりました。 cygwinの要件などはありません。

まず、Node.jsのネイティブWindowsポートは現時点ではありません。cygwinバージョンしかありません(ただし、既に知っていると思います)。

GitHubsのどこかにノードモジュールがあり、ネイティブライブラリを呼び出すためのラッパーを提供していましたが、iircは.so libsでのみ機能しました。

したがって、C#DLLを使用する場合は、最初にインターフェイスとしてネイティブNode.js拡張を記述する必要があります。
https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/

その拡張機能からDLLをロードし、Node.jsからC#コードへの呼び出しをラップする必要があります。つまり、低レベルのC/C++コードを記述し、C#値をV8に変換する必要があります。もの。

私はC++とV8の経験しかありませんが、コード例が少しまばらなので、始めるのは少し難しいです。また、C++クラスのラッピングはthat簡単ではありません。しかし、私は小さな JSゲームエンジンのようなもの を書きました。これはC++ OpenGLバックエンドを使用し、未完成です(そしてほとんどコメントがありません)が、いくつかのアイデアを与えるかもしれません。

注:V8に多少自動でラッパーを生成するプロジェクトがいくつかありますが、それらはC++のみです。

結論として、C#ラッパーを機能させるのは非常に冒険的だと思いますが、可能であるべきです。

7
Ivo Wetzel

幸運かもしれません このプロジェクトで 、これはNode.jsの.NETへの移植です。私自身は使用していませんが、ネイティブの.NET実装を使用すれば、理論的には必要なことを実行できるはずです。

また、別の方向に進み、C#ゲームエンジンをMonoに移植(別名:Windowsに夢中になっていない限り再コンパイル)して、それからラッパーを構築できるかどうかを確認することもできます。

2
mattmc3

私はそれが古い質問であることを知っていますが、現在の答えを投げ入れたかったのです。 IIS 7.5および.Net 4.x Websocketがサポートされていますが、SignalRライブラリの使用が最も抵抗の少ないパスになる可能性があります。NodeJSのsocket.ioライブラリに似ています。

NodeJSを介して.Netコードにアクセスする場合、最適なオプションはEdge.jsです。C/ C++でネイティブアセンブリを混合し、コマンドラインアプリケーション(入出力にパイプを使用するのが最適)またはサービス(TCPまたはその他)。

Edge.jsは非常に限定的であり、パイプ接続されたコンソールインターフェイスではあまり提供されないことがわかりました。サービスは、より複雑なインターフェイスに最適であると感じています。その時点で、前述の困難に取って代わるNodeJSに投資しない限り、.Netでプロジェクトの残りの部分を実行するのが最善かもしれません。

1
Tracker1

Edge.js新しいEdge-jsパッケージでノードの最新バージョンと.netコアをサポートします。

Node.Js 6.x、7.x、8.x、9.x、10.x、11.xのサポート.NETのサポート

Core 1.0.1-Windows/Linux/macOS上の2.x。 Monoランタイムのサポート

4.8.x-5.x。

インストール可能(npm i Edge-js)from https://www.npmjs.com/package/Edge-js

0
Hamit YILDIRIM