ChakraCore ,Net托管编程
前言
有些有着复杂业务逻辑的应用程序,需要为用户提供高度自定化的功能。比如像Word中的宏,当然可以自己设计一套简易的脚本解析引擎,但考虑通用性,成熟度,其实选择一款JS脚本引擎,直接嵌入到应用系统中可能来得更加合适。这里介绍一下ChakraCore的项目,是一个基于.Net 的JS引擎。
代码展示
ChakraCore的js引擎实现了应用程序中的脚本处理,其基本使用方式,由宿主程序提供外部对象和变量,由用户提供脚本,通过宿主交由JS引擎去执行,再将执行结果通过回调函数反馈给宿主。以下代码是一个简单的示例:
设置全局变量
setTitleDelegate = SetTitle; alertDelegate = ShowMessage; context = runtime.CreateContext(); JavaScriptContext.Current = context; JavaScriptValue globalObject = JavaScriptValue.GlobalObject; windowId = JavaScriptPropertyId.FromString("window"); JavaScriptValue window = JavaScriptValue.CreateObject(); var type = this.GetType(); var ps = type.GetProperties(); foreach (var p in ps) { if (p.GetMethod != null && p.GetMethod.IsPublic) { var v = p.GetValue(this) ?? ""; window.SetProperty(JavaScriptPropertyId.FromString(p.Name.ToLower()), JavaScriptValue.FromString(v.ToString()), true); } } globalObject.SetProperty(windowId, window, true); globalObject.SetProperty(JavaScriptPropertyId.FromString("set_Title"), JavaScriptValue.CreateFunction(setTitleDelegate, IntPtr.Zero), true); globalObject.SetProperty(JavaScriptPropertyId.FromString("alert"), JavaScriptValue.CreateFunction(alertDelegate, IntPtr.Zero), true);
回调函数
private JavaScriptValue SetTitle(JavaScriptValue callee, bool isConstructCall, JavaScriptValue[] arguments, ushort argumentCount, IntPtr callbackData) { for (uint index = 1; index < argumentCount; index++) { Title = (arguments[index].ConvertToString().ToString()); } return JavaScriptValue.Invalid; }
调用代码
string script = scripts.Text; JavaScriptValue window = JavaScriptValue.GlobalObject.GetProperty(windowId); var jv = JavaScriptContext.RunScript(script); var type = this.GetType(); var ps = type.GetProperties(); foreach (var p in ps) { if (p.SetMethod != null && p.SetMethod.IsPublic) { var id = JavaScriptPropertyId.FromString(p.Name.ToLower()); if (id != JavaScriptPropertyId.Invalid) { var v = window.GetProperty(id); if (p.PropertyType.IsAssignableFrom(typeof(string))) { p.SetValue(this, v.ToString()); } } } }