这个场景非常简单,我已经在我的应用程序中嵌入了mono运行时2.10.8
,并且我通过mono_method_get_unmanaged_thunk
获得的指针调用托管方法
// obtain pointer
bool (__stdcall*foo) (MonoException**);
foo = mono_method_get_unmanaged_thunk(somemethod);
// call it
MonoException* exc;
foo(&exc);
if(exc)
// handle exception
// nothing else...
让我困惑的是,我对MonoException
指针什么也不做(我读过的文档没有提到这一点)。它是否由托管运行时处理?如果是这样的话,它如何才能确保我的本地方没有保存指向它的指针?
编辑
我已经阅读了源代码,发现异常只是指向用mono_object_new
创建的对象的指针,因此它们是垃圾收集的主题。
现在,我还读到,如果我想在本机端保留一些指针,并防止它被垃圾化,我需要为它获取GC句柄。因此,(修改后的)问题现在是:
如果返回到异常对象的指针仅用作错误报告工具,并且这种错误报告是在托管调用之后进行的,那么在我处理它之前(不使用gc句柄)是否可以安全地假定它不会被垃圾处理?
发布于 2012-11-06 09:21:59
要引用您链接的页面:请注意,这个注册对于局部变量并不是必需的,因为它们存储在堆栈中。它只对全局变量是必要的,因为它们不是GC的根集的一部分。
因此,这意味着在您的场景中,您不必分配句柄。
https://stackoverflow.com/questions/13234318
复制