问题 如何在C#中固定指向托管对象的指针?


非托管代码调用我的函数。在第一个函数中,我应该将指针传递给我的托管对象。有时候稍后我的其他一些函数会被调用与指针之一相同的指针。我应该取消引用它并使用它来执行一些计算,然后如果不需要处理它。 为了简化故事,我需要固定该对象,以便GC在我处理它之前不会移动它。如何在C#中做到这一点?            提前致谢。


5829
2017-07-31 12:57


起源

发布一些代码,最好是一个 最小,完整 例。 - Kerrek SB
不要钉。非托管代码对指针没有用处。所以不要传递指针,传递'句柄'。比方说,静态的索引 List<>。现在,您只需从句柄值中检索回调中的托管引用即可。 - Hans Passant


答案:


要在C#中固定对象,您可以使用 GCHandle.Alloc 第二个参数的方法 GCHandleType.Pinned。对象保持固定直到 GCHandle 实例发布使用 GCHandle.Free 方法。


10
2017-07-31 13:16



GCHandle不会工作,因为我的对象不是blittable - apaka
当您使用GCHandle.Aloc(对象值)并将其强制转换为IntPtr时,它就像一个魅力。 - apaka
@apaka:GCHandle.Alloc(object_value,GCHandleType.Pinned)+ GCHandle.AddrOfPinnedObject。 - Alex F