c# - .net 框架中用户脚本的受控执行
问题描述
我的用户想要的是在我们的系统中编写和添加“存储过程”(不是 SQL)。这些程序在用户定义的函数中包含用户逻辑,处理内存对象,使用高级数据结构,如列表、结构、字典。这些脚本创建内存中的 XML 文件。
脚本不被其他用户审查——执行子系统必须保证脚本不会对服务器造成任何损害。脚本访问外部资源(文件系统、sql 数据库等)是不可接受的,但应使用应用程序公共 API - 最好的方法是使用自定义对象实例方法。因此脚本应该在执行期间与环境通信,但只能通过受控方式。不能吃掉所有的记忆,不能永远奔跑。
脚本可以编写应该被捕获和显示的输出消息。如果有办法以某种方式调试脚本执行,那将是一笔财富。
我是这个问题空间的新手。脚本语言不指定,可以是python、powershell、C#脚本,什么都可以。我在研究阶段发现了 CSharpScript ( https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples ),但我不确定这是否是最好的选择。有谁知道一个更好的起点吗?我们应该如何解决这个问题——因为我们不想编写脚本语言,定义解析器并自己执行脚本。感谢您的建议!
解决方案
碰巧的是,roslyn(微软代码分析)是编译和构建程序集的好功能,然后与其他外部 DLL 结合起来很容易。使用反射可以启动脚本,因此可以启动执行。
但是控制执行时间,限制资源使用(内存,cpu,...),限制外部资源(磁盘,网络,数据库,...)的访问并不是一件容易的事。
推荐阅读
- javascript - 在 Reactjs 中使用状态更改更新子组件
- c# - WCF 客户端连接超时
- haskell - Haskell 中类型级别 Nats 的一致性
- java - 有没有办法在手机上完全创建一个 .jar?
- pentaho - 如何在 Pentaho CDE 中更改 CCC 折线图的文本大小
- delphi - 使用临时 TListItems 填充 TListView
- python - 使用 Pandas,我如何根据第一个空格进行拆分。
- git - 如何在 Cargo 中使用相对 git 子模块路径?
- c# - Selenium 不检索元素的当前文本值
- r - 带有可选年份的日期模式的正则表达式