我想在node.js 中使用.net dll。这是否意味着我需要使用“clr 托管”使这些 dll 可用于 c/c++,la
不幸的是,github上的示例创建一个nodejs本机.Net扩展有点令人失望,只需向下滚动到最后一步
将“公共语言运行时支持”选项更改为“无公共语言运行时支持”
你知道我的意思。更正以公正地对待该文章:建议将该选项更改为“无公共语言运行时支持”仅适用于文件
SharpAddon.cpp
,以便您添加其他.cpp文件将启用 CLR 支持(CLR 项目的默认设置),这意味着您实际上可以使用其他 .cpp 文件中的 .net dll。
这个问题实际上是 Using a .NET DLL in Node.js / serverside javascript 的重复,它是在甚至没有本机 Windows 节点端口的时候编写的,所以时代可能已经改变,尽管谷歌使我对此表示怀疑。
更新:当正确设置
binding.gyp
文件时,node-gyp可以自动执行以下手动步骤。请参阅此答案了解此简化程序。
事实证明这相当容易。在与 CLR 托管和从主机获取数据进出主机斗争一段时间后,事实证明 您实际上可以为您的节点扩展启用 /clr 没有问题(到目前为止)。方法如下:
我必须更改才能使其工作的标志:
然后您可以像这样混合托管和非托管代码,引用您的 .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"));
}
听起来edge.js是iisnode作者的新答案:
Edge.js支持使用C#和.NET,而不是编写原生node.js扩展
如今,有了 cmake-js 和 node-addon-api 让事情变得更容易,再加上 node-addon-api 的 ABI 意味着该模块在与较新版本的 Node 一起使用时不需要重新编译.js.
有关简短教程,请参阅此答案:https://stackoverflow.com/a/54339042/709537