Pinned Object C# with Example
GC (Garbage Collector) is responsible for cleaning our garbage.
While GC cleans our garbage, he removes the unused objects from the managed heap which cause heap
fragmentation. When GC is done with the removal, it performs a heap compression (defragmintation) which
involves moving objects on the heap.
Since GC isn't deterministic, when passing managed object reference/pointer to native code, GC can kick in at any
time, if it occurs just after Inerop call, there is a very good possibility that object (which reference passed to native)
will be moved on the managed heap - as a result, we get an invalid reference on managed side.
In this scenario, you should pin the object before passing it to native code.
Pinned object is an object that is not allowed to move by GC.
Gc Pinned Handle
You can create a pin object using Gc.Alloc method
GCHandle handle = GCHandle.Alloc(yourObject, GCHandleType.Pinned);
Obtaining a pinned GCHandle to managed object marks a speciﬁc object as one that cannot be moved by
GC, until freeing the handle
[DllImport("kernel32.dll", SetLastError = true)]