dotnet 使用 ClearScript 執行 VBScript 和 JS 程式碼 無需瀏覽器
- 2020 年 2 月 18 日
- 筆記
小夥伴都知道,使用 JS 的坑在於執行效率過低,速度過慢。如果是在客戶端中,還開啟一個瀏覽器,整個應用程式就會特別重。有沒有什麼方法可以讓 dotnet 作為容器,執行 JScript 程式碼而不需要瀏覽器?其實有的,因為 VBScript 和 JS 程式碼都很好解析,所以有 ClearScript 支援使用 dotnet 解析程式碼執行
如何將 VBScript 和 JS 程式碼編譯為 IL 或如何在 C# 和 dotnet 中嵌入 js 程式碼是不靠譜的,因為 js 語言設計如此,是用來在 基組模組 層運行的語言,也就是這是一個解析型的腳本,更好地做法是給他實現一個解析庫。通過解析庫將程式碼解析為數據,在根據數據調用已經寫好的程式碼,這樣就能實現在 dotnet 中運行 js 程式碼了。實現這個方式有兩個不同方法,第一個方法使用的最多的,就是在 dotnet 中添加一個瀏覽器讓他執行程式碼,這個方法的缺點就是性能特別渣,無論是記憶體佔用或 CPU 佔用都是特別渣。我作為性能優化組的逗比,只能去尋找第二條路徑,畢竟需要照顧一些只會寫 js 的大佬。第二個方法是通過 dotnet 解析器解析 js 程式碼的方法,推薦使用 ClearScript 庫,這個庫十分好用,可以給 js 注入執行的類或實例包括庫,這樣可以讓貧瘠的 js 可以用到更多的 dotnet 的強大的庫。同時可以雜私貨,注入自己實現的類等。因為可以選擇注入執行的類,所以可以讓一些如文件訪問相關的庫不要直接注入,而是注入自己封裝的文件訪問相關的庫,解決不安全的 js 帶毒的問題
先創建一個 dotnet 項目,然後通過 NuGet 安裝 Microsoft.ClearScript
然後就可以在程式碼中運行 VBScript 程式碼或 js 程式碼了
// expose a host type engine.AddHostType("Console", typeof(Console)); engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)");
可以注入自己創建實例
// expose a host object engine.AddHostObject("random", new Random()); engine.Execute("Console.WriteLine(random.NextDouble())");
可以給其他庫
engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core")); engine.Execute("Console.WriteLine(lib.System.DateTime.Now)"); // create a host object from script engine.Execute(@" birthday = new lib.System.DateTime(2007, 5, 22); Console.WriteLine(birthday.ToLongDateString()); ");