fre*_*ith 6 .net ironpython dynamic-language-runtime
我在一个较大的C#项目的一小部分内使用DLR,IronPython是有问题的语言.
对于系统的某些部分,用户可以输入一个小脚本来自定义它们的行为.我想做的是能够限制它们使用无副作用的纯函数或在某种沙盒中使它们的功能不能触及外面的任何东西.
此外,用户只能输入一个函数体,函数头和参数规范在传递给Python DLR引擎之前会自动在代码中预先设置,以便调用它的系统的C#端确切地知道要传递的args和什么回来了.用户只需要完全基于作为参数提供的值进行简单的操作和测试.
例如
还行吧: return (a * 100) > b;
这不行: delete_file_system(); return (a * 100) > b;
怎么可能实现这一目标?有更合适的语言或技术选择吗?
执行此操作的方法是创建沙盒应用程序域,然后在该应用程序域中运行该脚本.您可以在此处找到有关创建沙盒域的说明:http://msdn.microsoft.com/en-us/library/bb763046.aspx
要在app域中运行代码,您可以使用接受AppDomain的Python.CreateEngine重载.然后,该引擎中执行的所有代码都将在该app域中运行.
如果要将用户代码调用回主机,可以创建一个派生自MarshalByRefObject的类,并将其放在可供访问和回调的范围内.通话将进入您的正常应用程序域,您可以执行通常能够执行的所有操作.
ObjectOperations和ScriptScope上还有一堆API,它们与ObjectHandles一起使用,用于对远程域中的对象执行操作.
| 归档时间: |
|
| 查看次数: |
491 次 |
| 最近记录: |