在Monotouch中编译lambdas并在设备上调用委托
我目前正在MonoTouch中移植.NET代码库,我目前正在研究一种接收Expression
。 我正在尝试编译它,然后动态调用它。
这是我做的:
// Here's an example of what I could receive Expression<Action> expression = (a => Console.WriteLine (a * 2)); // And here's what I'm trying to do to invoke it expression.Compile().DynamicInvoke(6);
这在iOS模拟器中工作正常,结果“12”在我的控制台中打印。 但后来我在iPad上尝试了,我收到了以下exception。
Object reference not set to an instance of an object at System.Linq.jvm.Runner.CreateDelegate () at System.Linq.Expressions.LambdaExpression.Compile () at System.Linq.Expressions.Expression`1[System.Action`1[System.Int32]].Compile () at TestSolution2.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication app, MonoTouch.Foundation.NSDictionary options)
我做错了什么,我怎么能让它发挥作用?
不熟悉System.Linq.Expressions,但可能它涉及运行时代码生成。
iOS中没有JIT,所有代码都必须提前编译。 同样的限制不适用于模拟器,因此您的代码在那里运行。
看到这里 。
iOS设备不支持Compile()
方法,因为该设备会阻止JIT引擎运行。 编译本身是使用System.Reflection.Emit实现的,而这又需要一个正常运行的JIT。 所以上面的代码永远不会使用表达式树。