【问题标题】:Why does LambdaExpression.Compile() work on iOS (Xamarin)?为什么 LambdaExpression.Compile() 在 iOS (Xamarin) 上工作?
【发布时间】:2015-04-05 01:00:36
【问题描述】:

由于 Xamarin.iOS 不支持在运行时生成代码,为什么 Compile() 和 DynamicInvoke() 可以按预期工作?

例如,以下代码可以正常工作:

var lambda = Expression.Lambda(
                          Expression.Add(
                              Expression.Constant(1),
                              Expression.Constant(2)
                          )
             );

var f = lambda.Compile();
var result = f.DynamicInvoke();

// result==3 at this point

Xamarin 是否在运行时评估表达式树而不是发出 IL 代码?

【问题讨论】:

    标签: ios xamarin il


    【解决方案1】:

    在支持代码生成的平台上,使用基于 Reflection.Emit 的LambdaCompiler

    如果不可用,则使用the interpreter解释表达式。例如,有些类可以解释 ConstantAdd

    【讨论】:

    • 我在怀疑类似的事情。这在任何地方都有记录吗?
    • 虽然您的回答很有道理,但我想知道是否有参考或文档可以证实这一点。
    • @PhilippeLeybaert 我找不到任何东西,这就是我查看源代码的原因。
    • 在 Mono/Xamarin 中,不会解释表达式。它将被提前编译(AOT)。 mono-project.com/docs/advanced/aot
    • @NovaJoe,我相信你误会了。您所引用的文档明确指出,Expression.Compile 在“已知限制”下受 AOT 支持。
    【解决方案2】:

    The details of the Xamarin limitations are here.

    您似乎没有在 Reflection.Emit 命名空间中使用任何东西,这是最大的禁忌。您的代码必须仍然是 AOT 的。否则,我会认为它不会工作。

    但也有 [native] 开发人员阻挠 iOS 静态分析工具并规避动态代码限制的例子。我试图找到这篇文章,但找不到。

    无论如何,我认为您的场景不能说明这一点。您的代码示例仍将经过 AOT 编译。

    但是您提出了一个非常好的问题:表达式在什么时间被评估?

    编辑:

    关于同一主题的另一个 SO 答案:What does Expression.Compile do on Monotouch?

    这里还有一些关于 Expression.Compile() 和“完整 AOT”的好信息: http://www.mono-project.com/docs/advanced/aot/

    编辑: 在阅读了更多之后,我想我知道这里发生了什么。不是Expression.Compile() 不会工作...而是当你的iOS app bundle 在你提交到app store 的时候受到iOS 静态分析工具的影响,它不会通过分析,因为它是动态生成代码。因此,当然,您可以使用 Expression.Compile(),但不要期望它会被应用商店接受。但正如@svick 所提到的,如果您使用“完整 AOT”编译选项,您的 Expression.Compile() 可能会在运行时失败,甚至可能编译失败。

    【讨论】:

    • 您是说Expression 将成为AOT?考虑到Expression 是在运行时构建的,这怎么可能?
    • @svick:关于同一主题的另一个 SO 答案似乎暗示,正如我所言,表达式在 Xamarin.iOS 应用程序中由 AOT 编译器预编译:stackoverflow.com/questions/24977939/…
    • @svick:重申一下,我的意思是,当您使用 Mono 的 AOT 编译器时,Expression 不是在运行时构建的。它是在编译时构建的。
    • 我的意思是这是不可能的,因为表达式可能依赖于仅在运行时才知道的东西。
    • 另一个答案几乎只是说“它有效”,然后提出了一些未经证实的说法。如果我正确阅读了文档,似乎是说 Expression.Compile() 不应该与完整的 AOT 一起使用。
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2021-03-27
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多