何时使用Embedded Mono(libmono-2.0)时收集C#对象的垃圾

时间:2012-07-19 13:11:02

标签: c# c mono interop

我使用libmono从我的C代码调用C#对象。该对象的一些方法采用Object参数。因此,例如,要使用数组参数调用对象,我使用

MonoArray *data = mono_array_new(domain, mono_get_byte_class(), len);

然后使用列出的对象和参数调用mono_runtime_invoke。我怎么知道数组不是在mono_array_newmono_runtime_invoke之间收集垃圾?

1 个答案:

答案 0 :(得分:3)

只要将数据指针保留为调用invoke()的函数中的局部变量,就不会对其进行垃圾回收。或者,因为它需要存储在mono_runtime_invoke()的参数数组中,所以请确保该数组是局部变量(已分配堆栈或寄存器。函数参数等效于局部变量)。

如果您需要在任何其他地方存储托管对象,例如静态变量,本地线程,malloced内存中的某个位置等,那么您需要自己保留对它的引用,例如使用mono_gchandle_new() API。