使用某些版本的Mono / .NET(或至少与Unity打包在一起的Mono版本),似乎对FieldInfo.GetValue()
的某些调用可能会导致程序完全崩溃。
具体来说,当给定System.Globalization.CultureInfo
的实例时,尝试使用"Systen.Int32* calendar_data"
评估字段FieldInfo.GetValue()
会导致进程崩溃。这是堆栈跟踪:
0x00007FFC0A6A3C58 (KERNELBASE) RaiseException 0x00007FFBDCFD1158 (mono) [c:\buildslave\mono\build\eglib\src\goutput.c:201] g_logv 0x00007FFBDCFD117C (mono) [c:\buildslave\mono\build\eglib\src\goutput.c:211] g_log 0x00007FFBDD04E223 (mono) [c:\buildslave\mono\build\mono\metadata\object.c:2945] mono_field_get_value_object 0x000000001179273B (Mono JIT Code) (wrapper managed-to-native) System.Reflection.MonoField:GetValueInternal (object) 0x00000000117924D6 (Mono JIT Code) [/Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoField.cs:118] System.Reflection.MonoField:GetValue (object)
此外,尽管无法确定确切的求值成员,但在FieldInfo.GetValue
实例上调用Mono.Globalization.Unicode.SimpleCollator
也会导致类似的崩溃。
我正在尝试确定是否存在由FieldInfo.GetValue
通话引起的崩溃模式,即什么调用会使程序崩溃,而哪些不会使程序崩溃。
任何名为Globalization
的命名空间似乎都包含易于使反射崩溃的类,但是我怀疑这是原因。
FieldInfo.GetValue()
是否尝试返回指针指向的对象?如果您希望它返回一个指针类型的内存地址(例如IntPtr
),这将是非常奇怪的事情,否则将无法对指针进行空检查。但是,如果可以防止崩溃,我可以跳过指针字段。