.net Node.js 的本机扩展

问题描述 投票:0回答:3

我想在node.js 中使用.net dll。这是否意味着我需要使用“clr 托管”使这些 dll 可用于 c/c++,la

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

将“公共语言运行时支持”选项更改为“无公共语言运行时支持”

你知道我的意思。更正以公正地对待该文章:建议将该选项更改为“无公共语言运行时支持”仅适用于文件

SharpAddon.cpp
,以便您添加其他.cpp文件将启用 CLR 支持(CLR 项目的默认设置),这意味着您实际上可以使用其他 .cpp 文件中的 .net dll。

这个问题实际上是 Using a .NET DLL in Node.js / serverside javascript 的重复,它是在甚至没有本机 Windows 节点端口的时候编写的,所以时代可能已经改变,尽管谷歌使我对此表示怀疑。

c# c++ .net node.js visual-c++
3个回答
13
投票

更新:当正确设置

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"));
}

更新刚刚通过一个简单的https://web.archive.org/web/20170702003703/http://joseoncode.com/2012/04/10/writing-your-first-native-module-发现了这个链接for-node-dot-js-on-windows/


6
投票

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.