ExecutionEngineException -在iOS运行时错误与parse.com SDK
本文关键字:parse com SDK 运行时错误 iOS ExecutionEngineException | 更新日期: 2023-09-27 17:50:58
我们正在使用Unity3d(版本5.0.1p1)为iOS和android创造一款游戏,因为我们使用的是Parse.com数据服务,所以我们自然会使用它来执行远程推送通知。
问题在于,在构建游戏并在测试设备(iPhone 4s iOS8.1.2)上运行后,我们在游戏开始时会遇到一个我们无法解决的执行引擎异常。下面是例外:
ExecutionEngineException: Attempting to call method
'System.Reflection.MonoProperty::StaticGetterAdapterFrame' for which no ahead of time (AOT) code was
generated.
at System.Reflection.EventInfo+AddEventAdapter.Invoke (System.Object
_this, System.Delegate dele)
[0x00000] in <filename unknown>:0
at System.Reflection.MonoProperty+GetterAdapter.Invoke (System.Object
_this) [0x00000] in <filename
unknown>:0
at AOGenerator.BlurBuffer () [0x00000] in <filename unknown>:0
at System.Reflection.MonoProperty.GetValue (System.Object obj, System.Object[] index) [0x00000] in
<filename unknown>:0
at Newtonsoft.Json.Bson.BsonRegex.get_Type () [0x00000] in <filename unknown>:0
at Parse.ParseInstallation.get_Badge () [0x00000] in <filename unknown>:0
at Parse.ParseInstallation.SetPlatformAutomaticValue () [0x00000] in <filename unknown>:0
at Parse.ParseInstallation.SetAutomaticValues () [0x00000] in <filename unknown>:0
at Parse.ParseInstallation.SaveAsync (System.Threading.Tasks.Task toAwait, CancellationToken
cancellationToken) [0x00000] in <filename unknown>:0
at Parse.PlatformHooks+<>c__DisplayClass38.<RequestAsync>b__33 (System.Threading.Tasks.Task`1 _)
[0x00000] in <filename unknown>:0
at Parse.ParseObject+<>c__DisplayClass18.<SaveAsync>b__17 (System.Threading.Tasks.Task toAwait)
[0x00000] in <filename unknown>:0
at FlurryAnalyticsIOS.SetSessionTimeout (Int32 seconds) [0x00000] in <filename unknown>:0
at
System.Collections.Generic.Dictionary`2[System.Int64,System.Boolean].Do_ICollectionCopyTo[KeyValuePair`2]
(System.Array array, Int32 index, System.Collections.Generic.Transform`1 transform) [0x00000] in <filename
unknown>:0
at Parse.Internal.TaskQueue.Enqueue[Task] (System.Func`2 taskStart, CancellationToken cancellationToken)
[0x00000] in <filename unknown>:0
at Parse.ParseObject.SaveAsync (CancellationToken cancellationToken) [0x00000] in <filename unknown>:0
at Parse.ParseObject.SaveAsync () [0x00000] in <filename unknown>:0
at Parse.ParseInitializeBehaviour.<Awake>b__0 (System.Byte[] deviceToken) [0x00000] in <filename
unknown>:0
at FlurryAnalyticsIOS.SetSessionTimeout (Int32 seconds) [0x00000] in <filename unknown>:0
at Newtonsoft.Json.Bson.BsonRegex.get_Type () [0x00000] in <filename unknown>:0
at Parse.PlatformHooks+<>c__DisplayClass24.<RegisterDeviceTokenRequest>b__22 () [0x00000] in
<filename unknown>:0
at System.Action.Invoke () [0x00000] in <filename unknown>:0
at Newtonsoft.Json.Bson.BsonRegex.get_Type () [0x00000] in <filename unknown>:0
at Parse.PlatformHooks+<RunDispatcher>d__44.MoveNext () [0x00000] in <filename unknown>:0
at System.Nullable`1[System.DateTimeOffset].ToString () [0x00000] in <filename unknown>:0
System.Nullable`1:ToString()
UnityEngine.Debug:Internal_LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
Parse.<RunDispatcher>d__44:MoveNext()
System.Nullable`1:ToString()
这个问题刚刚出现在新的Unity Parse SDK 1.5中(包含PNS功能)。我们所知道的是,运行一个空的项目,只有解析sdk很好,通知工作很好,但在我们的实际项目中,由于异常,设备不注册的通知在解析,所以我们假设有一种冲突之间的解析和我们正在使用的其他工具之一。
仅供参考:我们正在使用IL2CPP构建通用架构(我们也在构建。net 2.0子集,但我不认为这与问题有关)。
感谢您的宝贵时间和回答。
更新::
我们试着用Mono(2.x)来构建,结果出现了几乎相同的异常:
ExecutionEngineException: trying to JIT compile method
' System.Reflection.MonoProperty: StaticGetterAdapterFrame
(System.Reflection.MonoProperty/StaticGetter的对象)使用——aot-only运行
at System. reflection . monoproperty . getvalue (System. reflection . monoproperty . getvalue)对象obj,系统。Object[]指数)
[0x00000] in:0
在Parse.ParseInstallation。get_Badge () [0x00000] in:0
at Parse.ParseInstallation.SetPlatformAutomaticValue () [0x00000] in未知
>: 0
at Parse.ParseInstallation.SetAutomaticValues () [0x00000] in: 0
at Parse.ParseInstallation.SaveAsync (System.Threading.Tasks.Task .toAwait,
CancellationToken CancellationToken) [0x00000] in:0
在Parse.ParseObject + & lt;> c__DisplayClass18.b__17
(System.Threading.Tasks。Task toAwait) [0x00000] in:0
在Parse.Internal.TaskQueue。排队[任务](系统。函数的2 taskStart,CancellationToken
cancellationToken) [0x00000] in:0
at Parse.ParseObject.SaveAsync (CancellationToken CancellationToken)在
[0 x00000]: 0
at Parse.ParseObject.SaveAsync () [0x00000] in:0
在Parse.ParseInitializeBehaviour。b__0(系统。Byte []deviceToken) [0x00000] in
: 0
在Parse.PlatformHooks + & lt;> c__DisplayClass24.b__22()
[0x00000] in:0
在Parse.PlatformHooks + d__44。MoveNext () [0x00000] in未知
>: 0
UnityEngine。调试:Internal_LogException(例外,对象)
UnityEngine.Debug: LogException(异常)
Parse.d__44: MoveNext ()
希望它能带给你们更多关于这个问题的细节。
更新2::
我们确切地知道是什么导致异常发生,不幸的是我们无法控制它,当我们注册通知时,我们这样做:
using NotificationServices = UnityEngine.iOS.NotificationServices;
using NotificationType = UnityEngine.iOS.NotificationType;
/*
.
.
.
*/
void ACalledFunction ()
{
// Ask for permission for push notifications (Can Receive deviceToken)
#if UNITY_IPHONE
NotificationServices.RegisterForNotifications(
NotificationType.Alert |
NotificationType.Badge |
NotificationType.Sound);
#endif
}
}
更新15/06/2015:解析Unity SDK 1.5.1 (il2cpp脚本后端)
当尝试注册解析PNs时,我们仍然有相同的错误:
ExecutionEngineException: trying to call method"System.Reflection。MonoProperty::StaticGetterAdapterFrame’没有生成提前(AOT)代码。System.Reflection.MonoProperty + GetterAdapter。调用(系统。对象System.Reflection.MonoProperty + GetterAdapter _this)。调用(系统。对象_this) CurvedText。OnRectTransformDimensionsChange ()System.Reflection.MonoProperty.GetValue(系统。对象obj,系统。对象[]索引)Newtonsoft.Json.Bson.BsonString。set_inclelength(布尔值)Parse.ParseInstallation。get_Badge ()Parse.ParseInstallation.SetPlatformAutomaticValue ()Parse.ParseInstallation.SetAutomaticValues ()Parse.ParseInstallation.SaveAsync (System.Threading.Tasks.TasktoAwait, CancellationTokenParse.PlatformHooks + & lt;> c__DisplayClass42。b__36(系统。对象_)Parse.ParseObject + & lt;> c__DisplayClass18.b__17(System.Threading.Tasks。任务toAwait)FlurryAnalyticsIOS。SetSessionTimeout (Int32秒)Parse.ParseObject。SetProperty (ParseACL)(解析。ParseACL价值,系统。解析。internal . taskqueue . enqueue [Task](系统。Func
2 taskStart, CancellationToken cancellationToken) Parse.ParseObject.SaveAsync (CancellationToken cancellationToken) Parse.ParseObject.SaveAsync () Parse.ParseInitializeBehaviour.b__0 (System.Byte[] deviceToken) FlurryAnalyticsIOS.SetSessionTimeout (Int32 seconds) Newtonsoft.Json.Bson.BsonString.set_IncludeLength (Boolean value) Parse.PlatformHooks+<>c__DisplayClass24.b__22 () System.Action.Invoke () Newtonsoft.Json.Bson.BsonString.set_IncludeLength (Boolean value) Parse.PlatformHooks+d__44.MoveNext () System.Array+InternalEnumerator
1[System.UInt64]。get_Current ()UnityEngine.Debug: LogException(异常)Parse.d__44: MoveNext ()System.InternalEnumerator ' 1: get_Current ()
可以在AOT构建中使用反射(使用Mono脚本后端和IL2CPP脚本后端)。限制实际上是使用System.Reflection.Emit
名称空间中的任何内容。
与Mono的Unity版本一起发布的mscorlib.dll程序集的某些部分对AOT代码路径不友好,System.Reflection.MonoProperty::StaticGetterAdapterFrame
就是其中之一。这段代码不能与AOT构建一起工作,但不幸的是,它不是Unity在编译时可以确定的东西,所以错误只会在运行时发生。
这可能是一个在Parse SDK论坛上提出的问题。可以使用不同的SDK来避免这个问题。