GC handles are wrappers that are used to keep references to managed objects in the unmanaged space and preventing the object from being disposed.
These are the C equivalents of the System.GCHandle structure.
There are two kinds of GCHandles that can be created:
To retrieve the target address of an object pointed to by a GCHandle you should use mono_gchandle_get_target.
For example, consider the following C code:
The object in `o' will *NOT* be scanned.
If you need to store an object in a C variable and prevent it from being collected, you need to acquire a GC handle for it.
TRUE means the object will be pinned, so it won't move in memory when we'll use a moving GC. You can access the MonoObject* referenced by a handle with:
When you don't need the handle anymore you need to call:
Note that if you assign a new object to the C var, you need to get a new handle, it's not enough to store a new object in the C var.
So code that looked like this:
should now be changed to: