如何中断用户编写的脚本?

时间:2019-04-10 12:32:04

标签: c# csharpscript

尝试运行脚本(使用Roslyn Scripting API):

var source = "while(true) { }";
return CSharpScript.EvaluateAsync(source).Result;

它将永远运行。如何打断它?

我不介意使用其他脚本引擎,尽管要求提供一个主题引擎。我发现了类似的问题(example),但它们没有帮助。

背景:我想在我的软件中添加对C#用户编写脚本的支持。我想在沙箱中运行脚本,因此中断脚本的能力至关重要。过去,我对CodeDOM有一定的经验,但是我也找不到一种方法来中断脚本。

想法:

  • 我可以对用户编写的文本进行预处理,并在每行之后插入我的代码(检查CancellationTokenreturn/throw)。但是上面的示例不受这种技术的影响,因此我必须走复杂的语法分析器路线(没有经验,想法?)。
  • 我可以提供一种方法,用户必须在脚本中有问题的地方(例如,内部循环)显式调用该方法,但用户可能只是决定忽略该方法。
  • 是否可以逐步运行脚本?沙盒调试器模式?然后,我可以检查外部请求以终止脚本并停止调试。

还有其他可能性吗?有没有人实施过 safe 用户编写的脚本?

0 个答案:

没有答案