C#でJavaScriptスクリプトを実行する

C#でJavaScriptスクリプトを実行する

ClearScriptは、.NETプラットフォーム上のオープンソースライブラリで、C#やその他の.NET言語でスクリプトコードを実行するために使用されます。

最終更新 2023/03/14 22:03
沙漠尽头的狼
読了目安 3 分
カテゴリ
.NET
タグ
.NET C# JavaScript オープンソース C#とJSの相互運用

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!'");
});

この例では、engine1engine2 という名前の 2 つの V8ScriptEngine オブジェクトを作成し、2 つの異なるスレッドでそれぞれ JavaScript プログラムを実行しています。これらのプログラムは JS 変数を定義しています。

なお、複数のスレッドで JavaScript エンジンを使用する場合は、同じ JavaScript エンジンインスタンスに同時にアクセスしないように注意し、スレッドセーフの問題を回避する必要があります。

まとめ

この記事では、C# での JavaScript スクリプトの実行方法、スクリプトとの対話方法、C# メソッドの呼び出し方法、マルチスレッドの使用など、ClearScript の使用方法と特徴について説明しました。ClearScript は、アプリケーションにスクリプトを便利かつ安全に統合する方法を提供し、スクリプトに対してアプリケーションを公開することで、より高度なカスタマイズと対話を可能にします。ClearScript を使用することで、アプリケーションに柔軟性と拡張性を追加し、アプリケーション内で動的なスクリプト実行機能を実現できます。

参考資料

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2026/04/22

各OSバージョンの.NETサポート状況(250707更新)

仮想マシンとテストマシンを使用して、各OSバージョンの.NETサポート状況を確認します。OSインストール後、対応するランタイムをインストールし、Stardustエージェントを実行できることを確認します(合格条件)。

続きを読む
同じカテゴリ / 同じタグ 2026/02/07

AOTの使用経験のまとめ

プロジェクト作成当初から、新機能を追加したり新しい構文を使用したりした場合には、すぐにAOT公開テストを実施するという良い習慣を身につけるべきです。

続きを読む