如何在c#中固定一个指向托管对象的指针
How to pin a pointer to managed object in C#?
非托管代码调用我的函数。在第一个函数中,我应该传递回指针到我的托管对象。有时稍后,我的其他函数会被调用,使用同样的指针作为参数之一。我应该去引用它,用它来做一些计算,如果不需要的话,就把它处理掉。简而言之,我需要固定该对象,以便GC在我处理它之前不会移动它。如何在c#中做到这一点?
要在c#中固定一个对象,可以使用带有第二个参数GCHandleType.Pinned
的GCHandle.Alloc
方法。对象保持固定,直到使用GCHandle.Free
方法释放GCHandle
实例。
(Circa 2022, Dotnet 6)
另一个答案不适用于托管对象。在运行时,它将失败。下面的代码将按照请求执行。
public static class Pin
{
/// <summary>
/// use to obtain raw access to a managed object. allowing pinning.
/// <para>
/// Usage:<code>fixed (byte* data = [AND_OPERATOR]GetRawObjectData(managed)){ }</code>
/// </para>
/// </summary>
public static ref byte GetRawObjectData(object o)
{
//usage: fixed (byte* data = &GetRawObjectData(managed)) { }
return ref new PinnableUnion(o).Pinnable.Data;
}
[StructLayout(LayoutKind.Sequential)]
sealed class Pinnable
{
public byte Data;
}
[StructLayout(LayoutKind.Explicit)]
struct PinnableUnion
{
[FieldOffset(0)]
public object Object;
[FieldOffset(0)]
public Pinnable Pinnable;
public PinnableUnion(object o)
{
System.Runtime.CompilerServices.Unsafe.SkipInit(out this);
Object = o;
}
}
}
相关文章:
- 修改函数中的指针(将另一个指针作为参数传递)
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 更改一个指针后更改乘法对象
- 从另一个指针指向函数的指针
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- C:试图将指针值复制到另一个指针中,得到可修改的左值错误
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 我不明白我的错误需要返回一个指针数组
- 使用 SFINAE 测试是否可以将一个指针类型static_cast到另一个指针类型
- 将指针分配给另一个指针时会发生什么情况?
- 如何保存指针地址,以便另一个指针可以继续处理它
- 为什么 std::span 是一个指针 + 大小而不是两个迭代器
- 类的成员应该是一个指针
- 隐式指针变量,在自动定义中具有另一个指针变量
- 利用双重链接列表中的下一个指针
- 你能把一个指针投射到数组中吗?