delegate - lambda c# tutorial



Compilando lambda e invocando delegati sul dispositivo in Monotouch (1)

Non ha familiarità con System.Linq.Expressions, ma presumibilmente implica la generazione del codice di runtime.

Non c'è JIT in iOS, tutto il codice deve essere compilato in anticipo. La stessa restrizione non si applica al simulatore, quindi il codice viene eseguito lì.

Vedi qui

Il metodo Compile() non è supportato sul dispositivo iOS, poiché il dispositivo impedisce l'esecuzione del motore JIT. La compilazione stessa viene implementata utilizzando System.Reflection.Emit e questo a sua volta richiede un JIT funzionante. Quindi il codice di cui sopra non sarebbe mai stato un problema con gli alberi di espressione.

Attualmente sto eseguendo il porting di un codebase .NET in MonoTouch e attualmente sto lavorando a un metodo che riceve Expression<T> . Sto cercando di compilarlo e quindi invocarlo dinamicamente.

Ecco cosa ho fatto:

// 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);

Funziona perfettamente con iOS Simulator, il risultato "12" è stampato nella mia console. Ma poi l'ho provato su un iPad e ho ricevuto la seguente eccezione.

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)

Cosa sto facendo di sbagliato e come posso farlo funzionare?





expression-trees