代码之家  ›  专栏  ›  技术社区  ›  Yanshof

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

  •  2
  • Yanshof  · 技术社区  · 7 年前

    我知道如何在结构上创建非托管指针。

    我已经知道我需要使用

    GCHandle.Alloc(...);
    

    3 回复  |  直到 7 年前
        1
  •  4
  •   Theodoros Chatzigiannakis    7 年前

    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
  •  4
  •   Spec    7 年前

    GCHandle.Alloc 使用第二个参数 GCHandleType.Pinned GCHandle.AddrOfPinnedObject 可能会有帮助。

        3
  •  1
  •   Hasan Emrah Süngü    7 年前

    Marshal.StructureToPtr .我也建议你读一下 blog 邮递