用這個東西實現了一個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);