ClearScript は、.NET プラットフォーム向けのオープンソースライブラリであり、C# やその他の .NET 言語でスクリプトコードを実行するために使用されます。アプリケーションにスクリプトを便利かつ安全に統合する方法を提供し、スクリプトに対してアプリケーションを公開することで、より高度なカスタマイズと対話を可能にします。この記事では、C# での JavaScript スクリプトの実行方法、スクリプトとの対話方法、C# メソッドの呼び出し方法など、ClearScript の使用方法と特徴について詳しく説明します。
インストールと設定
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 コードを実行しています。ここでは、3 つの変数(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 という名前の 2 つの V8ScriptEngine オブジェクトを作成し、2 つの異なるスレッドでそれぞれ JavaScript プログラムを実行しています。これらのプログラムは JS 変数を定義しています。
なお、複数のスレッドで JavaScript エンジンを使用する場合は、同じ JavaScript エンジンインスタンスに同時にアクセスしないように注意し、スレッドセーフの問題を回避する必要があります。
まとめ
この記事では、C# での JavaScript スクリプトの実行方法、スクリプトとの対話方法、C# メソッドの呼び出し方法、マルチスレッドの使用など、ClearScript の使用方法と特徴について説明しました。ClearScript は、アプリケーションにスクリプトを便利かつ安全に統合する方法を提供し、スクリプトに対してアプリケーションを公開することで、より高度なカスタマイズと対話を可能にします。ClearScript を使用することで、アプリケーションに柔軟性と拡張性を追加し、アプリケーション内で動的なスクリプト実行機能を実現できます。
参考資料
- ClearScript の例: https://microsoft.github.io/ClearScript/Examples/Examples.html