Node.js调用C#代码
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#代码相关推荐
- c语言node程序,如何从Node.js调用C代码?
那么V8允许从 JavaScript调用C代码. 所以你可以有3部分代码: >正常C,不知道node.js和V8.这将是世界的地方. > Glue node.js / V8-C代码,允许J ...
- node.js调用ejs模板,在浏览器上打印出ejs模板内代码的解决方案
2019独角兽企业重金招聘Python工程师标准>>> 今天遇到一个非常奇葩的问题,node.js调用ejs模板的时候,在浏览器端居然把此模板内的所有代码都打印出来了,当时我和我的小 ...
- 虹软人证核验增值版-node.js调用C++SDK
一.前言 随着5G时代的到来,人脸识别技术越来越贴近我们的生活,对于开发人员来说要面临的挑战也越来越艰巨.虹软作为国内领先的人脸识别算法厂商之一,提供了多平台多语言的人脸识别SDK,使用场景广泛.产品 ...
- Node.js 调用 C++ 方法 / C++ Addons 详解
最近开发涉及到了一些Node.js调用C++的地方,于是网上搜了一下,发现网上好多文章都是比较片面的东西,没法直接使用.于是花点时间总结一下. Android开发中Java 调用C++的部分叫JNI, ...
- Node.JS调用企业微信API:生成渠道二维码
目标: 通过API设置成员的"联系我"方式生成渠道标识二维码,实现标记客户扫码渠道,方便个渠道客户信息统计等. 实现环境: 白码低代码平台(该平台提供企业微信API,可直接调用,减 ...
- 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 ...
- 服务器项目混淆,压缩和混淆node.js服务端代码
压缩和混淆node.js服务端代码 在前端我们有webpack,gulp等构建工具提供了从项目结构搭建到部署打包,基本所有工作流程所需要的都被覆盖到了. 在后台node.js写的服务端却是透明,很多时 ...
- 压缩和混淆node.js服务端代码
压缩和混淆node.js服务端代码 在前端我们有webpack,gulp等构建工具提供了从项目结构搭建到部署打包,基本所有工作流程所需要的都被覆盖到了. 在后台node.js写的服务端却是透明,很多时 ...
- rn在java中什么意思_[React Native Android 安利系列]RN中使用js调用java代码
欢迎大家收看react-native-android系列教程,跟着本系列教程学习,可以熟练掌握react-native-android的开发,你值得拥有: 书接上节,我们上节说道,如何控制原生andr ...
最新文章
- irobot擦地机器人故障_懒人必备神器,电动高频擦地,科沃斯地宝T8 AIVI扫地机器人...
- 算法复习——凸包加旋转卡壳(poj2187)
- Android--获取高清的app图标
- 设置ALV单元格可编辑状态
- Python基础教程:函数及其参数
- VS2008制作安装包
- java.util.concurrent.TimeUnit
- android——GestureDetector.OnGestureListener 手势详解
- Atitit mybatis业务流程配置化管理总结 目录 1. Mybatis	1 2. 流程模型常见的bpm模式	1 2.1. 活动task 流程,getway流程控制(分支跳转 循环等)	1 3
- AbstractQueuedSynchronizer简单理解及介绍
- 产业升级再加码 鼎捷软件助力宜兴打造智造新名片
- 机动车合格证手机扫码开票实现方式
- 使用js脚本实现网页版微信定时发送信息
- maven本地仓库中已有jar包,项目却读取不了
- Android HorizontalScrollView和ScrollView 水平滚动 垂直滚动
- Spring boot +Mybaits
- relative会脱离文档流吗_position:absolute会使元素脱离文档流
- 回调函数注入(Callback Injection)实例汇总
- SWAT模型 | 运行Arcswat报错问题及解决办法 | forrt1:error(65): floating invalid解决方法
- SSM学生档案管理系统的设计与实现