在Node.js的项目中假如我们想去挪用已经用C#写的dll库该怎么办呢?在这种情况下Edge.js是一个不错的选择,,Edge.js是一款在GitHub上开源的技术,它允许Node.js和.NET core在同一个进程内彼此挪用,并且撑持Windows,MacOS和Linux。本地可以通过npm直接安置Edge.js,地点:,上面有关于它的详细介绍,里面有好多的使用情况,下文主要简单介绍此中的一种使用要领来让Node.js挪用C#的dll库。
1. 安置Edge.js
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 = null if (fs.existsSync(dllPath)) { // 1. use defalut mode dotnetFunction = 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