Pinned is a block of memory that is marked as unmovable. Blocks of memory are normally moved at the discretion of the CLR, typically at the time of garbage collection. Pinning is necessary for managed pointer types that will be used to work with unmanaged code and expect the data to always reside at the same location in memory. A common example is when a pointer is used to pass a reference to a buffer to a Win32 API function. If the buffer were to be moved in memory, the pointer reference would become invalid, so it must be pinned to its initial location.