Node.js 的 .NET 原生扩展

18
我想在node.js中使用.net dll。这是否意味着我需要使用“clr hosting”在c / c ++中使那些dll可用,如.NET Framework 4 Hosting InterfacesHosting the Common Language Runtime所述?
不幸的是,在github上的创建一个nodejs本地.net扩展的示例是有点令人失望,只需滚动到最后一步:“将“公共语言运行时支持”选项更改为无公共语言运行时支持”,你就知道我的意思了。要对该文章做出更正:它建议仅针对文件SharpAddon.cpp将该选项更改为“无公共语言运行时支持”,因此您添加的其他.cpp文件将启用CLR支持(CLR项目的默认设置),这意味着您实际上可以从这些其他.cpp文件中使用.net dll。
这个问题实际上是在Node.js /服务器端JavaScript中使用.NET DLL的重复,当时甚至没有原生的Windows版本的node,所以时代可能已经改变了,尽管谷歌让我怀疑。

很难说它是否在积极开发/维护中,但如果您不需要与node.js百分之百兼容,这个链接看起来很有趣:http://newcome.wordpress.com/2010/05/08/node-net-node-js-implemented-in-javascript-on-the-net-runtime/。 - reuben
@reuben 感谢提供链接,但是针对手头的问题,我想要最稳定和性能最佳的实现方式,所以我想我只能使用原始版本了。原始版本正在快速开发中,并且最近在Windows平台上也越来越受欢迎。 - Evgeniy Berezovsky
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
  • Release版本:将/MT更改为/MD
  • Debug版本:将/MTd更改为/MDd
  • Release版本:将/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/


+1 不错。现在我有另一种方法来编写 Node.js 的本地扩展并享受 .Net 的强大功能。 - Viet
需要记住的是,每次跨越本地/CLR边界都会产生成本 - 这取决于多频繁本地调用*.net*(或反之亦然)。这个成本有多高,我还没有测量过。 - Evgeniy Berezovsky
谢谢留言。一旦您通过分析器运行程序,您可能也想分享发现,比如在您的博客上。 - Viet

6
听起来edge.js是iisnode作者的新答案:Edge.js支持使用C#和.NET,而不是编写本地node.js扩展。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接