c#執行javascript腳本

c#執行javascript腳本

clearscript 是一個 .net 平台下的開源庫,用於在 c# 和其他 .net 語言中執行腳本代碼。

最后更新 2023/3/14 下午10:03
沙漠尽头的狼
预计阅读 5 分钟
分类
.NET
标签
.NET C# JavaScript 開源 c#與js互操作

clearscript 是一個 .net 平台下的開源庫,用於在 c# 和其他 .net 語言中執行腳本代碼。它提供了一種方便和安全的方法來將腳本與應用程式集成,並允許將應用程式暴露給腳本以進行更高級別的自定義和交互。本篇文章將深入居間 clearscript 的使用方法和特點,包括如何在 c# 中執行 javascript 腳本、如何與腳本交互、如何調用 c# 方法等方面的內容。

安裝和配置

clearscript 可以通過 nuget 包管理器進行安裝。要安裝 clearscript,可以在 visual studio 中打開 nuget 包管理器控制台,並運行以下命令:

Install-Package ClearScript

安裝完成後,還需要將clearscript nuget包下的runtimes目錄複製到運行目錄,然後就可以在項目中使用 clearscript 庫。

執行 javascript 腳本

要在 c# 中執行 javascript 腳本,需要創建一個 javascript 引擎實例,並將腳本傳遞給該實例。以下是一個簡單的示例,演示了如何執行一個簡單的 javascript 程式:

using var engine = new V8ScriptEngine();
engine.Execute("var a = 10; var b = 20; var c = a + b;");
var result = engine.Script.c;
Console.WriteLine(result); // 输出 30

在這個示例中,我們創建了一個名為“engine”的 v8scriptengine 對象,並調用其 execute() 方法來執行一些 javascript 代碼。在這種情況下,我們定義了三個變量(a、b 和 c),將它們相加,並將結果存儲在變量 c 中。然後,我們從 engine.script 對象中檢索變量 c 的值,並將其輸出到控制台。

與腳本交互

在執行 javascript 腳本時,可以將 c# 對象傳遞給腳本,以便腳本可以訪問這些對象。要將對象傳遞給腳本,需要使用 addhostobject() 方法將對象添加到 javascript 引擎中。以下是一個簡單的示例,演示了如何將 c# 對象傳遞給 javascript:

/// <summary>
/// Person类需要为Public,V8引擎才能正常访问
/// </summary>
public class Person
{
    public string? Name { get; set; }
    public int Age { get; set; }
}

/// <summary>
/// JS与C#交互
/// </summary>
static void InteractionBetweenJsAndCsharp()
{
    using var engine = new V8ScriptEngine();
    var person = new Person { Name = "沙漠尽头的狼", Age = 18 };
    engine.AddHostObject("person", person);
    engine.Execute("var c = person.Name + ' 才 ' + person.Age + ' 岁呀?';");
    var result = engine.Script.c;
    Console.WriteLine(result); // 沙漠尽头的狼 才 18 岁呀?
}

在这个示例中,我们创建了一个名为“person”的 C# 对象, 注意Person的定义访问修饰符为public,并使用 AddHostObject() 方法将其添加到 JavaScript 引擎中。然后,我们执行一个 JavaScript 程序,该程序拼接person对象的属性组成一个JS变量,最后C#访问JS变量输出到控制台(尝试在JS中使用console.log输出未成功,有知道原因的朋友请留言告知)。

js 調用 c# 方法

除了將 c# 對象傳遞給 javascript 外,還可以在 javascript 中調用 c# 方法。要在 javascript 中調用 c# 方法,需要創建一個包含方法的類,並使用 addhostobject() 方法將該類添加到 javascript 引擎中。以下是一個簡單的示例,演示了如何在 javascript 中調用 c# 方法:

/// <summary>
/// JS调用C#的方法
/// </summary>
static void JsCallCSharpMethod()
{
    using var engine = new V8ScriptEngine();
    var calculator = new Calculator();
    engine.AddHostObject("calculator", calculator);
    engine.Execute("var result = calculator.Add(15, 20)");
    var result = engine.Script.result;
    Console.WriteLine(result); // 35
}

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

在這個示例中,我們創建了一個名為“calculator”的 calculator 對象,並使用 addhostobject() 方法將其添加到 javascript 引擎中。然後,我們在 javascript 中執行一個程式,該程式調用 calculator 對象的 add() 方法,並將結果賦值給js變量,最後c#中取得變量值並輸出到控制台。

多線程使用

clearscript 還支持在多個線程中使用 javascript 引擎。要在多個線程中使用 javascript 引擎,需要創建多個 javascript 引擎實例,並使用各自的線程來執行腳本。以下是一個簡單的示例,演示了如何在多個線程中使用 javascript 引擎:

using System.Threading.Tasks;
using Microsoft.ClearScript.V8;

var engine1 = new V8ScriptEngine();
var engine2 = new V8ScriptEngine();

Task.Run(() =>
{
    engine1.Execute("var a = 'Hello from thread 1!'");
});

Task.Run(() =>
{
    engine2.Execute("var b = 'Hello from thread 2!'");
});

在這個示例中,我們創建了兩個名為“engine1”和“engine2”的 v8scriptengine 對象,並在兩個不同的線程中分別執行了兩個 javascript 程式。這些程式定義js變量。

需要注意的是,在多個線程中使用 javascript 引擎時,應該避免同時訪問同一個 javascript 引擎實例,以避免線程安全問題。

總結

本文居間了 clearscript 的使用方法和特點,包括如何在 c# 中執行 javascript 腳本、如何與腳本交互、如何調用 c# 方法、多線程使用等方面的內容。clearscript 提供了一種方便和安全的方法來將腳本與應用程式集成,並允許將應用程式暴露給腳本以進行更高級別的自定義和交互。通過使用 clearscript,可以為應用程式添加靈活性和可擴展性,並在應用程式中實現動態腳本執行功能。

參考資料

  • ClearScript Examples:https://microsoft.github.io/ClearScript/Examples/Examples.html
Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2026/2/7

aot使用經驗總結

從項目創建伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 aot 發布測試。

继续阅读