60

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

游戏引擎本身相当完整;测试和健壮。我希望有一些简洁的方法可以在没有太多开销的情况下公开其功能。

更新

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

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

更新 3 Edge.js 支持 node 的最新版本和带有新edge-js包的 .net 核心。

支持 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安装

4

8 回答 8

30

查看我开始的 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 代码岛,这似乎与您的场景相匹配。

于 2013-03-26T06:16:30.797 回答
27

我最近遇到了同样的挑战(需要从 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 互操作)
  • 通过 COM 对象将调用路由到 node.js 中的 V8 对象

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

于 2012-01-15T19:12:22.150 回答
18

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

皮划艇http

更新:

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

  • 服务栈(推荐)
  • 微软网络API
  • 南希外汇

据我所知,上述所有工作都适用于某个版本的 Mono,因此您仍然可以在基于 Windows 和 Unix 的系统上托管它们。

于 2011-01-26T18:46:43.123 回答
8

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

在实践中,您通常会创建一个 C# dll 库,然后从 CLI/C++ 节点插件项目中调用该库。有一些微妙之处,例如确保在没有 CLR 支持的情况下编译实际的节点添加定义文件,以便节点可以正确加载它。

您可以查看:https ://github.com/saary/node.net ,了解如何实现此目的的示例。

于 2011-11-22T22:55:54.757 回答
6

以下答案已过时,但仍然有助于从第一个版本中理解 Node.js
Node.js 现在也可以在 nodejs.org 上以原生方式用于 Windows。没有cygwin要求或其他。

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

在 GitHub 的某个地方有一个节点模块浮动,它提供了用于调用本机库的包装器,但 iirc 仅适用于.so库。

因此,如果您想使用 C# DLL,您首先必须编写一个原生 Node.js 扩展作为接口:
https ://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native -扩展/

您必须从该扩展加载 DLL 并将来自 Node.js 的调用包装到 C# 代码,这意味着您必须编写一些低级 C/C++ 代码并将 C# 值转换为 V8 内容。

我只有 C++ 和 V8 的经验,入门有点困难,因为代码示例有点稀疏,而且包装 C++ 类也不是那么简单。但我确实写过类似的小型 JS 游戏引擎,它使用 C++ OpenGL 后端,它尚未完成(几乎没有任何评论),但它可能会给你一些想法。

注意:有一些项目在某种程度上为 V8 提供了某种程度的自动包装器生成,但这些只是 C++。

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

于 2011-01-11T10:58:10.990 回答
3

Edge.js支持 node 的最新版本和带有新edge-js包的 .net 核心。

支持 Node.Js 6.x、7.x、8.x、9.x、10.x、11.x 支持 .NET

Windows/Linux/macOS 上的核心 1.0.1 - 2.x。支持 Mono 运行时

4.8.x - 5.x。

可以npm i edge-jshttps://www.npmjs.com/package/edge-js安装()

于 2019-05-20T14:44:42.387 回答
2

您可能对这个项目有一些运气,它是 Node.js 到 .NET 的一个端口。我自己没有使用过它,但是通过本机 .NET 实现,理论上你应该能够做你需要做的事情。

您可能还想转向另一个方向并尝试将您的 C# 游戏引擎移植(又名:重新编译,除非您深深地迷上了 Windows)到 Mono,然后看看您是否可以从中构建包装器。

于 2011-01-25T18:04:13.123 回答
1

我知道这是一个老问题,但想提出一个当前的答案。IIS 7.5 和 .Net 4.x 支持 Websocket,尽管使用 SignalR 库可能是阻力最小的路径。它类似于 NodeJS 的 socket.io 库。

至于通过 NodeJS 访问 .Net 代码,您最好的选择是 Edge.js,使用 C/C++ 构建混合本机程序集,通过命令行应用程序(最好使用管道进行输入/输出)或通过服务(TCP 或其他)。

我发现 Edge.js 非常有限,并且没有提供太多的管道控制台界面......并且觉得服务可能最适合更复杂的界面。此时您最好在 .Net 中完成项目的其余部分,除非您在 NodeJS 上的投资可以取代上述困难。

于 2013-04-18T08:48:29.583 回答