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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章