.net 本机扩展名 Node.js.

.net native extension for node.js

本文关键字:js Node 扩展名 本机 net      更新时间:2023-10-16

我想在node.js中使用.net dlls。这是否意味着我需要使用"clr hosting"使这些 dll 可用于 c/c++,就像

  • .NET Framework 4 托管接口或
  • 承载公共语言运行库

不幸的是,在github上创建nodejs本机.Net扩展的示例有点令人失望,只需向下滚动到最后一步

将"公共语言运行时支持

"选项更改为无公共语言运行时支持

你知道我的意思。更正以使该文章公正:它建议仅针对文件SharpAddon.cpp将该选项更改为"无公共语言运行时支持",以便您添加的其他.cpp文件将启用 CLR 支持(CLR 项目的默认值),这意味着您实际上可以使用其他.cpp文件中的 .net dll。

这个问题实际上是在 Node.js/serverside javascript 中使用 .NET DLL 的副本,它是在甚至没有原生 Windows 端口的节点的时候编写的,所以时代可能已经改变,尽管谷歌让我怀疑它。

更新:当binding.gyp文件设置正确时,node-gyp 可以自动执行以下手动步骤。有关此简化过程,请参阅此答案。


事实证明,这很容易。在与 CLR 托管作斗争并将数据传入和传出主机一段时间后,事实证明您实际上可以为节点扩展启用/clr,没有问题(到目前为止)。方法如下:

  • 按照 http://nodejs.org/api/addons.html 上的说明生成项目文件
  • 在Visual Studio中打开生成的.sln(我在VS 2010上)并在项目设置中启用/clr
  • 现在它可能不会构建,您必须让 - 在这种情况下实际上非常有用 - 错误消息引导您到与/clr 冲突的标志

我必须更改才能使其工作的标志:

  • 禁用/EHsc(C++例外)
  • 禁用/RTC1 和/RTCsu
  • 版本:将/MT 更改为/MD
  • 调试:将/MTd 更改为/MDd
  • 发布:将/GR- 更改为/GR

然后,可以像这样混合托管和非托管代码,引用 .net dll。

#pragma managed
#using <managed.dll>
void callManaged()
{
    managed::Class1^ c1 = gcnew managed::Class1();
    System::String^ result = c1->Echo("hola");
    System::Console::WriteLine("It works: " + result);
}
#pragma unmanaged
Handle<Value> Method(const Arguments& args) {
  HandleScope scope;
  callManaged();
  return scope.Close(String::New("world"));
}

更新 刚刚发现了这个链接,有一个简单的操作方法:http://joseoncode.com/2012/04/10/writing-your-first-native-module-for-node-dot-js-on-windows/

听起来像边缘.js是iisnode作者的新答案:

Edge.js 支持使用 C# 和 .NET 而不是编写本机节点.js扩展

如今,有cmake-js和node-addon-api使事情变得更容易,加上node-addon-api的ABI意味着当与较新版本的Node.js一起使用时,不需要重新编译模块。

有关简短教程,请参阅此答案:https://stackoverflow.com/a/54339042/709537