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());        ");