C# Microsoft.ClearScript.V8脚本使用

news2024/11/15 14:05:51

 1、ClearScript支持的功能和适用场景

微软的.net是非常强大和灵活的,除了C#体系脚本扩展,也支持其他流行的脚本扩展,Microsoft.ClearScript.V8就是一个.NET绑定到Google V8的脚本引擎。它允许.NET应用程序直接从JavaScript代码中调用函数,并返回JavaScript类型。ClearScript.V8可以使用各种JavaScript库(比如jQuery)来提高工作效率,也可以使用它来测试JavaScript代码。

一些常见的用途包括:

1. 调用在JavaScript中编写的函数或库以实现特定的业务逻辑。

2. 将JavaScript UI(如Web页面)嵌入到.NET应用程序中。

3. 为.NET程序提供脚本语言接口。

4. 为.NET程序提供动态加载库的能力。

总之,Microsoft.ClearScript.V8可以使.NET应用程序更具有灵活性和可扩展性,使其能够更好地与JavaScript代码进行交互。

2、如何使用ClearScript

        在C#工程中,通过nuget添加和管理ClearScript包。

         必须添加的是Microsoft.ClearScript.V8,另外每个系统平台需要对应的Native包。Win平台有Microsoft.ClearScript.V8.Native.win-x64和Microsoft.ClearScript.V8.Native.win-x86,根据实际部署环境选择性添加。

 

3、简单的数据交互示例

         为测试数据交互,我们可以写一个简单的类来验证。

public class PascalData
{
    public int iVal01 { get; set; }
    public int iVal02 { get; set; }
    public float fVal01 { get; set; }
    public float fVal02 { get; set; }
}

     定义V8引擎并使用。

using Microsoft.ClearScript.V8;

//定义数据类
PascalData pascalData = new PascalData();

//创建V8引擎
var engine = new V8ScriptEngine();

//添加pascalData到脚本中,对象名字myPascal
engine.AddHostObject("myPascal", pascalData);

//通过脚本动态定义函数,函数中使用C#定义的myPascal对象
engine.Evaluate("function iVal02(){ var k = myPascal.iVal01 * 3; return k;};");
engine.Evaluate("function fVal02(){  var f = myPascal.fVal01 / Math.PI; return f;};");

pascalData.iVal01 = 1;
pascalData.fVal01 = 10.0f;

//调用脚本中定义的函数
pascalData.iVal02 = (int)engine.Script.iVal02();
pascalData.fVal02 = (float)engine.Script.fVal02();
Console.WriteLine($"{pascalData.iVal01},{pascalData.iVal02},{pascalData.fVal01},{pascalData.fVal02}");

pascalData.iVal01 = 123;
pascalData.fVal01 = 8440.8f;

pascalData.iVal02 = (int)engine.Script.iVal02();
pascalData.fVal02 = (float)engine.Script.fVal02();
Console.WriteLine($"{pascalData.iVal01},{pascalData.iVal02},{pascalData.fVal01},{pascalData.fVal02}");

运行效果如下:

4、如何获取脚本中定义的对象

         在上面的例子中,我们通过脚本定义了iVal01和iVal02两个函数,然后使用engine.Script.iVal01()和engine.Script.iVal02()想普通方法一样执行。但如果脚本中没有定义相应的函数,执行会报错,怎么判断脚本中是否定义了相应的变量呢?V8引擎提供的方法,可以获取脚本中定义的对象,参考如下:

var memberNames = engine.Script.PropertyNames;
bool hasiVal01 = false;
bool hasiVal02 = false;
foreach (var mb in memberNames)
{
    if (mb.Equals("iVal01"))
         hasiVal01 = true;
    else if (mb.Equals("iVal02"))
         hasiVal02 = true;
}
if (hasiVal01)
    pascalData.iVal02 = (int)engine.Script.iVal02();
if (hasiVal02)
    pascalData.fVal02 = (float)engine.Script.fVal02();

5、使用其他C#和自定义的库

        C#的系统库和自己编写的库,也可以带入脚本中使用

//C#库的DLL名称,不是命名空间名称和类名。DLL可以是系统的和自己定义的
string[] mylib= {
    "mscorlib", "System.Core"
};

engine.AddHostObject("lib", new HostTypeCollection(mylib));
engine.AddHostType("Console", typeof(Console));

