【问题标题】:Is there a way to switch environments while using Jint.NET?有没有办法在使用 Jint.NET 时切换环境?
【发布时间】:2019-09-20 20:15:58
【问题描述】:

我目前正在使用用于 C# 的 Jint.NET JavaScript 控制台引擎,并且我正在尝试模拟用户可以在其之间切换的单独 JavaScript 环境。

但是,我不想为每个 JavaScript 环境创建一个全新的控制台引擎并造成很大的开销,而只是使用单个引擎在它们之间切换并将环境存储在其他地方,例如:

   engine 1
   |      |
   |      |
env 1   env 2

可以这样做吗?

【问题讨论】:

  • 也许:可以换入/换出全局属性并在(匿名)函数内运行用户代码以避免全局范围污染。没有完全隔离。

标签: c# .net jint


【解决方案1】:

找到了一个解决方案,尽管在任何地方我都找不到这方面的文档,所以这可能是一个意想不到的方法。您需要在新创建的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);

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2020-04-04
    • 1970-01-01
    • 2013-06-10
    • 2015-04-04
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多