JS与C#的交互

原文链接:https://blog.csdn.net/Marcus2006/article/details/104986130

背景:1. 为了最大限度复用我们自己之前写的C#库的功能

           2. 给我们的工具只提供了JS的流程(:<) ,组织忽悠其他人员C#难用,JS好用。

目前edge-js提供了强大的JS与CLR的交互能力,任何属于CLR的语言都可以与JS交互。其实edge-JS是edge编译出来的JS版,可以被JS用来和C#交互。之前我尝试用nodeJS(12.16.1)+VS2017+VS2015 BuildTools编译edge,老是报错就放弃了。后来被告知edge-js有编译好的对应node版本,就用上了。

效果:nodeJS项目成功与C#库交互,nodeJS的传给callback也能被正确调用。

环境:Win10 Pro 64bit , VS2017 , NodeJS12.16.1 (64bit)

业务流程:

     1. JS传 1和2 给C#

     2. C#计算传进来的1+2的和 ,即3

      3. C#调用JS的callback,把3传给JS

      4. JS的callback把传进来的结果+1,即4 ,再传回C#

      5. C#调用另一个functon把结果乘以2得到8,返回JS显示最终结果

实现步骤:

1. 创建一个简单的C# dll项目

NodeJS与C#项目要一致,这里都是64位,否则NodeJS报错,只显示error,没有详细信息,很难debug。

注:C# 选AnyCPU都不行。

2. 生成NodeJS项目,安装edge-js npm包

3. 编写方法给JS用.这部分代码是参考edge的How to: call Node.js from C# 写的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace calc
{
    public class Class1
    {
         public async Task<object> IAdd(dynamic input)
        {
            await Task.Delay(0);
            int a = (int)input.a;
            int b = (int)input.b;
            Func<dynamic, Task<object>> c = (Func<dynamic, Task<object>>)input.c;
            var rc=  await  c(a+b); //JS callback返回的结果
            System.Diagnostics.Debug.WriteLine("Result from JS callback is "+rc);
            return Add((int)rc);
        }
        public int Add(int rc)
        {
            return rc*2;
        }
    }
}

4. 编写JS代码。

 
var edgeJS = require('edge-js');
 
var iadd = edgeJS.func({
    assemblyFile: 'calc/calc/bin/x64/Debug/calc.dll',
    typeName: 'calc.Class1',
    methodName: 'IAdd' // This must be Func<object,Task<object>>
});
var input={a:1,
    b:2,
    c:function(data,callback){
        console.log("this function is called in c#, passed in param is : "+data);
        //100 is the result from JS to C# , C# could use it to do subsequent steps
        //callback( new Error("In case there is a error , Specifyin it end up with whole JS terminated"),data+1);//必须有2个参数。第一个参数代表error,表示JS里调用出错了,导致整个APP停止.
        callback( null,data+1);
    }};
iadd(input,function(err,result){
if (err) 
{
    console.log(err);
    return;
}
console.log("this result is returned from C# :"+result);
});

5. VS2017编译C#项目,VS Code运行NodeJS项目可以看到结果

参考:

C#调用NodeJS的callback是有要求的,原文如下。即必须是2个参数,第一是error对象,第二个是JS返回给C#的结果

其他参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/788185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

monitor link 联合smart link配合应对复杂的网络

monitor link关键词&#xff1a;上行和下行端口&#xff0c;当上行端口异常&#xff0c;下行端口立即down掉&#xff0c;也就是一种联动机制 如果上行端口里面是smart link方式&#xff0c;则当主从端口都出问题时候&#xff0c;下行端口才会down掉 monitor link 配置步骤 1创…

力扣之每日四题day01--二叉树遍历篇

