如何在C#对象上获取非托管指针?

如何在C#对象上获取非托管指针?,c#,unmanaged,C#,Unmanaged,我知道如何在结构上创建非托管指针。 但是我想要一个指向对象的非托管指针 我已经知道我需要使用 GCHandle.Alloc(...); 但我找不到定义指针的方法 我想您对Marshal.StructureToPtr感兴趣。我还建议阅读这篇文章。尝试使用GCHandle.Alloc和第二个参数GCHandleType.pinted。另外,方法GCHandle.addrofPindedObject可能会有所帮助 请尝试以下两个链接: 您可以像这样锁定一个实例: GCHandle handle

我知道如何在结构上创建非托管指针。
但是我想要一个指向对象的非托管指针

我已经知道我需要使用

GCHandle.Alloc(...);

但我找不到定义指针的方法

我想您对
Marshal.StructureToPtr
感兴趣。我还建议阅读这篇文章。

尝试使用
GCHandle.Alloc
和第二个参数
GCHandleType.pinted
。另外,方法
GCHandle.addrofPindedObject
可能会有所帮助

请尝试以下两个链接:


您可以像这样锁定一个实例:

GCHandle handle = GCHandle.Alloc(oldList, GCHandleType.Pinned);
IntPtr ptr = handle.AddrOfPinnedObject();
static unsafe void* VeryUnsafeGetAddress(this object obj)
{
    return *(void**)Unsafe.AsPointer(ref obj);
}
假设它工作,则可以将固定对象的地址作为类型无关指针,如下所示:

GCHandle handle = GCHandle.Alloc(oldList, GCHandleType.Pinned);
IntPtr ptr = handle.AddrOfPinnedObject();
static unsafe void* VeryUnsafeGetAddress(this object obj)
{
    return *(void**)Unsafe.AsPointer(ref obj);
}
不要忘记在失去跟踪之前显式释放句柄(否则对象将永久固定):


请注意,我说的“假设它工作”——并不是所有对象都可以固定,不能固定的对象在尝试固定它们时会抛出异常

如果您想冒险获取非固定对象的地址,可以使用
System.Runtime.CompilerServices.Unsafe
尝试以下操作:

GCHandle handle = GCHandle.Alloc(oldList, GCHandleType.Pinned);
IntPtr ptr = handle.AddrOfPinnedObject();
static unsafe void* VeryUnsafeGetAddress(this object obj)
{
    return *(void**)Unsafe.AsPointer(ref obj);
}