我最近一直在将单声道运行时与某些应用程序集成,并且我正在使用Debug
配置进行大部分测试。最近,我切换到Release
,我注意到它开始崩溃。(我正在使用 msvs2010 编译器)。
我追踪了它,发现它是在调用通过mono_method_get_unmanaged_thunk
. 导致它的配置之间的一个区别是/O2
发布与/Od
调试中的优化。根据我的观察,崩溃发生在托管方法离开后。关于这些优化是否有一些已知的考虑?
我的情况如下:
在本机代码中,我正在获取函数指针以跳转到托管土地:
bool (*Some_Method) (MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**);
在托管方面,该方法是非静态方法,因此第一个参数是this
:
bool Managed_Method(int, SomeType a2, SomeType a3, SomeType a4)
在初始化本机端时,我正在获取这样的指针:
Some_Method = (bool(*)(MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**)) mono_method_get_unmanaged_thunk(method)
我正在使用获得的指针调用托管方法:
bool result = Some_Method(v, o1, o2, o3)
其中 o1, o2, o3 要么是空值,要么是有效的托管对象。
该方法的主体实际上什么也没做,在当前情况下,在进行一次布尔检查后,它只是以 false 离开。
单声道运行时:2.10.8