engine.Execute("Console.WriteLine(lib.System.DateTime.Now)");

6、其他

V8引擎github地址:GitHub - microsoft/ClearScript: A library for adding scripting to .NET applications. Supports V8 (Windows, Linux, macOS) and JScript/VBScript (Windows).

C#的脚本参考之前的博文:C# Roslyn编写脚本数据交互示例_PascalMing的博客-CSDN博客

V8引擎使用例子:https://www.cnblogs.com/BH-RJ-WK/p/15984253.html

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

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

相关文章

Redis布隆过滤器的原理和应用场景,解决缓存穿透

目录 专栏导读一、布隆过滤器BloomFilter是什么二、布隆过滤器BloomFilter能干嘛?三、布隆过滤器使用场景1、解决缓存穿透问题2、黑名单3、网页爬虫对URL的去重,避免爬取相同的URL地址四、操作布隆过滤器BloomFilter1、使用布隆过滤器2、删除key3、判断是否存在五、代码实例1…

黑客开始使用双 DLL 侧载来逃避检测

一个名为“Dragon Breath”、“Golden Eye Dog”或“APT-Q-27”的 APT 黑客组织正在展示一种新趋势,即使用经典 DLL 旁加载技术的多种复杂变体来逃避检测。 这些攻击变体从一个初始向量开始,该向量利用一个干净的应用程序,最常见的是 Telegr…

vue_组件基础

单文件组件 Vue 单文件组件&#xff08;又名 *.vue 文件&#xff0c;缩写为 SFC&#xff09;是一种特殊的文件格式&#xff0c;它允许将 Vue 组件的模板、逻辑 与 样式封装在单个文件中 <template><h3>单文件组件</h3> </template><script> ex…

asp.net+c#操作系统课程在线教学平台

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…

答疑解惑:开发者必须彻底搞懂的 SSL/TLS 协议

简介 本期答疑解惑将和大家一起认识SSL/TLS 协议。请尝试回答以下几个问题&#xff1a; 使用浏览器访问https网站和http网站有什么不同&#xff1f;SSL协议作用于网络模型的哪一层&#xff1f;你知道CSDN&#xff0c;博客园正在使用的是什么类型的SSL证书吗&#xff1f;SSL&a…

汇编实现LED循环点亮(延时子程序模板)

在单片机P2口外接8个发光二极管(低电平驱动)。试编写一个汇编程序&#xff0c;实现LED循环点亮功能:P2.0-P2.1-P2.2-P2.3-…-P2.7-P2.6-P25-…-P2.0的顺序&#xff0c;无限循环。要求采用软件延时方式控制闪烁时间间隔(约50ms)。 首先进行电路设计 电路原理图设计 利用 Prot…

php+vue影视电影视频点播推荐avxhe系统

影视推荐系统的主要使用者分为管理员和用户&#xff0c;实现功能包括管理员&#xff1a;首页、个人中心、用户管理、公告信息管理、电影分类管理、影视推荐管理、付费点播管理、点播信息管理、管理员管理、系统管理&#xff0c;用户&#xff1a;首页、个人中心、付费点播管理、…

数字化转型导师坚鹏:企业数字化领导力提升之道

企业数字化领导力提升之道 ——融合中西智慧&#xff0c;践行知行合一思想&#xff0c;实现知行果合一 课程背景&#xff1a; 很多企业存在以下问题&#xff1a; 不知道如何领导面临的数字化时代&#xff1f; 不清楚企业数字化领导力模型的内涵&#xff1f; 不知道如何…

开关电源基础02:基本开关电源拓扑(1)-BUCK拓扑

说在开头&#xff1a;关于海森堡的矩阵&#xff08;1&#xff09; 我们前面说了&#xff0c;海森堡和泡利到了哥本哈根跟着玻尔混&#xff0c;在哥本哈根海森堡感到了一种竞争的气氛&#xff1a;他在德国少年得志&#xff0c;是出了名的天才&#xff0c;现在突然发现身边的每一…

Python每日一练:圆桌争风吃醋的豚鼠韩信点兵(全一行代码解法)

