【问题标题】:How to pin a pointer to managed object in C#?如何在 C# 中固定指向托管对象的指针?
【发布时间】:2011-10-16 21:43:59
【问题描述】:

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

【问题讨论】:

  • 贴一些代码,最好是最小的,完整的例子。
  • 不要固定。非托管代码对指针没有用处。所以不要传递指针,传递一个“句柄”。比如说,静态List<> 中的索引。现在您可以简单地从句柄值中检索回调中的托管引用。

标签: c# c++ .net-4.0 interop marshalling


【解决方案1】:

要在 C# 中固定对象,您可以使用 GCHandle.Alloc 方法和第二个参数 GCHandleType.Pinned。在使用GCHandle.Free 方法释放GCHandle 实例之前,对象将保持固定状态。

【讨论】:

  • 当您使用 GCHandle.Aloc(object value) 并将其转换为 IntPtr 时,它就像一个魅力。
  • @apaka: GCHandle.Alloc(object_value, GCHandleType.Pinned) + GCHandle.AddrOfPinnedObject.
猜你喜欢
  • 2017-08-16
  • 1970-01-01
  • 2013-01-05
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多