Sometimes a C/C++ function needs to store data you pass to it for later reference. If such data is a managed object (like a string or class) you need to make sure that the garbage collector doesn’t delete it while it’s still in use/still stored in the native code.
That’s what pinning is for. It prevents the garbage collector from deleting and moving the object.