Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

247
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda