我最近一直在将单声道运行时与某些应用集成在一起,而我正在使用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
答案 0 :(得分:3)
我得到了答案 - mono_method_get_unmanaged_thunk
返回的函数指针是__stdcall
约定,而我的编译器默认为cdecl
,因此我改变了:
bool (*Some_Method) (MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**)
到
bool (__stdcall*Some_Method) (MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**)
现在调用没有崩溃。
似乎Debug
设置正在调整堆栈指针或一些寄存器(不知道究竟是什么,我对此并不是很了解),这就是为什么它运行没有问题,因为{{1} }和stdcall
非常不同,这种不匹配可能会导致两种配置崩溃。