System.GC is exposing new APIs. (see: #33526)
public static T[] AllocateArray<T>(int length, bool pinned = false);
public static T[] AllocateUninitializedArray<T>(int length, bool pinned = false);
The "pinned" part guarantees that the allocated object will never be relocated.
The easiest way to implement these is to allocate in a part of the heap that is never compacted.