在Node.js/serverside javascript中使用.NET DLL

Dve*_*Dve 58 c# serverside-javascript node.js edge.js

我有一个宠物项目是一个在线游戏,整个游戏引擎是用C#编写的,我想知道是否有任何我可以从使用Node.JS构建的解决方案中调用这个现有程序集(.dll)的功能. ,Socket.IO,Express等?

游戏引擎本身非常完整; 经过测试和强大 我希望有一些巧妙的方式来暴露它的功能,而不需要太多的开销.

更新:

为了回答我自己的问题..我已经结束了构建自己的Web套接字服务器(基于最新的Web套接字协议文档).它是用C#编写的,并使用Mono编译,因此它可以托管在运行单声道的Linux机器上,因此(通过一些调整)我可以使用我现有的游戏引擎.

更新2 一个完全符合我原本想要的项目现在存在 - http://tjanczuk.github.io/edge/#/

Tom*_*zuk 29

看看我开始的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代码岛,这似乎与您的方案相匹配.

  • 这个项目已经死了,我在构建 Node v15 版本时遇到了麻烦。 (3认同)

Kyb*_*ias 26

我最近遇到了同样的挑战(要求从node.js javascript调用C#代码).我有1000多行复杂的C#代码,我真的不喜欢移植到javascript.

我解决了如下.

  • 相关的C#代码基本上是DLL程序集中的1-2个类
  • 定义了一个COM接口,它是C#类接口的一个子集,并在C#类中实现了该接口.因此,DLL成为进程内COM服务器.
  • 实现了一个node.js扩展DLL,它使用标准的Win32 COM API实例化我的C#COM类,并使用COM接口将方法调用从node.js javascript路由到C#代码.

如果只想在一个方向上进行呼叫,这就解决了这个问题.我还要求从C#调用javascript.这要困难得多.一个人必须:

  • 在node.js扩展DLL中实现COM对象(ATL在这里有帮助)
  • 将此COM对象的接口引用传递给C#代码(COM Interop)
  • 通过COM对象将调用路由到node.js中的V8对象

也许如果我有一些额外的时间,我可能会做一个示例项目.

  • 如果你带着一个例子,它会是如此伟大......仍然,为灵感而投票. (2认同)

Kha*_*meh 18

如果你想要做的就是在使用C#和.Net进行编程的同时启动轻量级HTTP服务器,你应该给Kayak一个机会.它是C#的轻量级HTTP服务器,在这个意义上它的行为类似于node.js.

kayakhttp

更新:

如果您正在寻找轻量级HTTP服务器来处理Web请求,那么您今天有几种选择:

  • ServiceStack(推荐)
  • Microsoft WebAPI
  • NancyFx

据我所知,上面有关Mono的某些版本的所有工作,所以你仍然可以在基于Windows和Unix的系统上托管它们.


saa*_*ary 8

.Net插件可以编写,简而言之,您可以编写常规本机插件,并通过CLI/C++调用.Net dll添加.Net调用.

实际上,您通常会创建一个C#dll库,然后从CLI/C++节点addon项目调用该库.有一些美食,例如确保在没有CLR支持的情况下编译实际节点添加定义文件,因此节点可以正确加载它.

您可以查看:https://github.com/saary/node.net ,了解如何实现这一目标.


Ivo*_*zel 7

以下答案已过时,但仍然有助于从
第一版发布 Node.js了解 Node.js现在也可以在nodejs.org上本地用于Windows.没有cygwin要求或其他.

首先,目前还没有Node.js的原生Windows端口,只有一个cygwin版本(但我怀疑你已经知道了).

有一个节点模块浮动在GitHubs的某个地方,提供了用于调用本机库的包装器,但iirc只能用于.solibs.

因此,如果要使用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++类并不是那么简单.但是我确实编写了小型JS游戏引擎类的东西,它使用的是C++ OpenGL后端,它还没有完成(并且几乎没有任何评论),但它可能会给你一些想法.

注意:有些项目在野外为V8提供了一些自动生成的包装器,但这些只是C++.

总而言之,我认为让C#包装器工作会非常冒险,但它应该是可能的.

  • 不再准确.Node现在在Windows上是原生的. (2认同)