我使用libmono从我的C代码调用C#对象。该对象的一些方法采用Object参数。因此,例如,要使用数组参数调用对象,我使用
MonoArray *data = mono_array_new(domain, mono_get_byte_class(), len);
然后使用列出的对象和参数调用mono_runtime_invoke
。我怎么知道数组不是在mono_array_new
和mono_runtime_invoke
之间收集垃圾?
答案 0 :(得分:3)
只要将数据指针保留为调用invoke()的函数中的局部变量,就不会对其进行垃圾回收。或者,因为它需要存储在mono_runtime_invoke()的参数数组中,所以请确保该数组是局部变量(已分配堆栈或寄存器。函数参数等效于局部变量)。
如果您需要在任何其他地方存储托管对象,例如静态变量,本地线程,malloced内存中的某个位置等,那么您需要自己保留对它的引用,例如使用mono_gchandle_new() API。