在Monotouch中编译lambdas并调用设备上的委托

本文关键字:调用 Monotouch 编译 lambdas | 更新日期: 2023-09-27 18:03:19

我目前正在MonoTouch中移植一个。net代码库,我目前正在研究一个接收Expression<T>的方法。我正在尝试编译它,然后动态调用它。

我是这样做的:

// Here's an example of what I could receive
Expression<Action<int>> 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上尝试时,我收到了以下异常:

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)

我做错了什么,我怎样才能使它工作?

在Monotouch中编译lambdas并调用设备上的委托

不熟悉System.Linq。表达式,但可能涉及运行时代码生成。

iOS中没有JIT,所有代码必须提前编译。同样的限制在模拟器中不适用,因此您的代码在模拟器中运行。

在iOS设备上不支持Compile()方法,因为设备会阻止JIT引擎运行。Compile本身是使用System.Reflection.Emit实现的,这反过来又需要一个有效的JIT。因此,上面的代码永远不能与表达式树一起工作。