Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

245
Views
C# Mono aot con protobuf-net obteniendo ExecutionEngineException

Primero muchas gracias a Marc Gravell autor de protobuf-net http://code.google.com/p/protobuf-net/ . Es un gran recurso. De todos modos, espero que Marc o alguien más pueda ayudarme a resolver esta excepción.

Estoy tratando de implementar protobuf-net en dispositivos móviles (iOS y Android) usando el motor de juegos Unity3D. Unity 3.2 usa Mono 2.6, su versión ligeramente modificada de mono.

Funciona bien en el Editor, pero en el dispositivo iOS en tiempo de ejecución falla en el primer miembro que intenta serializar. Tenga en cuenta el indicador --aot-only en la excepción. Creo que Unity básicamente construye el ensamblaje ARM a través de la característica aot de Mono, aunque no entiendo qué está haciendo debajo del capó.

 ExecutionEngineException: Attempting to JIT compile method 'ProtoBuf.Property.Property`2<GameManagerSaveState , bool>:.ctor ()' while running with --aot-only. at ProtoBuf.Property.PropertyBoolean`1[GameManagerSaveState]..ctor () [0x00000] in <filename unknown>:0 at ProtoBuf.Property.PropertyFactory.CreateProperty[GameManagerSaveState] (System.Type type, ProtoBuf.DataFormat& format, MemberSerializationOptions options) [0x00000] in <filename unknown>:0 at ProtoBuf.Property.PropertyFactory.Create[GameManagerSaveState] (System.Reflection.MemberInfo member) [0x00000] in <filename unknown>:0 at ProtoBuf.Serializer`1[GameManagerSaveState].Build () [0x00000] in <filename unknown>:0

Se sugirió en IRC que podría declarar variables de este tipo con anticipación, que el compilador no tendría que JIT en tiempo de ejecución. Parece una gran idea, pero desafortunadamente estos son como tipos genéricos internos y no saben qué escribir en C# para declarar variables con el fin de falsificar el compilador. ¿Alguien puede interpretar el mensaje anterior y decirme qué necesita saber el compilador con anticipación? ¿Alguna otra estrategia para evitar que esto suceda? Por cierto, aquí está la parte superior de la clase donde está fallando

 using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using ProtoBuf; [ProtoContract] public class GameManagerSaveState { [ProtoMember(1)] public bool gameOver; // snip

¡Gracias a los expertos de Mono y protobuf por ayudarme a lograrlo! protobuf-net parece ser una serialización increíble y liviana y un protocolo de conexión RPC que sería perfecto para las aplicaciones de iOS y Android, así que estoy ansioso por usarlo.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Hay una serie de problemas en v1 que hacen que sea un poco molesto para pre-JIT; v2, aunque incompleto, pretende resolver muchos/todos estos problemas, sobre todo ofreciendo una opción de compilación previa a dll, pero incluso la versión de solo tiempo de ejecución debería ser mucho más compatible con dispositivos.

También debo mencionar que el puerto de Jon de la versión de Java debería funcionar bien aquí, ya que es un compilador pesado en lugar de un tiempo de ejecución pesado.

over 4 years ago · Santiago Trujillo Report

0

Use esto antes de usar protobuf:

 Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");

Crédito: https://github.com/antonholmquist/easy-serializer-unity

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!