C# 使用Jint.NET时有没有切换环境的方法?

C# 使用Jint.NET时有没有切换环境的方法?,c#,.net,jint,C#,.net,Jint,我目前正在使用C#的JavaScript控制台引擎,并尝试模拟用户可以在其中切换的单独JavaScript环境 但是,我不想为每个JavaScript环境创建一个全新的控制台引擎并造成很大的开销,而只是使用一个引擎在它们之间切换并将环境存储在其他地方,例如: engine 1 | | | | env 1 env 2 有可能做到这一点吗?找到了解决方案,尽管我在任何地方都找不到关于这一点的文档,因此这可能是一种意外的方法。您需要在新创建的词典环境上使用E

我目前正在使用C#的JavaScript控制台引擎,并尝试模拟用户可以在其中切换的单独JavaScript环境

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

   engine 1
   |      |
   |      |
env 1   env 2

有可能做到这一点吗?

找到了解决方案,尽管我在任何地方都找不到关于这一点的文档,因此这可能是一种意外的方法。您需要在新创建的
词典环境
上使用
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);

也许:可以交换全局的属性,并在(匿名)函数中运行用户代码,以避免全局范围污染。不完全隔离。