我有一个大型 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 库编译一次代码并调用已编译的脚本,以避免每次调用都编译它。 你知道我该怎么做吗?
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));
}
}