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

时间:2017-07-29 16:28:22

标签: c# unmanaged

我知道如何在struct上创建非托管指针 但我希望有一个指向对象的非托管指针。

我已经知道我需要使用

保护对象不受GC的影响
GCHandle.Alloc(...);

但我无法找到定义指针的方法......

3 个答案:

答案 0 :(得分:4)

尝试将GCHandle.Alloc与第二个参数GCHandleType.Pinned一起使用。方法GCHandle.AddrOfPinnedObject也可能有所帮助。

试试这两个链接:

答案 1 :(得分:4)

您可以固定这样的实例:

GCHandle handle = GCHandle.Alloc(oldList, GCHandleType.Pinned);

假设它有效,你可以将固定对象的地址作为类型不可知的指针,如下所示:

IntPtr ptr = handle.AddrOfPinnedObject();

不要忘记在失去跟踪之前显式释放句柄(否则对象将永久固定):

handle.Free();

请注意,我说“假设它有效” - 并非所有对象都可以固定,而那些不能在你试图固定它们时会抛出异常。

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

static unsafe void* VeryUnsafeGetAddress(this object obj)
{
    return *(void**)Unsafe.AsPointer(ref obj);
}

答案 2 :(得分:1)

我认为您对Marshal.StructureToPtr感兴趣。我还建议阅读这篇blog帖子。