https://github.com/tjanczuk/edge

运行的时候会报 System.DllnotfoundException 无法加载node.dll,要把\packages\Edge.js.4.0.0\content\下edge目录复制到运行环境下。 nuget自己不会复制这个目录。

在Node.js的项目中假如我们想去调用已经用C#写的dll库该怎么办呢?在这种情况下Edge.js是一个不错的选择,Edge.js是一款在GitHub上开源的技术,它允许Node.js和.NET core在同一个进程内相互调用,并且支持Windows,MacOS和Linux。本地可以通过npm直接安装Edge.js,地址:https://www.npmjs.com/package/edge#windows,上面有关于它的详细介绍,里面有好多的使用情况,下文主要简单介绍其中的一种使用方法来让Node.js调用C#的dll库。

1. 安装Edge.js

1
npm install edge

2. Edge.js使用方法

var clrMethod = edge.func({assemblyFile: '', //程序集dll的名称typeName: '',     //类名,如果不指定,默认会找’Startup‘ 类methodName: ''    //方法名,方法必须是 Func<object,Task<object>> 且async ,如果不指定,默认会找'Invoke'方法});

3. 编写C#(NodeTest.dll)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace NodeTest
{public class Startup{public async Task<object> Invoke(string parameter){var _strResult = "the input is illegal";if (!string.IsNullOrEmpty(parameter) && parameter.Contains(",")){var a = 0;var b = 0;if (int.TryParse(parameter.Split(',')[0], out a) && int.TryParse(parameter.Split(',')[1], out b)){_strResult = (a + b).ToString();}}return _strResult;}}
}

4. Node.js调用dll

首先我们先编写dotnetFunction.js文件,这个文件中我们用于加载dll

const edge = require('edge')
const path = require('path')
const fs = require('fs')var dllPath = path.join(__dirname, 'dotnetclass/NodeTest/NodeTest/bin/Debug/NodeTest.dll')var dotnetFunction = nullif (fs.existsSync(dllPath)) {// 1. use defalut modedotnetFunction = edge.func(dllPath)
}
else {console.log('dll path does not exist')
}exports.add = function (parameter) {if (dotnetFunction !== null) {return dotnetFunction(parameter, true)} else {return 'dotnetFunction is null'}}

下面我们在nodeDotNetTest.js中来使用dotnetFunction.js中的方法

const dotnet = require('./dotnetFunction.js')var stringAdd = '1,6'
var result = dotnet.add(stringAdd)
console.log('result : ', result)

在命令行输入

node nodeDotNetTest.js

得到结果

result : 7

以上就是Node.js使用Edge.js调用C# dll的一个简单例子了。但是在平时的使用中遇到的情况往往复杂的多,比如C#代码往往注册了一些事件,这些事件被触发了以后需要通知Node.js做一些逻辑处理,这就涉及到C#调用Node.js了,在Edge.js中有C#调用js代码的功能,但是是在C#代码中嵌入js代码,并没有看到如何去调用Node中的指定方法,所以我觉得不合适,也许是我没有看到,如果有小伙伴发现请告诉我纠正。那我采用的方法就是在C#代码中新建一个队列,事件被触发了后就向这个队列中加消息,在Node.js中我们设置一个定时器不断的去从这个队列中拿数据,根据拿到的数据进行分析再进行逻辑处理,下面就是这种方法的小例子,在这里调用C# dll时我会指定对应的程序集名称、类名以及方法名。

5. 编写C#代码,Message类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace NodeTest
{public class Message{static Queue<string> _queue = new Queue<string>();public async Task<object> Init(string parameter){if (_queue != default(Queue<string>)){for (int i = 0; i < 10; i++){_queue.Enqueue(i.ToString());}return "success";}else{return "fail";}}public async Task<object> Get(string parameter){if (_queue.Count() > 0){return _queue.Dequeue();}else{return string.Empty;}}}
}

6. 编写dotnetFunction.js

const edge = require('edge')
const path = require('path')
const fs = require('fs')var dllPath = path.join(__dirname, 'dotnetclass/NodeTest/NodeTest/bin/Debug/NodeTest.dll')var dotnetFunction = nullvar dotnetInitFunction = nullif (fs.existsSync(dllPath)) {dotnetInitFunction = edge.func({assemblyFile: dllPath,typeName: 'NodeTest.Message',methodName: 'Init'})dotnetFunction = edge.func({assemblyFile: dllPath,typeName: 'NodeTest.Message',methodName: 'Get'})
}
else {console.log('dll path does not exist')
}exports.init = function () {if (dotnetInitFunction !== null) {return dotnetInitFunction("", true)} else {return 'dotnetInitFunction is null'}
}exports.getmessage = function () {if (dotnetFunction !== null) {return dotnetFunction("", true)} else {return 'dotnetFunctionis null'}
}

7. 编写nodeDotNetTest.js

const dotnet = require('./dotnetFunction.js')var initresult = dotnet.init()
console.log('init result : ', initresult)var getmessage = function () {var message = dotnet.getmessage()if (message != undefined && message !== null && message !== '') {console.log('message : ', message)}
}setInterval(getmessage, 100)

8. 命令行输入

node nodeDotNetTest.js

得到结果

init result :  success
message :  0
message :  1
message :  2
message :  3
message :  4
message :  5
message :  6
message :  7
message :  8
message :  9

可以看到,完全可以从队列中取到消息,只要能拿到消息,我们的在Node.js中就能做对应的处理。

Node.js调用C#代码相关推荐

  1. c语言node程序,如何从Node.js调用C代码?

    那么V8允许从 JavaScript调用C代码. 所以你可以有3部分代码: >正常C,不知道node.js和V8.这将是世界的地方. > Glue node.js / V8-C代码,允许J ...

  2. node.js调用ejs模板,在浏览器上打印出ejs模板内代码的解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 今天遇到一个非常奇葩的问题,node.js调用ejs模板的时候,在浏览器端居然把此模板内的所有代码都打印出来了,当时我和我的小 ...

  3. 虹软人证核验增值版-node.js调用C++SDK

    一.前言 随着5G时代的到来,人脸识别技术越来越贴近我们的生活,对于开发人员来说要面临的挑战也越来越艰巨.虹软作为国内领先的人脸识别算法厂商之一,提供了多平台多语言的人脸识别SDK,使用场景广泛.产品 ...

  4. Node.js 调用 C++ 方法 / C++ Addons 详解

    最近开发涉及到了一些Node.js调用C++的地方,于是网上搜了一下,发现网上好多文章都是比较片面的东西,没法直接使用.于是花点时间总结一下. Android开发中Java 调用C++的部分叫JNI, ...

  5. Node.JS调用企业微信API:生成渠道二维码

    目标: 通过API设置成员的"联系我"方式生成渠道标识二维码,实现标记客户扫码渠道,方便个渠道客户信息统计等. 实现环境: 白码低代码平台(该平台提供企业微信API,可直接调用,减 ...

  6. node.js调用.c文件_在Node.js中分派S3文件

    node.js调用.c文件 Some of our intranet backends use S3 storage and GraphQL APIs. It's a common scenario ...

  7. 服务器项目混淆,压缩和混淆node.js服务端代码

    压缩和混淆node.js服务端代码 在前端我们有webpack,gulp等构建工具提供了从项目结构搭建到部署打包,基本所有工作流程所需要的都被覆盖到了. 在后台node.js写的服务端却是透明,很多时 ...

  8. 压缩和混淆node.js服务端代码

    压缩和混淆node.js服务端代码 在前端我们有webpack,gulp等构建工具提供了从项目结构搭建到部署打包,基本所有工作流程所需要的都被覆盖到了. 在后台node.js写的服务端却是透明,很多时 ...

  9. rn在java中什么意思_[React Native Android 安利系列]RN中使用js调用java代码

    欢迎大家收看react-native-android系列教程,跟着本系列教程学习,可以熟练掌握react-native-android的开发,你值得拥有: 书接上节,我们上节说道,如何控制原生andr ...

最新文章

  1. irobot擦地机器人故障_懒人必备神器,电动高频擦地,科沃斯地宝T8 AIVI扫地机器人...
  2. 算法复习——凸包加旋转卡壳(poj2187)
  3. Android--获取高清的app图标
  4. 设置ALV单元格可编辑状态
  5. Python基础教程:函数及其参数
  6. VS2008制作安装包
  7. java.util.concurrent.TimeUnit
  8. android——GestureDetector.OnGestureListener 手势详解
  9. Atitit mybatis业务流程配置化管理总结 目录 1. Mybatis 1 2. 流程模型常见的bpm模式 1 2.1. 活动task 流程,getway流程控制(分支跳转 循环等) 1 3
  10. AbstractQueuedSynchronizer简单理解及介绍
  11. 产业升级再加码 鼎捷软件助力宜兴打造智造新名片
  12. 机动车合格证手机扫码开票实现方式
  13. 使用js脚本实现网页版微信定时发送信息
  14. maven本地仓库中已有jar包,项目却读取不了
  15. Android HorizontalScrollView和ScrollView 水平滚动 垂直滚动
  16. Spring boot +Mybaits
  17. relative会脱离文档流吗_position:absolute会使元素脱离文档流
  18. 回调函数注入(Callback Injection)实例汇总
  19. SWAT模型 | 运行Arcswat报错问题及解决办法 | forrt1:error(65): floating invalid解决方法
  20. SSM学生档案管理系统的设计与实现

热门文章

  1. 使用swoole编写简单的echo服务器
  2. ios辅助功能之voiceover实战
  3. 入门讲解HTML5的画布功能(1)
  4. 线性O(N)时间复杂度求素数 , 筛法
  5. OpenGL 纹理学习总结
  6. jQuery Mobile手机网站案例
  7. Python之Fabric
  8. 服务端JavaScript之Rhino
  9. Docker核心技术
  10. Eclipse启动时DDMS files not found: D:\Eclipse\adt-bundle-windows-x86_64-20131030\sdk\tool