2012-06-29 58 views
16

我想在node.js中使用.net dll。这是否意味着我需要提供与C/C++使用 'CLR托管' 这些dll,一拉.net本地扩展为node.js

不幸的是,例如 Creating a nodejs native .Net extension了在github上是有点失望,只需向下滚动到最后一步

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

你明白我的意思了。 更正该文章正义:它建议将该选项更改为“No Common Language RunTime Support”仅适用于文件SharpAddon.cpp,因此您添加的其他.cpp文件将启用CLR支持(默认为CLR项目),这意味着您实际上可以使用来自其他.cpp文件的.net dll。

这个问题实际上是Using a .NET DLL in Node.js/serverside javascript的重复,它是在没有本地Windows节点端口的情况下编写的,所以时间可能已经改变,尽管Google让我怀疑它。

+0

这是很难说,如果它正在积极开发/维护,但如果你不需要用Node.js的100%的兼容性,这看起来很有趣:HT tp://newcome.wordpress.com/2010/05/08/node-net-node-js-implemented-in-javascript-on-the-net-runtime/。 – reuben

+0

@reuben感谢您的链接,但手头的问题,我想有最稳定和执行实施的可能,所以我想我坚持用原来的,这是在一个非常快速的步伐正在开发也越来越最近在Windows平台上运行。 –

回答

11

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


原来相当简单。经过CLR托管和数据进出主机一段时间后,事实证明你实际上可以启用/ clr为你的节点扩展没问题(到目前为止)。具体方法如下:

  • 遵循http://nodejs.org/api/addons.html说明生成项目文件
  • 打开在Visual Studio(我在VS 2010中)产生的.sln,并在项目设置中启用/ 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")); 
} 

更新只是发现了一个简单的HOWTO此链接:http://joseoncode.com/2012/04/10/writing-your-first-native-module-for-node-dot-js-on-windows/

+0

+1不错。现在我有一个更编写的Node.js原生扩展,享受净 – Viet

+0

的动力方式@Viet应该牢记的是,虽然穿越原生/ CLR边界每次你这样做时招致的成本 - 这取决于* native *调用* .net *的频率(或其他方式)。成本有多高,我还没有测量。 –

+0

感谢您的注意。一旦通过分析器运行该程序,您可能也想分享研究结果,例如在您的博客上 – Viet

5

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

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