在C#中使用V8ScriptEngine以不同参数多次重新运行脚本

问题描述 投票:0回答:1

我有一个大型 JavaScript 库,我想在我的 C# 项目中使用它,它使用

Microsoft.ClearScript.V8
-nuget 和以下代码就像一个魅力:

public int InvokeJavascript(int parameter)
{
    string libraryCode = System.IO.File.ReadAllText("library.js");
    string libraryInvokeCode = $"inoke({parameter})";
    string javascriptCode = $"{libraryCode};{libraryInvokeCode}";
    using (var engine = new V8ScriptEngine())
    {
        var result = engine.Evaluate(javascriptCode);
        return int.Parse(result.ToString());
    }
}

问题是,性能真的很差。我希望只为 JavaScript 库编译一次代码并调用已编译的脚本,以避免每次调用都编译它。 你知道我该怎么做吗?

javascript c# v8 clearscript
1个回答
0
投票
V8ScriptEngine.Compile

方法和主机参数

using (var engine = new V8ScriptEngine())
{
    var input = new Input();
    engine.AddHostObject("input", input);
    using (var script = engine.Compile("function invoke(i) {return i;}; invoke(input.i)"))
    {
        for (int i = 0; i < 10; i++)
        {
            input.i = i;
            var result = engine.Evaluate(script);
            Console.WriteLine(result);
        }
    }
}

public class Input
{
    public int i { get; set;}
}

记住不要丢弃 
script

engine
,例如,你可以很好地将它包裹在某个类中,如下所示:
public class JSExecutor<T, TResult>  : IDisposable
{
    private readonly V8ScriptEngine engine;
    private readonly V8Script script;
    private readonly Input input;
    
    public JSExecutor(string code)
    {
        engine = new V8ScriptEngine();
        input = new Input();
        engine.AddHostObject("input", input);
        script = engine.Compile(code);
    }
    
    public TResult Execute(T parameter)
    {
        input.parameter = parameter;
        return (TResult)engine.Evaluate(script);
    }
    
    public void Dispose()
    {
        script.Dispose();
        engine.Dispose();
    }

    public class Input
    {
        public T parameter { get; set; }
    }
}

并像这样使用它:

using (var executor = new JSExecutor<int,int>("function invoke(i) {return i;}; invoke(input.parameter)")) { for (int i = 0; i < 10; i++) { Console.WriteLine(executor.Execute(i)); } }

© www.soinside.com 2019 - 2024. All rights reserved.