使用 Jint.NET 时有没有办法切换环境?
Is there a way to switch environments while using Jint.NET?
我目前正在使用 C# 的 Jint.NET JavaScript 控制台引擎,并且我正在尝试模拟用户可以在其间切换的单独 JavaScript 环境。
但是,我不想为每个 JavaScript 环境创建一个全新的控制台引擎并导致大量开销,而只是使用单个引擎在它们之间切换并将环境存储在其他地方,例如:
engine 1
| |
| |
env 1 env 2
可以这样做吗?
找到了解决这个问题的方法,虽然我找不到任何关于这个的文档,所以这可能是一种意想不到的方法。您需要在新创建的 LexicalEnvironments
上使用 EnterExecutionContext
,并且您可以在它们之间切换以获得单独的 JS 环境。
这是一个例子:
using Jint.Runtime.Environments;
using Jint.Native.Object;
using Jint.Native.Global;
//Create a new object instance and environment.
JSObjectInstance = GlobalObject.CreateGlobalObject(jintEngine);
JSEnvironment = LexicalEnvironment.NewObjectEnvironment(jintEngine, JSObjectInstance, jintEngine.GlobalEnvironment, false);
//Enter the new environment.
jintEngine.EnterExecutionContext(JSEnvironment, JSEnvironment, new Jint.Native.JsValue(false));
完成该环境后,您可以使用 LeaveExecutionContext
离开,然后像这样重新加入默认的全局环境:
jintEngine.EnterExecutionContext(jintEngine.GlobalEnvironment, jintEngine.GlobalEnvironment, jintEngine.Global);
我目前正在使用 C# 的 Jint.NET JavaScript 控制台引擎,并且我正在尝试模拟用户可以在其间切换的单独 JavaScript 环境。
但是,我不想为每个 JavaScript 环境创建一个全新的控制台引擎并导致大量开销,而只是使用单个引擎在它们之间切换并将环境存储在其他地方,例如:
engine 1
| |
| |
env 1 env 2
可以这样做吗?
找到了解决这个问题的方法,虽然我找不到任何关于这个的文档,所以这可能是一种意想不到的方法。您需要在新创建的 LexicalEnvironments
上使用 EnterExecutionContext
,并且您可以在它们之间切换以获得单独的 JS 环境。
这是一个例子:
using Jint.Runtime.Environments;
using Jint.Native.Object;
using Jint.Native.Global;
//Create a new object instance and environment.
JSObjectInstance = GlobalObject.CreateGlobalObject(jintEngine);
JSEnvironment = LexicalEnvironment.NewObjectEnvironment(jintEngine, JSObjectInstance, jintEngine.GlobalEnvironment, false);
//Enter the new environment.
jintEngine.EnterExecutionContext(JSEnvironment, JSEnvironment, new Jint.Native.JsValue(false));
完成该环境后,您可以使用 LeaveExecutionContext
离开,然后像这样重新加入默认的全局环境:
jintEngine.EnterExecutionContext(jintEngine.GlobalEnvironment, jintEngine.GlobalEnvironment, jintEngine.Global);