淘先锋技术网

首页 1 2 3 4 5 6 7

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)
      }
    })
  })
}