[C#][.NET Core] 試著用 C# 透過 Jint 執行 Javascript ,混和執行

2020-03-27

很久以前寫過這篇文章  透過C# 執行javascript code 並且執行得到結果  ,基本上他很吃 OS ,現在來到 .net Core 時代基本上要跨平台的需求,看來原本作法就不行了,現在這篇我測試主要是在 .net Core 3.1 ,後來我找到一個 project 叫做 Jint ,測試一下成功了,就紀錄一下。




nuget 套件位置 : https://www.nuget.org/packages/Jint

1.先介紹一下 Javascript 檔案很簡單一看就懂 ,檔案位置在 /Script/func.js

function GetSum(a, b) { return a + b; } function Echo() { return str + " From Javascript"; } function CallServerFunc(name) { return name + " From Javascript - CallServerFunc"; } function CallServerFunc2(name) { return testapi.GetStringFromClassFunction(name) + " From Javascript - CallServerFunc"; }
2.單純傳參數進去 ,模擬呼叫
[HttpGet] [Route("Sum")] public int Sum(int x = 19, int y = 46) { var engine = new Jint.Engine(); engine.Execute(System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "Scripts" + Path.DirectorySeparatorChar + "funcs.js")); var result = engine.Execute("GetSum(" + x + "," + y + ")").GetCompletionValue(); return Convert.ToInt32(result.AsNumber()); }


3.在 javascript 中,Echo  function 裡面並沒有 str 的參數,這樣我直接透過 C# 端定義一個 str 的變數,呼叫後並且取得回傳值。
[HttpGet] [Route("Echo")] public string Echo(string str="DONMA") { var engine = new Jint.Engine(); engine.Execute(System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "Scripts" + Path.DirectorySeparatorChar + "funcs.js")); engine.SetValue("str", str); var result = engine.Execute("Echo()").GetCompletionValue(); return result.AsString(); }

4.這範例測試比較複雜,我先建立一個 TestClass ,並且讓 javascript 可以呼叫 TestClass 中 GetStringFromClassFunction 並且在回傳給 C# 端。
[HttpGet] [Route("DoubleCall")] public string DoubleCall(string str = "當麻") { var engine = new Jint.Engine(); engine.SetValue("testapi", new TestClass()); engine.Execute(System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "Scripts" + Path.DirectorySeparatorChar + "funcs.js")); var result = engine.Execute("testapi.GetStringFromClassFunction('"+ str + "')").GetCompletionValue(); return result.AsString(); } public class TestClass { public string GetStringFromClassFunction(string str) { return str+ ", 您好我來自於 TestClass-GetStringFromClassFunction。"; } }


可以玩一下,沒有很難。


當麻許的碎念筆記 2014 | Donma Hsu Design.