表达式是什么.在Monotouch上编译do

本文关键字:编译 do Monotouch 是什么 表达式 | 更新日期: 2023-09-27 18:15:16

因此表示Compile执行以下

将表达式树描述的lambda表达式编译为可执行代码,并生成表示lambda表达式的委托。

它在可移植类库中可用。

然而,当通过Monotuch运行.net时,不支持动态代码生成

由于iPhone的内核阻止应用程序动态生成代码,因此Mono在iPhone上不支持任何形式的动态代码生成。

因此,基于此,IOS上的Xamarin无法支持Expression。编写

那么调用Expression时会发生什么呢。在IOS上编译Xamarin?它会抛出和异常吗?如果是,会发生什么异常?它在任何地方都有记录吗?

表达式是什么.在Monotouch上编译do

代码是用AOT选项编译的,所以它实际上不会在运行时编译(我不知道Compile((后台发生的细节(。微软文档中的例子在iOS设备上运行得很好,没有例外。

    public override void FinishedLaunching(UIApplication application)
    {
        System.Linq.Expressions.Expression<Func<int, bool>> expr = i => i < 5;
        // Compile the expression tree into executable code.
        Func<int, bool> deleg = expr.Compile();
        // Invoke the method and print the output.
        Console.WriteLine("deleg(4) = {0}", deleg(4));
    }

您不能在运行时创建IL代码(System.Reflection.Emit(,并且对使用某些链接器选项的Reflection也有限制,有关此线程的更多信息。可能有一些表达式不进行AOT编译,在这种情况下,您会在运行时遇到关于尝试使用仅AOT选项进行JIT编译的异常。

如果你仔细看一下,新的Compile(bool)重载可能会让这一点更清楚,尽管文档(目前(没有提供太多关于细节的信息。

Compile()过去总是产生IL,因此不能用于AOT。

一段时间以来(我忘了它是什么时候出现的(,Compile()现在还可以对一组表示操作的对象进行"编译"(它们的操作与IL非常相似,堆栈由固定长度的object[]表示(,它使用反射(但不是"reflection.Emit"反射(进行方法调用,并使用自己的代码进行算术等基本操作。

Compile(bool)让你要求IL生成(false(或解释(true(,但它被视为一种偏好而非需求;如果你要求在一个只有口译的平台上生成IL,你会得到口译,反之亦然。大多数情况下,如果你能做到这一点,你希望IL生成(通常更快,解释器有一些限制(,但你可能想排除平台之间的差异,或者你可能会发现,虽然平均而言,解释的委托执行较慢,平均而言,Compile()步骤本身使用解释器会更快,有时如果您正在创建几个一次性表达式,则使用解释器的总时间会更快。(但并非总是如此,如果出于性能原因尝试这样做,请配置文件和/或考虑缓存委托(如果可以的话(。

顺便说一句,这意味着System.Linq.Expressions包含代表一种语言(表达式本身就是一种语言(的代码,用第二种语言(C#(编写,这些代码不仅被编译成第三种语言(CIL(,而且还被编译成它包含解释器的另一种语言。这也是为什么我觉得这是一个有趣的项目:(