【问题标题】:How to use mixed C++ & .Net dll in node.js? (Error: abort() has been called)如何在 node.js 中使用混合 C++ 和 .Net dll? (错误: abort() 已被调用)
【发布时间】:2019-01-28 06:56:21
【问题描述】:

我想在 Visual Studio 2015 中使用包含 C++ 和 C# 代码的 dll 创建一个本机节点扩展。我无法使其按照昔日的 my own instructions 工作,它基于最新的 node-gyp

当不使用/clr选项时,我可以运行如下程序就好了。

console.log("1");
const addon = require('./build/Release/addon');
console.log("2");

启用/clr 时,只会执行第一个日志调用。在调试模式下编译 dll 时,我收到以下消息:

如何修复/调试这个?

(我知道有优势,但我正在尝试采用 node-gyp 方式)

【问题讨论】:

    标签: c++ .net node.js visual-studio-2015 clr


    【解决方案1】:

    在 VS2015 中对所有 (?) 编译器和链接器选项进行了不成功的操作后,我发现了如何设置我的 binding.gyp,以便让 .Net 工作:

    {
      "targets": [
        {
          "target_name": "addon",
          "sources": [ "hello.cc" ],
          "msbuild_settings": {
            "ClCompile": {
              "CompileAsManaged": "true",
              "ExceptionHandling": "Async",
            },
          },
        }
      ]
    }
    

    我通过成功执行以下托管和非托管代码组合来验证构建:

    #include <node.h>
    #include <v8.h>
    
    namespace demo {
    
      #pragma managed
    
      void callManaged()
      {
        System::String^ result = gcnew System::String("hola");
        System::Console::WriteLine("It works: " + result);
      }
    
      #pragma unmanaged
    
      using v8::FunctionCallbackInfo;
      using v8::Isolate;
      using v8::Local;
      using v8::Object;
      using v8::String;
      using v8::Value;
    
      void Method(const FunctionCallbackInfo<Value>& args) {
        Isolate* isolate = args.GetIsolate();
        callManaged();
        args.GetReturnValue().Set(String::NewFromUtf8(isolate, "woooooorld"));
      }
    
      void init(Local<Object> exports) {
        NODE_SET_METHOD(exports, "hello", Method);
      }
    
      NODE_MODULE(addon, init)
    
    }
    

    【讨论】:

      【解决方案2】:

      除非真的必须使用 node-gyp,否则现在应该使用 cmake-js 和 node-addon-api(提供 ABI,因此您无需为新的 Node.js 版本重新构建)。 cmake-js 的这个 CMakeLists.txt 编译混合的本机/托管代码:

      cmake_minimum_required(VERSION 2.8)
      
      project (my-addon)
      set(SOURCE_FILES src/main.cc)
      add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
      set_target_properties(${PROJECT_NAME} PROPERTIES 
        PREFIX ""
        SUFFIX ".node"
        COMMON_LANGUAGE_RUNTIME "") # "pure" and "safe" unsupported in VS 2017
      target_include_directories(${PROJECT_NAME}
        PRIVATE ${CMAKE_SOURCE_DIR}/node_modules/node-addon-api
        PRIVATE ${CMAKE_JS_INC})
      target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB})
      

      package.json 开头

      {
        "name": "my-addon",
        "version": "1.0.0",
        "description": "My node.js addon",
        "main": "main.js",
        "scripts": {
          "test": "node main.js",
          "install": "cmake-js compile"
        }
      }
      

      main.js 点赞

      var addon = require('bindings')('my-addon');
      console.log("hello: " + addon.doSomething());
      

      src/main.cc 喜欢

      #include <napi.h>
      
      namespace myaddon
      {
        #pragma managed
      
        void callManaged()
        {
          System::String^ result = gcnew System::String("hola");
          System::Console::WriteLine("It works: " + result);
        }
      
        #pragma unmanaged
      
        Napi::String MyMethod(const Napi::CallbackInfo& info) {
          Napi::Env env = info.Env();
          callManaged();
          return Napi::String::New(env, "world");
        }
      
        Napi::Object Init(Napi::Env env, Napi::Object exports) {
          exports.Set(Napi::String::New(env, "doSomething"),
                      Napi::Function::New(env, MyMethod));
          return exports;
        }
      
        NODE_API_MODULE(myaddon, Init)
      }
      

      构建,运行

      npm install bindings
      npm install node-addon-api
      npm install cmake-js
      npm install
      

      要执行,运行

      npm test
      

      【讨论】:

      • 嘿尤金,如果我只有 C# .Net 代码怎么办?你有什么想法吗?
      • @pilau 使用这种方法,您至少需要一些 C++ 作为 .Net dll 的粘合剂。我不知道 .Net 是否有一些抽象来包装 C++ 代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多