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

我有一个在线游戏的宠物项目,整个游戏引擎是用C#编写的,我想知道是否可以从Node.JS构build的解决scheme中调用此现有程序集(.dll)的函数,Socket.IO,Express等?

游戏引擎本身是相当完整的; 经过testing和强大。 我希望有一些干净的方式暴露其function没有太多的开销。

更新

为了回答我自己的问题一点..我已经结束了我自己的networking套接字服务器(基于最新的networking套接字协议文件)。 它是用C#语言编写的,使用Mono进行编译,因此可以在一个运行mono的Linux机器上运行,因此可以使用我现有的游戏引擎。

更新2一个项目,正是我最初寻找的东西现在存在 – http://tjanczuk.github.io/edge/#/

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

kayakhttp

更新:

如果你正在寻找一个轻量级的HTTP服务器来处理Web请求,你今天有几个select:

  • ServiceStack(推荐)
  • 微软WebAPI
  • NancyFx

据我所知,以上所有的工作都是在Mono的某个版本上进行的,所以你仍然可以在基于Windows和Unix的系统上托pipe它们。

我最近面临着同样的挑战(需要从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对象

也许如果我有一些额外的时间,我可以做一个例子项目。

查看我开始的edge.js项目( http://tjanczuk.github.com/edge )。 它提供了一个在线运行.NET和node.js代码的机制。 Edge.js允许你从.NET的node.js和node.js代码中调用.NET代码。 它将.NET和node.js之间的数据进行编组,并协调multithreadingCLR和单线程V8之间的线程模型。

使用edge.js,您可以从node.js访问预先存在的.NET代码岛,这似乎与您的scheme相匹配。

.Net插件可以被编写,简而言之,你可以编写一个普通的本地插件,并通过CLI / C ++调用添加.Net调用.Net dll。

在实践中,通常会创build一个C#dll库,然后通过CLI / C ++节点插件项目调用该库。 有一些美食,如确保定义文件上的实际节点添加没有CLR支持编译,所以节点可以正确地加载它。

您可以查看: https : //github.com/saary/node.net ,了解如何实现这个function。

下面的答案是过时的,但仍然有助于理解第一版本的Node.js
Node.js现在也可以在nodejs.org的本地Windows上使用。 没有cygwin的要求或其他。

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

在GitHubs的某个地方有一个节点模块,它提供了用于调用本地库的包装器,但是iirc只能用于.so库。

因此,如果你想使用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.js到.NET的一个端口。 我自己并没有使用它,但是在本地.NET实现中,理论上你应该能够做到你所需要的。

你也可能想走向另一个方向,尝试将你的C#游戏引擎移植到Mono,然后看看你是否可以用它来构build包装器(也就是说,重新编译,除非你深入Windows)。

我知道这是一个古老的问题,但想要抛出一个当前的答案。 使用IIS 7.5和.Net 4.x Websockets是受支持的,尽pipe使用SignalR库可能是阻力最小的path。 它类似于NodeJS的socket.io库。

至于通过NodeJS访问.Net代码,你最好的select是Edge.js,用C / C ++构build一个混合的本地程序集,通过命令行应用程序(最好使用pipe道input/输出)或者通过一个服务(TCP或其他)。

我觉得Edge.js是非常有限的,并没有提供太多的pipe道控制台界面..并觉得一个服务可能是一个更复杂的界面最好的。 在这种情况下,您最好在.Net中完成项目的其余部分,除非您在NodeJS上进行投资来取代上述困难。