【问题标题】:basic scripting language usable from C#可从 C# 使用的基本脚本语言
【发布时间】:2017-11-26 06:51:29
【问题描述】:

对于一个项目,我要求我的用户能够以字符串的形式提供一个简单的函数,并且我希望能够从我的程序中对其进行评估。 假设函数签名始终是int f(int a, int b)

我想这样做,以便我的用户可以提供用基本语言编写的 f 的实现。 例如:

return a*b;

if(a ==1) return b else return 3

在我的程序中,我希望能够解析用户输入函数,使其成为我的 C# 代码中真正的可调用函数。我只需要基本的功能,比如基本的数学知识和条件(甚至循环都不需要)。

是否存在一种基本的“语言”,可以让我解释这些定义为输入的函数并将它们转换为可调用代码? 例如,我认为使用 Lua 来做这种矫枉过正?

理想情况下,我想要一些开源的东西,代码库最少,而且质量很好。这样的事情存在吗?理想情况下,它还应该具有多种语言的实现,例如 C# 和 Java。 我知道编写自己的解析器的诱惑很大,但我觉得必须有一个开箱即用的解决方案来解决我的问题

【问题讨论】:

标签: c# scripting scripting-language


【解决方案1】:

我认为没有简单的方法可以做到这一点。但也有一些易于使用的解决方案。我真的很喜欢Irony 玩得很开心。但它有点被遗弃了。您可以使用ANTLR,但这并不简单。您也许可以使用Roslyn Api 来做您想做的事,这一切都取决于。我不确定您需要多好的沙盒,但您可以使用 C# scripts 这将允许你做这样的事情

ScriptState state = CSharpScript.Run("int Times(int x) { return x * x; }");
var fn = state.CreateDelegate>("Times");
var value = fn(5);
Console.Write(value);

【讨论】:

    【解决方案2】:

    如果您只需要数学函数,您可以在数据表中接收一个字符串并对其进行评估,然后返回结果。

    using System.Data;
    
    //string mathExp = "3 * (2+4)"
    public string ShiestyEval(string mathExp)
    {
        DataTable dt = new DataTable();
        var v = dt.Compute(mathExp,"");
        return v;
    }
    

    为了让它可以从你的应用程序中调用,你需要提供一个接口,他们可以在其中评估那里的方法,或者如果你想做一些阴暗的 hack 并通过 Il 生成一个程序集,然后你可以加载它,这是一个你想如何使用它有点模糊

    您也可以结帐JSharp

    【讨论】:

    • 我不知道 C# 中有这样的内置功能,但我并不感到惊讶。但是我不认为这会是有条件的。理想情况下,我需要更正式定义的东西,以便可以移植和使用其他语言
    • 是的,这是一个阴暗的 eval hack,当有人让我为面试问题制作计算器时我就知道了,我只是想看看最简单的方法
    猜你喜欢
    • 2010-12-22
    • 2010-12-03
    • 2016-04-15
    • 1970-01-01
    • 2011-03-10
    • 2012-09-22
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多