在 Node.js / 服务器端 javascript 中使用 .NET DLL

Posted

技术标签:

【中文标题】在 Node.js / 服务器端 javascript 中使用 .NET DLL【英文标题】:Using a .NET DLL in Node.js / serverside javascript 【发布时间】:2011-06-06 21:48:36 【问题描述】:

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

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

更新

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

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

更新 3 Edge.js 通过新的 edge-js 包支持 node 的最新版本和 .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.

可以从https://www.npmjs.com/package/edge-js安装

【问题讨论】:

@Dve:我现在和你差不多。编写自己的 Web 套接字服务器很难吗?我正在考虑是否也应该尝试,或者查看现有的 C# Web 服务器。更重要的是,你最终在客户端做了什么?您是刚刚将 ajax 请求发送到您的自定义服务器,还是继续使用 node.js/socket.io 客户端将请求发送到您的服务器? @Mark 该项目已暂停,但现在由于 iisnode 项目而重新投入使用 - github.com/tjanczuk/iisnode @Dve 我在同一条路上。我还是新手。你是如何从 nodejs 创建对象等的? 【参考方案1】:

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

【讨论】:

感谢有用的 edge nodejs 模块。我可以用它来调用ProtectedData.Unprotect api 来读取安全配置​​。 我真的很想找到一个导入 DLL 并使用 edge-js 运行其方法的工作示例......有什么帮助吗? 这个项目已经死了,我在为 node v15 构建版本时遇到了麻烦。【参考方案2】:

我最近遇到了同样的挑战(要求从 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 对象

如果我有一些额外的时间,我可能会以此为基础制作一个示例项目。

【讨论】:

如果你能举个例子就太好了……不过,还是为灵感而投票。 +1 - 如果你有时间,一步一步的教程会很棒。 这里还有一个,几乎按照你所说的做了,直到准备模块,但现在我被卡住了。我得到:未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集“我的带有 COM 接口的文件”或其依赖项之一。该系统找不到指定的文件。剪断将非常感谢。【参考方案3】:

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

kayakhttp

更新:

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

ServiceStack(推荐) 微软网络API NancyFx

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

【讨论】:

更新到这个答案。这些天你不必使用 Kayak。您可以使用较新版本的 ASP.Net 附带的 WebAPI。 链接断开 :( 看起来域名抢注者得到了它。【参考方案4】:

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

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

您可以查看:https://github.com/saary/node.net 有关如何实现这一点的示例。

【讨论】:

如果链接页面消失,仅使用链接的答案可能无济于事。你能像其他答案一样总结一下吗? -1 node.net 是一个红鲱鱼。检查最后一步:'将“公共语言运行时支持”选项更改为无公共语言运行时支持'。换句话说,没有CLR 这绝对是不是红鲱鱼。最后一步讨论了 node.js 插件绑定文件,它是唯一在没有 CLR 支持的情况下编译的文件(这完全有意义,因为 node.js 是本机的)。 @saary 你是完全正确的。我应该更仔细地阅读。我很抱歉。减一!【参考方案5】:

以下答案已过时,但仍有助于从第一个版本开始理解 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-extensions/

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

我只有 C++ 和 V8 方面的经验,入门有点困难,因为代码示例有点稀疏,而且包装 C++ 类也不是微不足道的。但我确实写了一个小的JS game engine kind of thing,它使用了一个 C++ OpenGL 后端,它还没有完成(几乎没有任何 cmets),但它可能会给你一些想法。

注意:有些项目可以自动生成 V8 的包装器,但这些只是 C++。

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

【讨论】:

对您的回答反应缓慢深表歉意。感谢您提供的信息,但尽管它很有趣,但感觉很混乱,这就是我一直试图避免的。我越看越看项目越希望我没有用 C# 编写整个游戏引擎,这似乎限制了我现在的选择! 不再准确。 Node 现在在 Windows 上是原生的。【参考方案6】:

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.

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

【讨论】:

【参考方案7】:

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

您可能还想换个方向,尝试将您的 C# 游戏引擎移植(又名:重新编译,除非您深入 Windows >

【讨论】:

这是another project 值得一试,类似于上面的海报,但在 V8 上运行。【参考方案8】:

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

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

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

【讨论】:

对于它的价值,我是 NodeJS 的忠实粉丝,但对它往往非常务实。 很好的建议。很高兴看到最近对较旧(但仍然有效且相关)问题的看法。

以上是关于在 Node.js / 服务器端 javascript 中使用 .NET DLL的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在服务器端使用 Node.js

如何在 Node.js 的服务器端使用 Object.values()

在Javascript(node.js,express.js,ejs)中访问服务器端变量[关闭]

黑客可以访问/复制/下载部署在Node Js上的JS服务器端代码吗?

node.js 的服务器端模板

在 node.js 中使用 fabric.js 渲染和操作服务器端画布