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 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 specific object as one that cannot be moved by GC, until freeing the handle Example: [DllImport("kernel32.dll", SetLastError = true)]