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

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

使用 Nuget 安装 MsieJavaScriptEngine

我使用的是 3.0.3.0 版本。

添加 using

 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 对象

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

附 所有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);

C# 使用 MsieJavaScriptEngine 引擎运行JavaScript的更多相关文章

  1. 使用C#解析并运行JavaScript代码

    如果想在C#编程中解析并运行JavaScript代码,常见的方式有两种: 利用COM组件“Microsoft Script Control”,可参见:C#使用技巧之调用JS脚本方法一 利用JScrip ...

  2. 在线运行Javascript,Jquery,HTML,CSS代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xht ...

  3. 如何选择Javascript模板引擎(javascript template engine)?

    译者 jjfat 日期:2012-9-17  来源: GBin1.com 随着前端开发的密集度越来越高,Ajax和JSON的使用越来越频繁,大家肯定免不了在前台开发中大量的使用标签,常见到的例子如下: ...

  4. [工具] 解决sublime text运行javascript console无输出问题

    1.使用nodeJS在sublime text 运行javascript 下载安装nodeJS 在sublime text新建build system:tools->build system-& ...

  5. 在 .NET Core 中运行 JavaScript

    一.前言 在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 . ...

  6. C#中让WebBrowser运行Javascript脚本

    C#中可以让Webbrowser运行Javascript脚本来实现各种自动化操作,比如点击网页上的按钮,输入用户名密码等等.代码也很简单: >>>>>>>&g ...

  7. WebSphere ILOG JRules 规则引擎运行模式简介

    WebSphere ILOG JRules 规则引擎运行模式简介 引言 作为 JRules 的核心组件,规则引擎决定了在规则集的执行过程中,哪些业务规则会被执行,以及以何种顺序执行.理解并合理选择规则 ...

  8. 浏览器地址栏运行JavaScript代码

    这个很多人应该还是知道的,在浏览器地址栏可以直接运行JavaScript代码,做法是以javascript:开头后跟要执行的语句.比如: javascript:alert('hello from ad ...

  9. Java中运行javascript代码

    Java中运行javascript代码 1.Java 代码 2.JS代码 2.1demoWithParams.js 2.2demoWithListParams.js 原文作者:russle 原文地址: ...

随机推荐

  1. 在 sessionStorage存储json对象

    目的:A页面存的东西要从B页面拿到 因为sessionStorage.setItem("key","value")内存储的都是字符串,所以,如果以对象的形式存到 ...

  2. Redis的频道发布与消息订阅

    Redis的频道发布与消息订阅 官网介绍 进程间的一种通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 订阅/发布消息图 下图展示了频道channel1,以及订阅这个频道的三个客户端-c ...

  3. [转]为什么要引入nullptr?

    来源:https://cloud.tencent.com/developer/ask/69685 C++11介绍nullptr,它被称为Null指针常数及其提高类型安全性和解决不明确的情况与现有实现相 ...

  4. Codeforces1204C. Anna, Svyatoslav and Maps (贪心 + Floyd)

    题目链接:传送门 题目大意: 给出n<=100的有向图,和路径p,求p的最短子序列v,使得依次经过v中所有点的路径为p. 思路: 题意其实就是让我们求路径上的一些关键点v,对于所有的关键点:vi ...

  5. Web Service Demo

    有了Web Service的一些基础,具体如何实现,通过亲自写一个Demo来理解一下. 1.创建一个空的Web项目 2.在Web项目下ADD一个Web Service 3.在Web service中写 ...

  6. AngularJs 简单实现全选,多选操作(转)

    代码如下: HTML: <section> <pre>{{choseArr}}</pre> 全选: <input type="checkbox&qu ...

  7. Lengauer-Tarjan算法的相关证明

    Lengauer-Tarjan算法的相关证明 0. 约定 为简单起见,下文中的路径均指简单路径(事实上非简单路径不会对结论造成影响). \(V\)代表图的点集,\(E\)代表图的边集,\(T\)代表图 ...

  8. 【HDU4276】The Ghost Blows Light

    题目大意:给定一棵有根树,1 号节点为根节点,点有点权,边有边权,初始给定一个价值,每经过一条边都会减少该价值,每经过一个点都会增加相应的答案贡献值,求如何在给定价值的情况下最大化答案贡献,并要求最后 ...

  9. oracle partition 分区

    --范围分区create table person( id int, name varchar2(20), birth date, sex char(2))partition by range (bi ...

  10. java数据结构--array与ArrayList的区别

    ArrayList 内部是由一个array 实现的. 如果你知道array 和 ArrayList 的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array 提供 ...