首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CSharpCodeProvider编译字符串

使用CSharpCodeProvider编译字符串
EN

Stack Overflow用户
提问于 2010-10-20 00:13:18
回答 3查看 886关注 0票数 2

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

在xml中,我将相当于谓词条件的内容存储在字符串中。

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

例如,当读取和执行<Condition>Value=="ABCD1234"</Condition>时,它应该在当前对象作用域中查找值,并根据语句的计算结果返回truefalse

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

对于如何最好地实现这一点有什么想法吗?CSharpCodeProvider是做这项工作的最佳工具吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-20 00:29:46

我强烈建议对这样的事情使用FLEE。它不知道原生C#,但它有能力解析和执行合理的函数子集,这些函数看起来适合您的使用。

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

票数 1
EN

Stack Overflow用户

发布于 2010-10-20 00:25:18

我个人更愿意创建一种小型的DSL (领域特定语言),而不是编译这样的字符串。问题是,将它们混合到一些编译的源代码中会打开注入攻击的大门,而且检查语法也很困难。为简单的表达式和谓词创建一个小型解析器实际上非常简单,所以如果您不依赖于LINQ或其他任何适合您的条件的解析器,那么您可能会更好地使用DSL路线。

为了对我所说的内容有一个印象,我邀请您来看看我的金色解析器引擎,它是为以下工作而设计的:http://code.google.com/p/bsn-goldparser/

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

票数 1
EN

Stack Overflow用户

发布于 2010-10-20 00:28:36

CSharpCodeProvider可能是过度杀伤力。如果您的条件是基本的逻辑运算符(例如,等于、大于/小于),那么构建几个委托并编写一个简单的解析器来执行条件可能会更好。您的解析器将确定使用哪个运算符,并执行适当的委托:

代码语言:javascript
复制
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);

查看Visitor模式,了解如何编写解析器/访问器来确定运算符并执行适当的委托。您可以使用Func<T>发挥创造力,创建一个高效的系统,而不需要太多的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3970382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档