node.js的.net原生扩展

Eug*_*sky 16 .net c# c++ visual-c++ node.js

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

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

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

而且你知道我的意思.更正做到这一点的文章正义:它建议更改选项设置为"无公共语言运行库支持" 只为文件SharpAddon.cpp添加将CLR支持启用(对于CLR项目的默认值),那么其他的.cpp-文件,这意味着事实上你可以从其他.cpp文件中使用.net dll.

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

Eug*_*sky 11

更新:当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"));
}
Run Code Online (Sandbox Code Playgroud)

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


CJ *_*ath 6

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

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