c# - node.js 的 .net native 扩展

标签 c# c++ .net node.js visual-c++

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

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

Change the "Common Language Runtime Support" option to No Common Language RunTime Support

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

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

最佳答案

更新:当 binding.gyp 文件设置正确时,node-gyp 可以自动执行以下手动步骤。见 this answer对于这个简化的程序。


事实证明这很容易。在与 CLR 托管和将数据进出主机苦苦挣扎了一段时间之后,事实证明 您实际上可以为您的 Node 扩展启用/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/

关于c# - node.js 的 .net native 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11257690/

相关文章:

c# linq nested "conditional/composite"分组

c++ - Rad Studio 调试器线程中未处理的异常

c# - Orchard CMS 部分放置

c# - 在 Linq 中使用分组创建字典(字典)

c# - 如何添加 JwtBearer 和 AddMicrosoftIdentityWebAppAuthentication

c# - 如何使用 Web 应用程序/WebAPI 验证 Azure AD 中的用户凭据

C# generics - 我可以让 T 成为两个选择之一吗?

c++ - 无法使用 QMediaPlayer 播放电影

C++ 对自动(堆栈)指针使用运算符删除

c# - 安装包 : Unable to find package 'WebActivator'