本文介绍如何在 C# 中使用 Jint 库执行 JavaScript 脚本。涵盖 NuGet 包安装、表达式求值、字符串处理、变量赋值、对象数据交换、C# 委托映射至 JS 以及 JS 函数反向调用等核心功能,帮助开发者实现高效的双向脚本交互。
Jint 库简介与背景
此前在开发 SCXML 状态机时,曾使用 Jint 库解析 EMCScript 表达式,但当时觉得 C# 与 JS 之间的数据转换略显繁琐。近期关注到 Jint 3.0 版本已有显著改进,本文旨在介绍该版本的用法,供读者参考。
环境安装与配置
首先需通过 NuGet 安装 Jint 包。请注意勾选 prerelease 选项以获取最新版本,具体操作可通过 dotnet 命令行指令完成。
dotnet add package Jint --prerelease基础表达式与字符串处理
接下来演示如何直接计算 JavaScript 表达式。
Console.WriteLine("直接计算表达式:(1+2)*3");
var r1= e.Evaluate("(1+2)*3");
Console.WriteLine(r1);随后展示字符串操作相关的示例。
Console.WriteLine("字符串操作:'abc'.length");
var r2=e.Evaluate("'abc'.length");
Console.WriteLine(r2);
Console.WriteLine("-----------------------");
Console.WriteLine("字符串操作:'abc'.substr(2)");
var r3=e.Evaluate("'abc'.substr(2)");
Console.WriteLine(r3);数据交换与变量赋值
利用 SetValue 方法,可以向 JS 变量赋值。
var e2 = new Engine()
.SetValue("x", 1)
.SetValue("y",2);
var r4=e2.Evaluate("x+y");
Console.WriteLine(r4);通过对象传递,可实现 C# 与 JS 之间的数据交换。
var myobj= new Student {
Name="张三"
};
Console.WriteLine(myobj.Name);
var e4 = new Engine()
.SetValue("student", myobj)
.Execute("student.Name = '李四'");
Console.WriteLine(myobj.Name);
C# 与 JS 函数双向调用
可以将 C# 函数委托映射给 JS 引擎,从而在 JS 代码中直接调用这些 C# 函数。
Console.Write("将CSharp函数设置给Js引擎");
var engine = new Engine()
.SetValue("log", new Action<object>(Console.WriteLine));
engine.Execute(@"
function hello() {
log('Hello World');
};
hello();
");反之,也可以从 C# 代码中调用 JS 定义的函数。
Console.WriteLine("调用JS函数计算BMI");
var e5=new Engine()
.Execute("function bmi(weight, height) { return weight/height/height; }");
Console.WriteLine(e5.Invoke("bmi",75,1.75));.NET 类库集成与示例获取
通过引入 CLI 配置,可以在 JS 引擎中调用 .NET 类库中的函数。
Console.WriteLine("调用.Net函数写入文件");
var e6 = new Engine(cfg => cfg.AllowClr());
e6.Execute(@"var f=System.IO.StreamWriter('sayhello.log');
f.WriteLine('你好 !');
f.Dispose();");
完整示例代码可从 GitHub 下载,地址为 https://github.com/zhenl/CSharpScriptDemo,本文涉及的具体示例位于 JSInCSharp 项目中。
至此,关于 C# 执行 JavaScript 脚本的方法步骤介绍完毕。如需了解更多相关内容,建议搜索本站往期文章或继续浏览后续文章,感谢支持。