C#Mono aot与protobuf net获得ExecutionEngineeException

C#Mono aot与protobuf net获得ExecutionEngineeException,c#,mono,protobuf-net,unity3d,aot,C#,Mono,Protobuf Net,Unity3d,Aot,首先要感谢protobuf net的作者Marc Gravell。这是一个非常好的资源。无论如何,我希望马克或其他人能帮助我解决这个例外 我正在尝试使用Unity3D游戏引擎在移动设备(iOS和Android)上实现protobuf net。Unity 3.2使用Mono 2.6,这是对Mono稍加修改的版本 它在编辑器中工作正常,但在运行时的iOS设备上,它在尝试序列化的第一个成员时失败。请注意异常中的--aot only标志。我认为Unity基本上是通过Mono的aot特性构建ARM组件的,

首先要感谢protobuf net的作者Marc Gravell。这是一个非常好的资源。无论如何,我希望马克或其他人能帮助我解决这个例外

我正在尝试使用Unity3D游戏引擎在移动设备(iOS和Android)上实现protobuf net。Unity 3.2使用Mono 2.6,这是对Mono稍加修改的版本

它在编辑器中工作正常,但在运行时的iOS设备上,它在尝试序列化的第一个成员时失败。请注意异常中的--aot only标志。我认为Unity基本上是通过Mono的aot特性构建ARM组件的,尽管我不知道它在引擎盖下做什么

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

感谢Mono和protobuf专家帮助我解决这个问题!protobuf net似乎是一个非常棒的轻量级序列化和RPC wire协议,非常适合iOS和Android应用程序,所以我很期待使用它。

v1中存在许多问题,这让预JIT有点痛苦;v2虽然不完整,但旨在解决许多/所有这些问题,尤其是通过提供预编译到dll选项,但即使是仅运行时版本也应该更加设备友好


我还应该提到Jon的Java端口版本在这里应该可以很好地工作,因为它需要大量的编译器,而不是运行时。

在使用protobuf之前使用它:

Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
学分:

马克,好的,非常感谢。我使用的是r282。那是v1吗?从你在网站上的笔记来看,我想v2还没有发布。我将研究Java移植的版本,除非您能向我指出v2.:)@Alex-v2仅作为代码从主干中提供;r282是v1@Mark好的,谢谢。顺便说一句,我用飞碟的protobuf csharp端口做了一些测试。不幸的是,我遇到ExecutionEngineeException:尝试JIT编译方法System.Collections.Generic.GenericEqualityComparer`1:.ctor(),同时运行--aot-only。要知道这还为时过早,但可能不起作用。再次感谢。@Alex的记录,我在emu工作过。如果你被卡住了,请告诉我,但我是后面的几个单机器人Beta——当然,很容易更新。
Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");