1: using System;
2: using System.CodeDom.Compiler;
3: using System.Reflection;
4:
5: public partial class EvaluatorTest: System.Web.UI.Page
6: { 7: protected void btnEval_Click(object sender, EventArgs e)
8: { 9: lbResult.Text = Evaluator.Eval(txtStatement.Text.Trim()).ToString();
10: }
11: }
12:
13: public class Evaluator
14: { 15: public static object Eval(string statement)
16: { 17: return _evaluatorType.InvokeMember("Eval", BindingFlags.InvokeMethod, null, _evaluator, new object[] {statement}); 18: }
19:
20: static Evaluator()
21: { 22: CodeDomProvider provider = CodeDomProvider.CreateProvider("JScript"); 23: CompilerParameters parameters;
24: parameters = new CompilerParameters();
25: parameters.GenerateInMemory = true;
26:
27: CompilerResults results;
28: results = provider.CompileAssemblyFromSource(parameters, _jscriptSource);
29:
30: Assembly assembly = results.CompiledAssembly;
31: _evaluatorType = assembly.GetType("Evaluator"); 32: _evaluator = Activator.CreateInstance(_evaluatorType);
33: }
34:
35: private static readonly object _evaluator;
36: private static readonly Type _evaluatorType;
37: private static readonly string _jscriptSource = @"class Evaluator { public function Eval(expr : String) : String { return eval(expr); } }"; 38: }