如何在nodejs中调用C# dll

Edge.js

GitHub
NPM package

环境要求

1.支持Node.Js 14.x, 16.x, 18.x, 19.x
2.支持 .NET Core 1.0.1 - 6.x - Windows/Linux/macOS

nodejs中调用C# dll

下载并安装 .NET 6.0 SDK

npm install edge-js

C#中的代码:
注意事项:

  1. 方法必须用async异步修饰,且返回值必须为Task < object >
  2. 不能用静态方法,且方法需要为public
using HDEC.CS.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace HDEC.CS   //命名空间
{
    public class CSGeometryReader  //类名
    {
         //方法名
        public async Task<object> GetCSMesh(string byteArrayJson) 
        {
            try
            {
                var geo = Newtonsoft.Json.JsonConvert.DeserializeObject<byte[]>(byteArrayJson);
                var mesh = CSGeometry.Deserialize(geo, typeof(CSMesh));
                return  Newtonsoft.Json.JsonConvert.SerializeObject(mesh);
            }
            catch(Exception e)
            {
                return e.Message + e.StackTrace;
            }
        }

    }
}

nodejs中的代码:
C#源码编译成dll后就可以在nodejs中使用
DLL文件的路径注意事项:

  1. 如果用相对路径,dll必须和js文件放在一个目录下
  2. 用绝对路径,dll和js文件可以不在一个目录下
process.env.EDGE_USE_CORECLR = 1 //这行不加会报错

const sqlite3 = require("sqlite3")
const edge = require('edge-js')

main()

async function main () {
  const dbPath = './new-ss.db'
  const csDb = new sqlite3.Database(dbPath);
  const queryElements = "SELECT Id, Geometry FROM CDElement WHERE IsDeleted = 0"
  const dbElements = await queryDbElements(csDb, queryElements)
  console.log(dbElements)
}

async function queryDbElements (db, sql) {
  return new Promise((resolve) => {

    const readGeom = edge.func({

      assemblyFile: 'CSGeometryReader.dll', // DLL文件的路径

      typeName: 'HDEC.CS.CSGeometryReader', // 命名空间.类名

      methodName: 'GetCSMesh' // 方法名

    });

    const result = []

    db.all(sql, [], (_err, rows) => {
      if (rows == undefined) {
        resolve(undefined)
      } else {
        for (const row of rows) {

          const arrByte = Array.from(row.Geometry)

          const input = JSON.stringify(arrByte)

          readGeom(input, (error, res) => {

            const geom = JSON.parse(res.toString())
            const id = row.Id

            if (error) {
              throw error
            }

            result.push({ id, geom })
          });
        }
        resolve(result)
      }
    })
  })
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
使用Node.js的Addon可以方便地加载和调用DLL(动态链接库)。 首先,我们需要创建一个C++的Addon模块。在该模块,我们可以使用`LoadLibrary`函数加载DLL,并使用`GetProcAddress`函数获取DLL定义的函数指针。 下面是一个示例代码: ```cpp #include <node.h> // 声明DLL函数指针类型 typedef int (*MY_FUNCTION)(int); // 在Addon模块导出的函数 void CallDLLFunction(const v8::FunctionCallbackInfo<v8::Value>& args) { // 加载DLL HMODULE hModule = LoadLibrary("path/to/dll"); if (hModule) { // 获取DLL的函数指针 MY_FUNCTION myFunction = (MY_FUNCTION)GetProcAddress(hModule, "FunctionName"); if (myFunction) { // 调用DLL函数 int result = myFunction(10); // 返回结果 args.GetReturnValue().Set(result); } else { // 获取函数指针失败 args.GetReturnValue().Set(-1); } // 卸载DLL FreeLibrary(hModule); } else { // 加载DLL失败 args.GetReturnValue().Set(-1); } } // 注册Addon模块 void Initialize(v8::Local<v8::Object> exports) { NODE_SET_METHOD(exports, "callDLLFunction", CallDLLFunction); } NODE_MODULE(addon, Initialize) ``` 在Node.js,我们可以使用Addon模块导出的`callDLLFunction`函数来调用DLL。 ```javascript const addon = require('./addon'); // 调用DLL函数 const result = addon.callDLLFunction(); console.log(result); ``` 需要确保将DLL所在的路径替换为`LoadLibrary`函数的实际路径,并将`GetProcAddress`函数的`FunctionName`替换为DLL实际的函数名。 通过这种方式,我们可以利用Node.js的Addon功能方便地加载和调用DLL,从而扩展Node.js的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔法战胜魔法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值