¿Por qué funciona LambdaExpression.Compile () en iOS (Xamarin)?

Como Xamarin.iOS no es compatible con la generación de código en time de ejecución, ¿por qué Compile () y DynamicInvoke () funcionan como se esperaba?

Por ejemplo, el siguiente código funciona bien:

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 está evaluando el tree de expresiones en time de ejecución en lugar de emitir un código IL?

En las plataforms que admiten la generación de código, se utiliza Reflection.Emit-based LambdaCompiler .

Si eso no está disponible, la expresión se interpreta utilizando el intérprete . Por ejemplo, hay classs que interpretan Constant y Add .

Los detalles de las limitaciones de Xamarin están aquí.

Parece que no usas nada en el espacio de nombres Reflection.Emit, que es el gran no-no. Su código aún debe estar AOT. De lo contrario, me imagino que no funcionaría.

Pero ha habido ejemplos de desarrolladores [nativos] frustrando la herramienta de análisis estático iOS y eludiendo la restricción de código dynamic. Intenté localizar el artículo, pero no pude encontrarlo.

De todos modos, no creo que su escenario sea un ejemplo de eso. El ejemplo de código seguirá siendo AOT-compiled.

Pero plantea una muy buena pregunta: ¿a qué hora se evalúa la expresión?

EDITAR:

Otra respuesta SO sobre el mismo tema: ¿Qué hace Expression.Compile en Monotouch?

También hay buena información sobre Expression.Compile () y "AOT completo" aquí: http://www.mono-project.com/docs/advanced/aot/

EDITAR: Después de leer un poco más, creo que sé lo que está sucediendo aquí. No es que Expression.Compile () no funcione … es que cuando su package de aplicaciones iOS está sujeto a la herramienta de análisis estático iOS cuando lo envía a la tienda de aplicaciones, no pasará el análisis porque es dynamic generando código Entonces, seguro, puedes usar Expression.Compile (), pero no esperes que sea aceptado en la tienda de aplicaciones. Pero como lo menciona @svick, si usa la opción de compilation "AOT completo", su Expression.Compile () probablemente falle en el time de ejecución, o incluso fallará la compilation.