zoukankan      html  css  js  c++  java
  • C# 使用 MsieJavaScriptEngine 引擎运行JavaScript

    用这个东西实现了一个js脚本引擎代码生成器,调研的时候这个东西的资料比较少。

    我就根据自己的这点应用来讲解讲解,有错误,不符的地方还请园友指出。

    使用 Nuget 安装 MsieJavaScriptEngine

    我使用的是 3.0.3.0 版本。

    添加 using

    1 using MsieJavaScriptEngine;

    核心代码

    使用 using 来保证引擎的自动释放,传入配置 UseJson2Library = true 即使用 json2.js 的那些方法。

    关于这个 json2 , chrome 等现代浏览器中存在JSON全局变量。这个变量有两个方法 Stringify(将 Js 对象转化成 json 字符串)和 Parse(将 json字符串转化成 Js 对象)。

    这两个方法在 Js 对象和 Json 字符串转化过程中很有用。但是IE等老旧浏览器中没有这个全局变量。json2.js 的作用就是:判断是否有全局变量JSON,如果没有就创建它。

    这个引擎使用的正是本电脑最高版本的IE内核去解析 Js...

    本身我以为 SetVariableValue 方法可以直接设置对象参数,毕竟 Js 对象还是很好转的。但是没想到不支持,会报错。

    所以就曲线救国实现将 json 字符串再反序列化到 Js 对象

     1             using (var jsEngine = new MsieJsEngine(new JsEngineSettings() { UseJson2Library = true }))
     2             {
     3                 jsEngine.SetVariableValue("result", "");
     4                 //设置js变量为json字符串值
     5                 jsEngine.SetVariableValue("model", Json.ToJson(new EngineData(_table, _cols)));
     6                 //执行JSON.parse()将字符串转为js对象
     7                 jsEngine.Execute("model = JSON.parse(model);");
     8 
     9                 ResultTextBox.Text = jsEngine.Evaluate<string>(tmpl);
    10             }

    附 所有Api

    名字和参数名差不多都很直观 就不加注释的翻译了 最近比较忙

    看方法名好像 EmbedHostObject 这个方法也可以设置对象参数 ,然后我尝试了一下,并不行。陷入沉思。。。

            public object CallFunction(string functionName, params object[] args);
    
            public T CallFunction<T>(string functionName, params object[] args);
    
            public void CollectGarbage();
            
            public void Dispose();
    
            public void EmbedHostObject(string itemName, object value);
    
            public void EmbedHostType(string itemName, Type type);
    
            public object Evaluate(string expression);
    
            public object Evaluate(string expression, string documentName);
    
            public T Evaluate<T>(string expression);
    
            public T Evaluate<T>(string expression, string documentName);
    
            public void Execute(string code);
    
            public void Execute(PrecompiledScript precompiledScript);
    
            public void Execute(string code, string documentName);
    
            public void ExecuteResource(string resourceName, Type type);
    
            public void ExecuteResource(string resourceName, Assembly assembly);
    
            public object GetVariableValue(string variableName);
    
            public T GetVariableValue<T>(string variableName);
    
            public bool HasVariable(string variableName);
            
            public void Interrupt();
    
            public PrecompiledScript Precompile(string code);
    
            public PrecompiledScript Precompile(string code, string documentName);
    
            public PrecompiledScript PrecompileFile(string path, Encoding encoding = null);
    
            public PrecompiledScript PrecompileResource(string resourceName, Assembly assembly);
    
            public PrecompiledScript PrecompileResource(string resourceName, Type type);
    
            public void RemoveVariable(string variableName);
            
            public void SetVariableValue(string variableName, object value);
  • 相关阅读:
    UIView
    UISwitch
    UIButton
    label标签的属性
    sublime 生成网页头文件
    Xcode快捷键
    Bootstrap 模态对话框只加载一次 remote 数据的解决办法 转载
    用谷歌浏览器来当手机模拟器
    DDD:谈谈数据模型、领域模型、视图模型和命令模型
    MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
  • 原文地址:https://www.cnblogs.com/Aaxuan/p/11237790.html
Copyright © 2011-2022 走看看