很久以前寫過這篇文章 透過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。";
}
}
可以玩一下,沒有很難。