阅读 Marshal 的结构

Marshal 类包含一个名为 PtrToStructure 的函数,该函数使我们能够通过非托管指针读取结构。

PtrToStructure 函数有很多重载,但它们都有相同的意图。

通用 PtrToStructure

public static T PtrToStructure<T>(IntPtr ptr);

T - 结构类型。

ptr - 指向非托管内存块的指针。

例:

NATIVE_STRUCT result = Marshal.PtrToStructure<NATIVE_STRUCT>(ptr);       
  • 如果你在阅读本机结构时处理托管对象,请不要忘记固定你的对象:)
 T Read<T>(byte[] buffer)
    {
        T result = default(T);
        
        var gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
    
        try
        {
            result = Marshal.PtrToStructure<T>(gch.AddrOfPinnedObject());
        }
        finally
        {
            gch.Free();
        }
        
        return result;
    }