我想在 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/