如何在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);
}