首页 > 编程语言 >c# 从Jint切换到 ClearScript

c# 从Jint切换到 ClearScript

时间:2024-06-18 17:55:09浏览次数:21  
标签:engine __ Execute Console c# Jint API new ClearScript

Jint打包后大概2M左右,但有一些小bug,比如函数内的严格模式不生效
ClearScript大概30M左右

测试基于windows x64 控制台程序

<PackageReference Include="Microsoft.ClearScript.Core" Version="7.4.5" />
<PackageReference Include="Microsoft.ClearScript.V8" Version="7.4.5" />
<PackageReference Include="Microsoft.ClearScript.V8.Native.win-x64" Version="7.4.5" />
using Microsoft.ClearScript.V8;

var api = new Api();

var engine = new V8ScriptEngine();
//将.net对象添加到引擎内,这个是全局变量,
engine.AddHostObject("__API", api); 
//将.net类型添加到引擎内
engine.AddHostType("Console", typeof(Console));
engine.Execute("Console.WriteLine(__API.MyProperty);");

//js内部定义函数,c#调用
engine.Execute(@" 
    function add(a,b){
        return a+b;
    }
    //定义一个常量
    let API = __API;
");
Console.WriteLine($"调用add方法-->{engine.Invoke("add", 1, 2)}");
Console.WriteLine($"访问API属性1-->{engine.Evaluate("API.MyProperty")}");
Console.WriteLine($"访问API属性2-->{engine.Evaluate("API.NoProp")}");//没有属性不会报错

//js内部定义函数,传递c#自定义对象
engine.Execute(@"
    function test(api){
        return api.MyProperty + 99;
    }
");
Console.WriteLine(engine.Invoke("test", api));

//js代理包装.net对象
var proxyCode = @"
function __proxyObject(inputObject) { 
    let proxy = new Proxy(inputObject, {
	    get(targetObj, propoty, receiver) {
		    if (!targetObj.hasOwnProperty(propoty)) {
			    throw new Error(`'${targetObj}' 未包含属性: '${propoty}' `)
		    }
		    return targetObj[propoty]
	    }
    });
 
    return proxy;
}

const API2 = new __proxyObject(__API);
 ";
engine.Execute(proxyCode);
//engine.Execute("API2.NoProp");//没有这个属性会报错

//严格模式,将会触发报错
// engine.Execute("fn test2(){let a = 1; let a = 2;}");

Console.Read();


public class Api()
{
    public int MyProperty { get; set; }
}

标签:engine,__,Execute,Console,c#,Jint,API,new,ClearScript
From: https://www.cnblogs.com/trykle/p/18254836

相关文章

  • nalog_clock 时钟
    analog_clock:^0.1.0#时钟 classMyApp1extendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){//获取当前北京时间returnCenter(child:AnalogClock(//时钟的装饰,指定边框、背景色和形状decoration:BoxDecorat......
  • python 注册nacos 进行接口规范定义
    背景:一般场景python服务经常作为java下游的算法服务或者数据处理服务但是使用http去调用比较不灵活,通过注册到nacos上进行微服务调用才是比较爽的1.定义feginapi的接口定义java端定义接口请求和响应主要关注CommonResult结构和python要一直,不然序列号是有问题的Co......
  • 视频汇聚安防综合管理系统EasyCVR平台GB28181设备注册未上线的原因排查与解决
    视频汇聚安防综合管理平台EasyCVR视频监控系统基于云边端架构,可支持海量视频汇聚集中管理,能提供视频监控直播、云端录像、云存储、录像检索与回看、告警(协议告警/智能告警/1400视图库告警)、平台级联、AI智能分析接入等视频能力服务。平台具备强大的兼容性,支持多协议、多类型设备接......
  • GB28181安防视频系统EasyCVR报错version`GLIBCXX_3.4.19'not found如何处理?
    多协议接入/GB28181/GAT1400协议/安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中,将前端设备统一集中接入与汇聚管理。智慧安防/视频存储/视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘......
  • CSP历年复赛题-P7911 [CSP-J 2021] 网络连接
    原题链接:https://www.luogu.com.cn/problem/P7911题意解读:服务器server建立连接,客户端client加入连接,建立和加入连接都要指定一个ip地址,对已经建立过连接的ip地址再次建立连接会失败,加入连接没有限制,根据要求进行输出。解题思路:此题有两个关键点:1、验证IP地址的格式是符合规范......
  • 【踩坑】.NET 8.0 自定义IExceptionHandler不生效
    中间件实现异常处理在ASP.NETCore里,我们可以使用中间件(Middleware)实现全局的异常处理。如内置的异常处理中间件UseExceptionHandlerapp.UseExceptionHandler(appError=>{appError.Run(asynccontext=>{context.Resp......
  • 视频汇聚安防综合管理平台EasyCVR支持GA/T1400视图库标准及设备接入配置
    一、概述视频汇聚安防综合管理平台EasyCVR视频监控系统已经与公安部GA/T1400视图库标准协议实现了对接,即《公安视频图像信息应用系统》。安防监控系统EasyCVR支持采用GA/T1400进行对接,可实现人脸数据使用的标准化、合规化。其采用统一接口对接雪亮工程视频监控系统以及其他系......
  • 2024 Scrum Day 敏捷大会演讲嘉宾阵容升级,早鸟票预售中...
    ​关于ScrumDay智驭未来,敏捷先行——2024中国Scrum大会启航在全球数字化转型的浪潮中,敏捷已成为企业脱颖而出的关键。Scrum中文网携手全球敏捷行业巨擘——Scrum.org联袂呈现年度敏捷盛会ScrumDay,将于今秋盛大启幕!大会聚焦“AI时代下的敏捷(AgileintheAIAge)”,汇集......
  • python调用智能合约代码,BadFunctionCallOutput 怎么解决
    目录桌面应用使用QT5开发的,可以看看我的QT5文章BadFunctionCallOutput 怎么解决我的原因是智能合约地址填写错误python智能合约基础应用如何使用remix编写solidity智能合约并部署上链在哪进行合约部署,合约部署步骤Remix怎么复制abi和address​编辑这个ABI对应最简......
  • Dozzle-解决通过命令方式查看Docker 日志的神器
    对于程序员们来说,Docker一定是不陌生了。Docker为我们的工作带来的巨大的便利,你可以使用它快速部署和扩展应用程序,并保证隔离性和可移植性,使应用程序在容器内独立运行,而且可以轻松地在不同的主机和操作系统上移植。Docker还简化了开发环境的配置和协作,开发人员可以使用相同的容......