前一阵子使用C#编写SCXML状态机,需要解析EMCScript表达式,使用了Jint库(https://github.com/sebastienros/jint/),当时感觉与C#之间的数据转换不是很方便。这两天有时间又关注了一下,发现新的3.0版本有了很大改进,在这里介绍给大家,供参考。

首先要安装nuget包,注意增加prerelease选项,安装最新的版本,使用dotnet命令行指令如下:

dotnet add  package Jint --prerelease

直接计算表达式:

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引擎,在JS代码中调用这些函数:

Console.Write("将CSharp函数设置给Js引擎");
var engine = new Engine()
.SetValue("log", new Action<object>(Console.WriteLine));
engine.Execute(@"
function hello() {
log('Hello World');
}; hello();
");

也可以从CSharp 调用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));

可以引入CLI,从而在JS引擎中调用CLI中的函数:

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项目中。

最新文章

  1. MVC
  2. 出售一套Unity + Lua热更新框架代码
  3. Activity设置全屏的三种方法
  4. cxGRID中的字段怎么能以0.00的格式显示
  5. BZOJ3092 : [FDU2012校赛] A Famous King’s Trip
  6. 奥迪--Q5
  7. java装饰者模式理解
  8. ubuntu中apt-get安装与默认路径
  9. Spark计算模型-RDD介绍
  10. [BZOJ1500][NOI2005]维修数列---解题报告
  11. gulp learning note
  12. partition length exceeds the loop-partition-table-imposed maximum of 4294967295
  13. Object的方法
  14. 高效求a的n次幂的算法
  15. C#中字节数组(byte[])和字符串相互转换
  16. [2019BUAA软工助教]第0次个人作业
  17. 使用DBMS_SHARED_POOL包将对象固定到共享池
  18. JavaScript开发者应懂的33个概念
  19. 如何改变vim中的光标形状 : 在插入状态下显示为 beam?而在 其他 状态下 为 block?
  20. UVa10474

热门文章

  1. Docker学习(三)——Docker镜像使用
  2. tomcat启动和停止脚本
  3. Linux基础命令---dig工具
  4. 【AWS】【TroubleShooting】EC2实例无法使用SSH远程登陆(EC2 failure for SSH connection)
  5. mybatis-扩展
  6. SpringBoot 项目不加载 application.properties 配置文件
  7. Spring AOP通过注解的方式设置切面和切入点
  8. 【C/C++】输入:连续输入,以逗号隔开
  9. gitlab官方api使用
  10. 使用Navicat Premium 15发送Excel附件至个人邮箱