可从C#

时间:2017-06-22 20:25:39

标签: c# scripting scripting-language

对于一个项目,我要求我的用户能够提供一个简单的函数作为字符串,我希望能够从我的程序中评估它。 我们假设函数签名始终为int f(int a, int b)

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

return a*b;

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

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

是否有基本的#34;语言"是否存在允许我解释定义为输入的这些函数并将其转换为可调用代码? 例如,我认为使用Lua进行这种过度杀伤?

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

2 个答案:

答案 0 :(得分:1)

如果你只需要数学函数,你可以在数据表中输入一个字符串,然后返回结果。

using System.Data;

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

为了让它可以从你的应用程序中调用,你需要提供一个界面,在那里他们可以评估方法,或者如果你想做一些阴暗的黑客并生成一个程序集虽然Il,并加载它你可以,它是一个关于你想如何使用它有点模糊

您还可以结帐JSharp

答案 1 :(得分:0)

我认为没有一种简单的方法可以做到这一点。但是有一些易于使用的解决方案。我真的很喜欢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);