c#代码中如何动态调用javascript函数和自定义方法
c#代码中如何动态调用javascript函数和自定义方法
经测试速度非常快,1毫秒执行完成,用netcore写的代码在windows,Linux 容器中都可以使用,不用把调用外部nodejs 函数api,提高效率。
1.ClearScript支持的功能和适用场景
微软的.net是非常强大和灵活的,除了C#体系脚本扩展,也支持其他流行的脚本扩展,Microsoft.ClearScript.V8就是一个.NET绑定到Google V8的脚本引擎。它允许.NET应用程序直接从JavaScript代码中调用函数,并返回JavaScript类型。ClearScript.V8可以使用各种JavaScript库(比如jQuery)来提高工作效率,也可以使用它来测试JavaScript代码。
为.NET程序提供动态加载库的能力。
2、如何使用ClearScript
在项目中通过nuget 添加
1.Microsoft.ClearScript7.4.5
2.Microsoft.ClearScript.linux-x64 7.4.5
3. api或web项目入口的startup.cs 注入
services.AddSingleton<IExpressionService, ExpressionService>();
4.demo:
public class ExpressionService : IExpressionService
{
public readonly V8ScriptEngine engine;
public ExpressionService()
{
engine = new V8ScriptEngine();
string jsText = "function execute(expression) { return eval(expression)}"; //调用eval函数,也可以调用其他JavaScript 函数
engine.DocumentSettings.AccessFlags = Microsoft.ClearScript.DocumentAccessFlags.EnableFileLoading;
engine.DefaultAccess = Microsoft.ClearScript.ScriptAccess.Full; // 这两行是为了允许加载js文件
V8Script script = engine.Compile(jsText);
engine.Execute(script);
}
public string Expression(string expression)
{
try
{
//调用脚本中定义的函数
var rs= engine.Script.execute(expression);
return rs.ToString();
}
catch(Exception ex)
{
return "error";
}
}
}
JavaScript 全局函数:都可以调用
函数 描述
decodeURI() 解码某个编码的 URI。
decodeURIComponent() 解码一个编码的 URI 组件。
encodeURI() 把字符串编码为 URI。
encodeURIComponent() 把字符串编码为 URI 组件。
escape() 对字符串进行编码。
eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行。
isFinite() 检查某个值是否为有穷大的数。
isNaN() 检查某个值是否是数字。
Number() 把对象的值转换为数字。
parseFloat() 解析一个字符串并返回一个浮点数。
parseInt() 解析一个字符串并返回一个整数。
String() 把对象的值转换为字符串。
unescape() 对由 escape() 编码的字符串进行解码。
V8是一个高性能的JavaScript解析执行引擎
V8 的主要职责是用来编译执行 JavaScript 代码的
V8就像是一个黑盒,我们将一段代码丢给这个黑盒,它便会返回结果
V8采用了一种权衡策略,在启动时采用解释执行的策略,但是如果某段代码的执行频率超过某个值,V8就会采用优化编译器将其编译成执行效率更高的机器代码.
V8执行JavaScript代码的主要流程:
初始化执行环境
解析JavaScript代码生成AST和作用域
根据AST和作用域生成字节码
解释执行字节码
监听热点代码
优化热点代码为二进制的机器代码
优化生成二进制机器代码