使用CSharpCodeProvider编译字符串

时间:2010-10-19 16:13:18

标签: c#

试图弄清楚如何利用CSharpCodeProvider在运行时编译字符串数据。

在xml中,我将拥有存储在字符串中的谓词条件。

我希望能够在当前上下文中执行并获取这些语句的结果。

例如何时 读取并执行<Condition>Value=="ABCD1234"</Condition>,它应在当前对象范围中查找值,并根据语句的评估返回truefalse

我认为我正在使用CSharpCodeProvider正确的方向,但是我能找到的所有示例都与编译为.DLL或.EXE有关,我真的只想在内存中编译,这样我就可以执行比较并返回true或错误的应用程序的另一部分。

关于如何最好地解决这个问题的任何想法? CSharpCodeProvider甚至是这项工作的最佳工具吗?

3 个答案:

答案 0 :(得分:1)

我个人宁愿创建一个小型DSL(特定于域的语言)而不是编译这样的字符串。问题是将这些混合成一些编译的源代码打开了注入攻击的大门,并且检查语法也很困难。为简单的表达式和谓词创建一个小的解析器实际上非常简单,所以如果你不依赖于LINQ以及在你的条件下工作的任何东西,那么你可能更适合使用DSL路由。

为了让我对我正在谈论的内容有所了解,我邀请您查看我的GOLD Parser Engine,它是为这样的工作而制作的:http://code.google.com/p/bsn-goldparser/

解析过程的输出是一个语义AST(抽象语法树),然后可以编写它来动态执行“解释”评估或创建MSIL代码,这样您就可以获得快速编译的好处( JITed)代码以及对正在发生的事情的完全控制。

答案 1 :(得分:1)

我强烈建议您使用FLEE这样的内容。它不知道原生C#,但它能够解析并执行一个合适的函数子集,看起来它们适合您的使用。

我在很多场合都使用过FLEE,发现它很容易使用且足够快。

答案 2 :(得分:0)

CSharpCodeProvider可能有点矫枉过正。如果您的条件是基本的逻辑运算符(例如,等于,大于/小于),那么构建一些委托并编写一个简单的解析器来执行条件可能会更好。您的解析器将确定使用哪个运算符并执行相应的委托:

delegate bool equalsDel(string s1, string s2)
equalsDel = (s1, s2) => {return sq == s2;}
//Get your strings from the file and invoke the delegate
return equalsDel(s1, s2);

查看访问者模式,了解如何编写将确定运算符并执行相应委托的解析器/访问者的想法。您可以通过Func<T>获得创意,以创建一个编码不多的高效系统。