protected virtual void CreateEvaluators() { _evaluators.Clear(); if (ShowExpr == null) { return; } if (EnvironmentExt.IsUnix()) { // Ticket #86: temporarily disable it for Mono, because // RuntimeCompile.Compile() does not work there. return; } foreach (ExprFormatter spp in ShowExpr) { StringBuilder code = new StringBuilder(); code.Append("using System;\n"); code.Append("using System.Collections.Generic;\n"); code.Append("using ai.lib.algorithms.tree;\n"); code.Append("public unsafe class _Evaluator: ITextualizeTreeEval {\n"); code.Append(" public object Evaluate(object c, object oTree, object oStack, int d) {\n"); code.AppendFormat(" List<{0}> s = (List<{0}>)oStack;", _contextT); code.AppendFormat(" {0} t = ({0})oTree;", _treeT); code.AppendFormat(" return {0};\n", spp.Expr); code.Append("}}"); Assembly asm = RuntimeCompile.Compile(code.ToString(), _compilerParameters); Object evaluator = asm.CreateInstance("_Evaluator"); _evaluators[spp.Expr] = (ITextualizeTreeEval)evaluator; } }
public void Test_Evaluator() { CompilerParameters cp = new CompilerParameters(); cp.GenerateExecutable = false; cp.GenerateInMemory = true; cp.ReferencedAssemblies.Add("system.dll"); cp.ReferencedAssemblies.Add(Path.GetFileName(CodeBase.Get(Assembly.GetExecutingAssembly()))); string code = "using System; using ai.lib.utils.nunit;"; code += "public class _Evaluator {\n"; code += " public object Evaluate(RuntimeCompile_Test param) {\n"; code += " return param.Field1*3;\n"; code += " }}"; Assembly asm = RuntimeCompile.Compile(code, cp); Object evaluator = asm.CreateInstance("_Evaluator"); MethodInfo mi = evaluator.GetType().GetMethod("Evaluate"); object result = mi.Invoke(evaluator, new object[] { this }); Assert.AreEqual(Field1 * 3, (int)result); code = "using System; using ai.lib.utils.nunit;"; code += "public class _Evaluator {\n"; code += " public object Evaluate(RuntimeCompile_Test param) {\n"; code += " return param.FieldArr1[2] + 5;\n"; code += " }}"; asm = RuntimeCompile.Compile(code, cp); evaluator = asm.CreateInstance("_Evaluator"); mi = evaluator.GetType().GetMethod("Evaluate"); result = mi.Invoke(evaluator, new object[] { this }); Assert.AreEqual(FieldArr1[2] + 5, (int)result); }