最近在开发一个软件项目时,需求方提出需要根据自定义的计算公式,动态生成软件系统中存储的结果数据和中间参数。以我以往的经验来看,这种需求在解释型语言中比较好处理,例如在python中,只需要将字符串存储的表达式,通过eval()函数进行处理,就可以让解释器把结果输出给调用函数,这样就可以让用户来定义流程中的一部分。
那么在.net环境下,我们应该如何去做呢?比较底层的做法时通过表达式.net的Expression(表达式树)api来解析表达式,并进行运算。这种做法显然不符合我们不造轮子的态度,那么我们来看看有哪些轮子可以用吧。
- pythonnet 在.net程序直接调用python语言和函数
- nlua 在.net程序中,调用lua
- Fell 在.net程序中,调用vb
这三种方式,我选择了nlua,原因是lua语言很简单——甚至比python还简单。本身作为一种嵌入式语言,lua被广泛应用于计算机和互联网领域中,学习曲线很低,对于教会客户使用这个工具我还是很有信心的。接下来看一个例子:
using (Lua state = new())
{
state["x"] = 5;
object ss = state.DoString(@"return x+5")[0];
double result = Convert.ToDouble(ss);
}
上面的代码定义了一个Lua的运行时,在运行时中写入全局变量x,使用lua语句“return x+5”返回一个结果10,最终转换成double复制给.net对象,看很简单吧。
接下来我会分两篇文章讲述一下NLua在使用过程中的注意事项,以及高级应用,感谢阅读,如果对您有帮助,请您为我的文章点赞,让更多人可以看到。