文章目录 前言一、圆桌二、争风吃醋的豚鼠三、韩信点兵总结 前言 很显然&#xff0c;Python的受众远远大于C&#xff0c;其实笔者本人对Python的理解也是远强于C的&#xff0c;C纯粹是为了假装笔者是个职业选手才随便玩玩的&#xff0c;借着十多年前学的C的功底&#xff0c;强…

01、爬虫js逆向之-七麦数据

目标网址&#xff1a;aHR0cHM6Ly93d3cucWltYWkuY24vcmFuay9pbmRleC9icmFuZC9hbGwvZGV2aWNlL2lwaG9uZS9jb3VudHJ5L2NuL2dlbnJlLzM2 &#xff08;需要进行ba64解码即可获取到参数&#xff09; 需要逆向的加密参数&#xff1a;analysis 1、点击数据接口&#xff0c;触发请求 2、点…

2022年NOC大赛编程马拉松赛道复赛图形化低年级A卷-正式卷,包含答案

目录 选择题: 多选题: 编程题: 下载文档打印做题: 2022年NOC大赛编程马拉松赛道复赛图形化低年级A卷-正式卷 2022NOC-图形化复赛低年级A卷正式卷

天地气运流转,皆在五行生克中

在中国的传统文化里&#xff0c;常讲“气运”二字&#xff0c;把两字分开&#xff0c;便是气数与命运。 在现代人的观念里&#xff0c;气运是个复杂又抽象的概念。 天地五行之气轮流转&#xff0c;一切都在五行生克中。 而古人的方法&#xff0c;是通过五行的变化来描述气运的流…

Promise类方法

这篇主要讲一下Promise的类方法的基本使用&#xff0c;至于Promise的基本使用这里就不赘述了&#xff0c;之前也有手写过Promise、实现了Promise的核心逻辑。其实我们平时用Promise也挺多的&#xff0c;不过又出现了两个新的语法&#xff08;ES11&#xff0c;ES12新增了两个&am…

Gradle使用

下载Gradle Gradle Distributions 配置环境变量 测试是否成功 cmd输入gradle -v 在.gradle目录下创建一个init.gradle allprojects { repositories { maven { url file:///D:/maven/myRepository} ## 这里是本地maven仓库地址,没有就会依次向下设置的地址寻…

wisp5学习日记1

这里写目录标题 编译工程问题一 LSD-FET430UIF仿真器排针方向与所给排针方向示意图不一致&#xff0c;不知怎么方向问题2 拟器或仿真器无法找到连接到计算机的USB FET 编译工程 鼠标右键选择build project 问题一 LSD-FET430UIF仿真器排针方向与所给排针方向示意图不一致&…

【Java基础 2】Java 基础语法

&#x1f34a; Java学习&#xff1a;社区快速通道 文章目录 1 变量与基本数据类型1.1 变量1.2 数据类型1.3 标识符1.4 类型转换1.5 关键字大全 2 二进制概述3 方法4 运算符4.1 算术运算符4.2 赋值运算符4.3 关系运算符4.4 逻辑运算符4.5 字符串连接运算符4.6 三目运算符 5 命名…

配置JDK环境变量

文章目录 查看电脑系统下载及安装JavaSE配置系统环境变量测试环境变量配置是否成功。 查看电脑系统 运行输入框中输入&#xff1a;control 下载及安装JavaSE 这个从网上下载就行&#xff0c;jdk-8u141-windows-x64.exe&#xff0c;不提供下载方式了。 主要讲解安装过程&a…

AI 工具合辑盘点(十二)持续更新 之 面向学生群体的 AI 工具和面向所有人的 AI 工具

面向学生群体的 AI 工具 人工智能在教育领域可以发挥多种作用。例如&#xff0c;它可以用于个性化课程、检测抄袭、转录讲座和促进教师与学生之间的快速沟通等等。 教育面临着许多挑战&#xff0c;这些人工智能工具可以帮助教师和学生。这些 AI 可以替代手动工作、降低人为错…

图解HTTP

文章目录 第一章、了解web及网络基础HTTP 的诞生网络基础 TCP/IPTCP/IP 协议族层次化的好处应用层传输层网络层链路层&#xff08;又名数据链路层&#xff0c;网络接口层&#xff09; 数据传输流举例&#xff1a; 与HTTP关系密切的协议&#xff1a;IP、TCP和DNS负责传输的 IP 协…