18

我想在 node.js 中使用 .net dll。这是否意味着我需要使用 'clr hosting' 让这些 dll 与 c/c++ 一起使用,a la

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

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

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

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

4

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

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

于 2012-07-09T04:21:05.200 回答
6

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

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

于 2013-04-01T05:09:14.007 回答
0

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

请参阅此答案以获取简短教程:https ://stackoverflow.com/a/54339042/709537

于 2019-01-24T03:44:16.430 回答