二叉树遍历 144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历102.二叉树的层序遍历 144.二叉树的前序遍历 力扣地址 import java.util.ArrayList; import java.util.List;/*** Definition for a binary tree node.* public class TreeNode {* int val;* …

Vue基础配置、组件通信、自定义指令

基础配置 Vue框架已经集成了webpack配置 小注意点 vbase 快速生成vue模板 组件名必须是多词格式(驼峰模式) 具体三种写法: ①小驼峰:abcDef.vue ②大驼峰&#xff1a;AbcDef.vue ③中横线&#xff1a;abc-def.vue 假如文件名不符合多次格式的补救办法&#xff1a; 导出重命名…

EFPN代码解读

论文 Extended Feature Pyramid Network for Small Object Detection python3 D:/Project/EFPN-detectron2-master/tools/train_net.py --config-file configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml --num-gpus 1 训练脚本 cfg 中的配置 先获取配置…

基于51单片机的智能门禁系统仿真设计

**单片机设计介绍&#xff0c;基于51单片机的智能门禁系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的智能门禁系统仿真设计概要 一、设计概述 本设计旨在利用51单片机为核心控制器&#xff0c;结合…

Python程序设计 多重循环(二)

1.打印数字图形 输入n&#xff08;n<9)&#xff0c;输出由数字组成的直角三角图形。例如&#xff0c;输入5&#xff0c;输出图形如下 nint(input("")) #开始 for i in range(1,n1):for j in range(1,i1):print(j,end"")print()#结束 2.打印字符图形 …

pytest教程-22-用例依赖插件-pytest-dependency

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest失败重跑插件pytest-rerunfailures&#xff0c;本小节我们讲解一下pytest用例依赖插件-pytest-dependency。 用例依赖 编写用例的时候&#xff0c;我们会注意用例之间的独立性&#xf…

【电源专题】电池不均衡的影响与原因

在使用多节电池设计产品时,大家都知道如果多节电池不均衡会影响电池寿命与充电安全。特别是在充电末端与放电末端时表现较为明显。 电池不均衡的影响 那么为什么会影响安全与寿命呢?其原因如下: 如果电池不均衡时,相当于木桶的短板效应。一方面没法充满,充电时电压高的那一…

利用ChatGPT提升学术论文写作技巧

ChatGPT无限次数:点击直达 利用ChatGPT提升学术论文写作技巧 在当今信息爆炸的时代&#xff0c;学术界对于深入研究和撰写高质量论文的要求越来越高。然而&#xff0c;许多研究人员和学生常常感到写作过程困难&#xff0c;需要花费大量时间和精力。这时候&#xff0c;人工智能…

在Ubuntu上使用Caddy轻松搭建WebDAV服务器

嘿&#xff0c;各位码农朋友们&#xff01;今天我要和大家介绍一下在 Ubuntu 下使用 Caddy 部署 WebDAV 的技术&#xff0c;让你的文件共享变得更加简单顺畅。 &#x1f31f;嗯&#xff0c;我得承认&#xff0c;三丰云的免费服务器真是不错&#xff01;它提供了1核CPU、1G内存…

提升性能与精准追踪:SkyWalking自定义跟踪忽略插件

前言 当使用分布式追踪系统时&#xff0c;有时需要排除某些端点或路径&#xff0c;以减轻追踪系统的负载或减少不必要的数据收集。为了满足这种需求&#xff0c;SkyWalking 提供了一个可选的插件&#xff0c;即 apm-trace-ignore-plugin&#xff0c;它允许自定义需要跳过的路径…

【跟小嘉学 Linux 系统架构与开发】三、如何查看帮助文档

系列文章目录 【跟小嘉学 Linux 系统架构与开发】一、学习环境的准备与Linux系统介绍 【跟小嘉学 Linux 系统架构与开发】二、Linux发型版介绍与基础常用命令介绍 【跟小嘉学 Linux 系统架构与开发】三、如何查看帮助文档 文章目录 系列文章目录[TOC](文章目录) 前言一、 命令…

nodejs爬图片(二)

前言 网上一张一张下载是不是很麻烦&#xff0c;直接批量下载&#xff0c;解决你的问题。高清不是梦&#xff01; 具体步骤不说了&#xff0c;直接上代码 const cheerio require("cheerio"); const axios require("axios"); const fs require(…

代码随想录算法训练营第42天| 01背包问题,你该了解这些|01背包问题,你该了解这些! 滚动数组 |416. 分割等和子集

代码随想录算法训练营第42天| 01背包问题&#xff0c;你该了解这些|01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 |416. 分割等和子集 &#xff08;****************************************************************&#xff09; &#xff08;挺难的&#xff0…

数据库嵌套事务的实现

Mysql本身&#xff08;只说InndoDB引擎&#xff09;是不支持嵌套事务的&#xff0c;就算你开了多个事务&#xff0c;也是按照一层处理。那我们所使用的应用框架&#xff0c;如php的laravel&#xff0c;Java的Spring&#xff0c;都是怎么实现事务嵌套的呢&#xff1f;本文就着这…

代码随想录刷题随记12-二叉树遍历

代码随想录刷题随记12-二叉树遍历 文章目录 代码随想录刷题随记12-二叉树遍历二叉树的递归遍历二叉树的迭代遍历前序遍历中序遍历后序遍历 二叉树的统一迭代法 二叉树的递归遍历 leetcode二叉树的前序遍历 解题代码&#xff1a; /*** Definition for a binary tree node.* st…

《QT实用小工具·七》CPU内存显示控件

1、概述 源码放在文章末尾 CPU内存显示控件 项目包含的功能如下&#xff1a; 实时显示当前CPU占用率。实时显示内存使用情况。包括共多少内存、已使用多少内存。全平台通用&#xff0c;包括windows、linux、ARM。发出信号通知占用率和内存使用情况等&#xff0c;以便自行显示…

类和对象的下篇

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里. 一、单选题(共 10 题,每题 3 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )。 A、小程序 B、计时器 C、操作系统 D、神话人物 答案:…

【漏洞复现】大华 DSS user_edit.action 信息泄露漏洞

0x01 产品简介 DSS是大华的大型监控管理应用平台&#xff0c;支持几乎所有涉及监控等方面的操作&#xff0c;支持多级跨平台联网等操作。 可将视频监控、卡口拍照、 区间测速 、电子地图、违章查询系统等诸多主流应用整合在一起&#xff0c;实现更加智能、便捷的分级查询服务。…