65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 JavaScript 的 Eval() 函数评估 C# 表达式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (13投票s)

2009 年 12 月 6 日

CPOL

2分钟阅读

viewsIcon

70884

downloadIcon

764

本文档描述了如何将 Eval() 封装在一个小的 JScript 类中,将其编译成一个程序集,并从 C# 中调用它以在运行时评估表达式。

引言

在 C# 程序员的生活中,有时您可能需要在 C# 中评估一个非硬编码的表达式。 有几种方法可以做到这一点

  • 使用 Flee (快速轻量级表达式评估器)
  • 编写您自己的表达式解析器,有或无现有工具和/或库的帮助
  • 动态生成 C# 代码,在运行时编译它,并通过反射使用它
  • 本文档中描述的解决方案

本文档描述了如何使用 JavaScript 的 eval() 方法从 C# 评估表达式。 这是一种非常简单的方法,但它可以支持许多不同的场景。 例如,它可以用于评估数学表达式以及布尔表达式。 它还可以用于处理或生成字符串。

本文的想法并非独一无二。 我在几个用户组中找到了对此想法的参考。 但是,我找不到一篇逐步描述它的文章。

请注意,此方法可能不太安全。 我建议仅在评估的表达式受到某种控制,并且不是由任何用户直接输入的的情况下使用它。

Using the Code

JavaScript 文件

MB.JsEvaluator.js 包含一个围绕方法的非常简单的包装器,该方法又包装了 JavaScript 的 eval()

package MB.JsEvaluator
{
    class Evaluator
    {
        public function Eval(expr : String) : String
        {
            return eval(expr, "unsafe");
        }
    }
}

编译 JavaScript 文件

CompileEvaluator.bat 包含将 .js 文件编译成名为“MB.JsEvaluator.dll”的 .NET 程序集的命令。 批处理文件必须从 Visual Studio 命令提示符中运行。 源代码已经包含此程序集的副本,因此您无需执行此操作。

REM Run from Visual Studio prompt.

jsc /target:library MB.JsEvaluator.js 

使用 MB.JsEvaluator 程序集

在您的项目中,您必须引用“MB.JsEvaluator.dll”和“Microsoft.JScript”。 下面的代码显示了非常简单的演示应用程序的核心

// Ask user to enter expression.
Console.WriteLine("Enter an expression:");
string expression = Console.ReadLine();

// Evaluate expression.
MB.JsEvaluator.Evaluator evaluator = new MB.JsEvaluator.Evaluator();
string result = evaluator.Eval(expression);

// Print expression.
Console.WriteLine("Result:"); 
Console.WriteLine(result);

我的使用方式

在我的应用程序中,我使用它来评估布尔表达式。 用户输入一个可能包含“and”、“or”和某些变量名称的表达式。 在将表达式提供给 JavaScript 之前,我将“and”替换为“&&”、“or”替换为“||”,并将变量名称替换为字面量。 在我的情况下,安全风险很低,因为输入表达式的用户将是配置系统的人员,他们是我们公司的员工。 我们的应用程序也不是服务器应用程序,因此最糟糕的情况是最终用户弄乱了他/她的计算机。

我认为 Flee 也可以是一个可行的选择,但我当时不知道它。

历史

  • 2009 年 12 月 5 日 - 初始版本
© . All rights reserved.