[C#] ClearScript 引入外部檔案 + 模擬 require , eval

2022-02-24

上一篇文章 簡單介紹 ClearScript 一個官方且跨平台的 Javascript Interpreter ,我們簡單介紹了 ClearScript 

在實作中有幾個地方很常用到就在筆記一下,關於如何使用外部 .js 檔案,然後我再 javascript 中也可以引入還有使用 eval



1. 引入外部檔案,這邊比較簡單,網路上查一下,只要輸入這兩行,然後給入位置就可以引入外部檔案

//允許載入.js 檔案 //如果不加入下面引入會錯 engine.DocumentSettings.AccessFlags = Microsoft.ClearScript.DocumentAccessFlags.EnableFileLoading; engine.DefaultAccess = Microsoft.ClearScript.ScriptAccess.Full;


2. 這邊我準備了三個 .js 檔案 主要 我在 C# 這邊會呼叫 js1.js 中的 Test1() ,測試 require 有沒有,他會引入 circle.js 並且執行進行

圓的面積計算, Test2() 主要就是測試 eval() 有沒有用


.js 們

var Circle = function (radius) { this.radius = radius } Circle.PI = 3.14 Circle.prototype = { area: function () { return Circle.PI * this.radius * this.radius; } } //Call C# Proxys function eval(code) { return RA.Eval(code); } function require(fileName) { RA.ReadData(fileName); } // JS Functions function Echo(str) { return str + "!!"; } function Test1(a,b) { require("circle.js"); var c = new Circle(2); Console.WriteLine(c.area()); return c.area(); } function Test2(a, b) { require("js2.js"); eval('result=' + a + '+' + b); return result; } function Main() { Console.WriteLine(Echo('Hello, I am js1.js')); } Console.WriteLine(Echo('Hello, I am js2.js'));


3.上面你有看到我會呼叫一個 RA 跟 Console 這是因為我在 C# 端撰寫了相對應的 code. 


RequireAgent

public class RequireAgent { private Microsoft.ClearScript.V8.V8ScriptEngine _Engine { get; set; } public RequireAgent(Microsoft.ClearScript.V8.V8ScriptEngine engine) { _Engine = engine; } public string ReadData(string fileName) { string jsSource = System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + fileName); _Engine.Execute(jsSource); return jsSource; } public dynamic Eval(string code) { return _Engine.Evaluate(code); } }

4. 接下來就是主程式的部分

using (var engine = new Microsoft.ClearScript.V8.V8ScriptEngine()) { //允許載入.js 檔案 //如果不加入下面引入會錯 engine.DocumentSettings.AccessFlags = Microsoft.ClearScript.DocumentAccessFlags.EnableFileLoading; engine.DefaultAccess = Microsoft.ClearScript.ScriptAccess.Full; engine.AddHostType("Console", typeof(Console)); engine.AddHostObject("RA", new RequireAgent(engine)); var script = engine.CompileDocument(AppDomain.CurrentDomain.BaseDirectory + "js1.js"); engine.Execute(script); var result = engine.Script.Test2(27, 22); Console.WriteLine(result); //Hello, I am js2.js!! : form js2.js //49 : from line:20 }



這樣在程式佈局上就會簡單很多。


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