zoukankan      html  css  js  c++  java
  • 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());
                            }
                        }
                    }
                }
    

      

  • 相关阅读:
    Python 3学习 ——目录 Json Pickle
    Python 3 学习——函数扩展and迭代器生成器装饰器
    Python 3 学习——深浅拷贝以及函数
    Python 3 学习的第七小节——Linux-Ubuntu
    Python 3 —— 文件操作
    Python 3 学习的第五小节——字符编码与三级菜单实践
    关于PHP代码复用‘traits’的一段代码
    一个将对象彻底冻结的函数
    详解vue-cli脚手架项目-package.json
    关于element-ui日期选择器disabledDate使用心得
  • 原文地址:https://www.cnblogs.com/icoolno1/p/7534771.html
Copyright © 2011-2022 走看看