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());
                        }
                    }
                }
            }

  

posted @ 2017-09-17 09:38  八爻老骥  阅读(526)  评论(0编辑  收藏  举报