如何在另一个 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 代码的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET 中的其他 AppDomain 中运行应用程序
使用 JointCode.Shuttle 动态注册 / 注销服务