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

时间:2016-05-31 20:49:14

标签: c# .net

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

T[] arr = ...;
fixed (T* ptr = arr)
{
    // Use ptr here.
}

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

Cannot take the address of, get the size of, or declare a pointer to a managed type

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

1 个答案:

答案 0 :(得分:7)

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

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

请务必记住调用Free(),否则数组永远不会被取消固定。