是否有类似于C#/ .net的jEval?

时间:2010-05-14 16:02:43

标签: c# scripting eval

我正在寻找一种能够很容易地为我解析数学表达式的语言,但也能够根据需要调用函数和引用变量。 Jeval看起来就像我在寻找,但不幸的是我在C#工作。是否有.Net等同于jeval?

5 个答案:

答案 0 :(得分:3)

您可以使用像IronRuby这样的DLR语言来执行此操作。您可以在C#应用程序中执行(eval)脚本文件。

答案 1 :(得分:2)

在C#4.0中,没有任何东西可以直接使用。预计在C#5.0中,你会看到它,但现在对你没有帮助。

还有另一种选择......您可以使用Code DOM动态编译一些代码,然后运行它:Quick example.

不幸的是,这种方法有一些重大缺点。首先,它很慢。在现代机器上,它可能需要长达四分之一秒,只需编译最小的代码片段。其次,您实际上是在创建一个每次执行此操作时都会加载的新DLL。如果您的系统喜欢运行动态代码,那么您的工作空间中将会有大量动态生成的DLL。要解决这个问题,您可以在单独的应用程序域中执行动态代码,但现在您开始变得非常复杂。

我的建议:使用嵌入式脚本语言,如IronRuby,然后生成Ruby代码。您可以比我刚才概述的方法更快地评估嵌入式脚本语言。

答案 2 :(得分:0)

你可以用反射做到这一点。我没有详细信息,但我使用反射来执行包含我想要使用的对象名称的字符串。

答案 3 :(得分:0)

如果JavaScript听起来很有吸引力,请查看Jint,一个用于.NET的JS解释器。 Jint实际上实现了一个JS解释器,而不是编译代码和处理AppDomains。您可以将.NET类中的变量/方法公开给脚本,脚本可以将值返回给C#app。

绝对值得一试。

答案 4 :(得分:0)

使用JScript eval函数有一种简单的方法:

  • 创建一个JScript源文件JsMath.js:

    class JsMath
    {
        static function Eval(expression : String) : double
        {
            return eval(expression);
        };
    }
    
  • 将其编译为DLL:

    > jsc /t:library JsMath.js
    
  • 在您的C#项目中
  • ,添加对JsMath.dll的引用,并调用JsMath.Eval方法:

    double x = JsMath.Eval("2 + 3 * 4");