繁体   English   中英

node.js的.net原生扩展

[英].net native extension for node.js

我想在node.js中使用.net dlls。 这是否意味着我需要使用'clr hosting',一个la来使用c / c ++制作这些dll

不幸的是,在github上 创建一个nodejs native .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冲突的标志

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

  • disable / 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/

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM