gpt4 book ai didi

c# - 在 Monotouch 中编译 lambda 并在设备上调用委托(delegate)

转载 作者:太空狗 更新时间:2023-10-29 17:47:06 26 4
gpt4 key购买 nike

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

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

最佳答案

不熟悉 System.Linq.Expressions,但推测它涉及运行时代码生成。

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

参见 here .

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

关于c# - 在 Monotouch 中编译 lambda 并在设备上调用委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6796637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com