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.

C# 8.0 and .NET Core 3.0 – Modern Cross-Platform Development: Build applications with C#, .NET Core, Entity Framework Core, ASP.NET Core, and ML.NET using Visual Studio Code, 4th Edition
ASP.NET Core 3 and Angular 9: Full stack web development with .NET Core 3.1 and Angular 9, 3rd Edition
C# in Depth, 4th Edition