如何在另一个 AppDomain 中运行代码?我需要沙箱我的 IronPython 代码

Posted

技术标签:

【中文标题】如何在另一个 AppDomain 中运行代码?我需要沙箱我的 IronPython 代码【英文标题】:How to run code in another AppDomain? I need to sandbox my IronPython code 【发布时间】:2016-08-19 11:55:37 【问题描述】:

我有一些 IronPython 代码,我将变量传递给它并希望从 python 接收结果。当我在当前域中创建引擎时,我设法从 IronPython 获得了结果:

ScriptEngine pyEngine = IronPython.Hosting.Python.CreateEngine()

那我就拿这样的结果:

var result = this.pyScope.GetVariable("ObiektMS").code_1_1_1("II");

但是,我需要将其沙盒化,因此我创建了一个权限受限的 AppDomain 并在其中运行引擎:

ScriptEngine pyEngine = IronPython.Hosting.Python.CreateEngine(newDomain)

但这一次当我尝试以我得到的相同方式获得结果时

An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in PythonTimeTests.exe

是不是因为我的“结果”变量在不同的域中,而 Ironpython 的结果必须被序列化?

是否可以在新域中创建变量? 我希望我的程序这样做:

1.从文件中读取字典。

2.创建一个有限制的新域并将字典传递给它。

3.通过从c#调用python函数在铁python中工作(都在受限域中)

4.将结果返回到不受限制的域。

【问题讨论】:

【参考方案1】:

是 - 跨域变量在域之间进行序列化,除非它们从 MarshallByRefObject 继承,如此处所述Sharing data between AppDomains

您的第二个问题是“我可以......做一些 C# 的东西” - 是的;你可以在 AppDomain 中做任何你想做的事情。您只需要遵循 AppDomain 数据传输规则即可在 AppDomain 之间传递内容。

【讨论】:

以上是关于如何在另一个 AppDomain 中运行代码?我需要沙箱我的 IronPython 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个 AppDomain 中处理静态连接

在 ASP.NET 中的其他 AppDomain 中运行应用程序

使用 JointCode.Shuttle 动态注册 / 注销服务

如何从不同appdomain的类库中调用实例方法?

如何识别代码是在 ASP.Net 还是常规 AppDomain 下运行 [重复]

在 .NET Framework 4.0 的 AppDomain 中运行 codeCom 代码