如何在 C# 中固定指向托管对象的指针?
非托管代码调用我的函数。在第一个函数中,我应该将指针传回我的托管对象。有时,后来我的一些其他函数会使用相同的指针作为参数之一来调用。我应该取消引用它并使用它来执行一些计算,然后如果不需要则将其处理掉。 简而言之,我需要固定该对象,以便 GC 不会移动它,直到我处理掉它。在 C# 中如何做到这一点? 提前致谢。
Unmanaged code calls my functions. In first function I should pass back pointer to my managed object. Sometimes later some of my other functions get called with that same pointer as one of parameters . I should dereference it and use it to perform some calculations and then if it is not needed dispose of it.
To cut the story short I need to pin that object so that GC won't move it til I dispose of it. How to do that in C# ?
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
要在 C# 中固定对象,您可以使用带有第二个参数
GCHandleType.Pinned
的GCHandle.Alloc
方法。对象保持固定状态,直到使用GCHandle.Free
方法释放GCHandle
实例。To pin an object in C#, you can use
GCHandle.Alloc
method with second parameterGCHandleType.Pinned
. Object remains pinned untilGCHandle
instance is released usingGCHandle.Free
method.(大约 2022 年,Dotnet 6)
另一个答案不适用于托管对象。在运行时它会失败。这是将按照要求执行的代码。
(Circa 2022, Dotnet 6)
The other answer doesn't work for managed objects. At runtime it will fail. Here is code that will do as requested.