C#Mono aot与protobuf-net获取ExecutionEngineException

时间:2011-02-23 23:08:26

标签: c# mono protobuf-net unity3d aot

首先非常感谢protobuf-net http://code.google.com/p/protobuf-net/的作者Marc Gravell。这是一个非常好的资源。无论如何,我希望Marc或其他人可以帮我解决这个例外。

我正在尝试使用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

在IRC上建议我可以提前声明这些类型的变量,编译器不必在运行时JIT它们。看起来好像一个好主意,但不幸的是这些类似于内部泛型类型,并且不知道在C#中写什么来声明变量以伪造编译器。任何人都可以解释上面的消息,并让我知道编译器需要提前知道什么?任何其他防止这种情况发生的策略?顺便说一下这是错误的类的顶级

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using ProtoBuf;

[ProtoContract]
public class GameManagerSaveState
{
    [ProtoMember(1)]
    public bool gameOver;
      // snip

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

2 个答案:

答案 0 :(得分:4)

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

我还应该提一下,Jon的Java版本端口应该在这里工作得很好,因为它是编译器重的而不是运行时的。

答案 1 :(得分:1)

在使用protobuf之前使用它:

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

信用: https://github.com/antonholmquist/easy-serializer-unity