Node.js调用C#代码

在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

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

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

var dotnetInitFunction = null

if (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中就能做对应的处理。以上就是关于Edge.js的一些使用方法,希望能够帮到大家!

原文地址:https://www.cnblogs.com/DamonCoding/p/8379509.html

时间: 2024-11-04 07:39:22

Node.js调用C#代码的相关文章

Meteor: 如何复用node.js包或代码

Meteor基于Node.js,但是却有自己的包管理系统(atmosphere)以及代码加载机制,且meteor是非异步的,这些都意味着,node.js包(npm package)和代码通常不能直接用于meteor程序. 这里分享三种方法以在meteor中复用node.js包和代码. meteorhacks:npm + meteorhacks:async npm+async是复用npm包最便捷的方式.meteor程序添加npm包之后,便可以在packages.json中声明包依赖,在程序中通过M

Android的WebView通过JS调用java代码

做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录,那么就会跳转到登录页面(登陆页面是另一个Activity).这个时候,一个简单的做法就是在按钮动作事件的js上调用java的方法,从而起到判断是否登录,并决定是否跳转到另一个页面. Google的WebView为我们提供了 addJavascriptInterface(Object obj, St

asp.net调用前台js调用后台代码分享

C#前台js调用后台代码 前台js <script type="text/javascript" language="javascript"> function Ceshi() { var a = "<%=Getstr()%>"; alert(a); } </script> <input type="button" onclick="Ceshi();" value=

Android的JS调用Java代码或使用了Javascript相关技术改如何混淆

http://www.androidren.com/index.php?qa=282&qa_1=android的js调用java代码或使用了javascript相关技术改如何混淆 Android 4.2开始 JS调用Java代码的时候必须加上@JavascriptInterface才能调用. 加上@JavascriptInterface之后就必须要考虑混淆时候的问题,如果混淆的时候把@JavascriptInterface搞丢了你的程序就无法调用了. 其实很简单,你只需要在混淆里面加上: -ke

用Sublime Text 3的HTML-CSS-JS Prettify(需安装node.js)插件格式化代码

用Sublime Text 3的HTML-CSS-JS Prettify(需安装node.js)插件格式化代码 用 Sublime Text 格式化代码(安装 HTML-CSS-JS Prettify 插件)时,格式化时却会提示(默认路径未找到Node.js) 下载安装到Node.js 官网下载 32位版本(据说win x64版有问题)安装. 确认Node.js安装路径鼠标右键HTML/CSS/JS Prettify > Set Plugin Options保证插件路径与Node.js安装路径一

[ios]js调用oc代码(oc)

用途:在ios开发中,经常回用到js调用oc代码的时候,例如在网页上有个拍照和打电话的按钮,想打开系统自带的拍照和电话的时候,就需要用到js调用oc代码的功能. 实现原理:在webView加载html网页的时候,没当发送一个请求,就会调用<UIWebViewDelegate>代理的 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIW

js调用后台代码的几种方式

JS调用后台方法大全 javascript函数中执行C#代码中的函数:方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中;2.在前台写一个js函数,内容为document.getElementById("btn1").click();3.在前台或后台调用js函数,激发click事件,等于访问后台c#函数: 方法二:1.函数声明为public后台代码(把public改成protected也可以)publicstringss(){return("

Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码

(从我的新浪博客上搬来的,做了一些修改.) 最近迷上了node.js以及JavaScript.现在接到一个活,要解析一个出租车点位数据的地理信息.于是就想到使用Node.js调用百度地图API进行解析. 使用的库主要就是有fs.request. // 请求包 var fs = require('fs');var request = require('request'); // 设置百度API的参数var baiduApiKey = "cQV9U4QhamoOjg6rjdOTAQSiUMxxxxx

使用 async Node.js 简化Javascript代码

async Node.js async 是Javascript的扩展库.它可以简化Node.js异步操作的书写,使代码更容易被读懂,而不是面对多层的括号发疯. 我们可以使用Node.js的包管理器npm直接安装它,在shell中输入: 1 2 npm install async 或者 更改package.json: 1 2 3 4 5 6 7 8 9 10 11 12 13 { "name": "application-name", "version&qu