3 Stimmen

Monotouch stürzt bei LINQ-Abfragen ab, wenn Geräteerstellungen verwendet werden

Ich erhalte die folgende Fehlermeldung:

| mscorlib | | Versuch der JIT-Kompilierung der Methode 'System.Linq.OrderedEnumerable`1:GetEnumerator ()' bei Ausführung mit --aot-only.

Nach dem, was ich gelesen habe, sieht es so aus, als ob der Compiler eine Methode, in diesem Fall "GetEnumerator", die der Code aufgrund von LINQ benötigt, nicht enthält. Was ist die richtige Vorgehensweise, um sicherzustellen, dass der Compiler es enthält?

So ziemlich jeder, der in diese läuft, die ich online gefunden habe, wird nur loswerden der Linq-Abfrage und bewegt sich auf mit dem Leben, aber ich bin müde von neu schreiben meinen Code, wenn etwas wie dieses auftaucht. Ich bin auch nicht sicher, welche Linq-Abfrage das Problem verursacht, und ich gehe langsam durch meinen Code und schreibe alle Linq-Abfragen neu, bis ich es finde.

3voto

poupou Punkte 43207

Die GetEnumerator-Methode fehlt nicht wirklich - aber sie wurde nicht AOT-ed avant in das Gerät zu gelangen. Also versucht das JIT, es auf dem Gerät zu kompilieren. Jetzt aufgrund von Apple Einschränkung MonoTouch (oder etwas anderes) kann nicht JIT-Code auf Geräten (aber das wird auf dem Simulator, wo keine solche Einschränkung besteht).

Was ist also der eigentliche Fehler: Es ist der (generische) Typ, den der AOT-Compiler nicht vorhersagen (und Code dafür kompilieren) konnte.

Ein Trick, um Ihr Problem zu finden (einfacher, als jeden LINQ-Code neu zu schreiben), besteht darin, Ihren C#-Code zu kompilieren und dann die Assembly ildasm. Finden Sie als nächstes heraus, in welcher(n) Methode(n) OrderedEnumerable`1 verwendet wird (LINQ kann Dinge sehr leicht verbergen).

Einmal gefunden könnte Sie müssen diesen Teil nicht neu schreiben, aber in einigen Fällen können Sie dem AOT-Compiler "helfen", indem Sie es offensichtlicher machen, dass der Typ (dargestellt durch `1) benötigt wird.

1voto

Alex York Punkte 5342

Hilft Ihnen die Nummer 17 in diesem Link weiter?

http://ios.xamarin.com/Documentation/Troubleshoot

"System.ExecutionEngineException: Attempting to JIT compile method (wrapper managed-to-managed) Foo[]:System.Collections.Generic.ICollection`1.get_Count()"

Es kann gut sein, dass Sie einen Workaround "hacken" müssen, um dies zu beheben, leider - aber es ist behebbar. Können Sie bitte Ihre Frage mit der tatsächlichen LINQ-Abfrage aktualisieren?

0voto

Chuck Pinkert Punkte 1275

Ich habe die fehlerhafte Codezeile gefunden:

// currentDates is a List<DateTime> return (from dt in currentDates orderby dt.Date ascending select dt).ToList();

Ich habe es geändert und verwende

CurrentDates.Sort()

und dadurch wurde der Aufruf des GetEnumerators vermieden, der nicht AOT-ed wurde. Nicht mehr in die Luft gehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X