如何将(以及获取IntPtr)固定为通用T []数组?

Wal*_*t D 7 .net c#

我想固定一个通用类型的数组并获得一个指向其内存的指针:

T[] arr = ...;
fixed (T* ptr = arr)
{
    // Use ptr here.
}
Run Code Online (Sandbox Code Playgroud)

但是尝试编译上面的代码会产生这个编译错误:

Cannot take the address of, get the size of, or declare a pointer to a managed type
Run Code Online (Sandbox Code Playgroud)

这些 问题的答案证实,没有办法声明通用T*指针.但有没有办法固定通用T[]数组并获得IntPtr固定内存?(这样的指针仍然有用,因为它可以传递给本机代码或转换为已知类型的指针.)

Wal*_*t D 7

是的,您可以使用该GCHandle对象固定一个通用T[]数组,并在固定时获取IntPtr到其内存:

T[] arr = ...;
GCHandle handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
IntPtr ptr = handle.AddrOfPinnedObject();
// Use the ptr.
handle.Free();
Run Code Online (Sandbox Code Playgroud)

确保你记得打电话Free(),否则阵列将永远不会被取消固定.