【问题标题】:Compiling lambdas and invoking delegates on the device in Monotouch在 Monotouch 中编译 lambdas 并在设备上调用委托
【发布时间】:2011-07-22 22:10:27
【问题描述】:

我目前正在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)

我做错了什么,我该如何让它发挥作用?

【问题讨论】:

    标签: c# delegates lambda xamarin.ios expression-trees


    【解决方案1】:

    不熟悉 System.Linq.Expressions,但大概涉及运行时代码生成。

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

    here

    iOS 设备不支持Compile() 方法,因为该设备会阻止 JIT 引擎运行。编译本身是使用 System.Reflection.Emit 实现的,而这又需要一个正常运行的 JIT。所以上面的代码永远不会与表达式树一起工作。

    【讨论】:

    • 我猜操作系统不会阻止代码的生成,但会阻止将其标记为可执行文件。当然最终结果是一样的。
    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 2018-08-27
    • 2012-08-15
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多