在C#解析結構體指針前,必須知道結構體是如何定義的。
- [StructLayout(LayoutKind.Sequential)]
- public struct VGAStat
- {
- public int ChannelNum;
- //通道數量
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
- public char[] Version;
- //版本信息
- public uint CPUUsage;
- //CPU佔用
- public bool WorkStatusOk;
- //工作狀態
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
- public tagCheckArg[] ChannelStatistic;
- //通道信息
- }
定義完結構體後,就可將接收到C#解析結構體指針轉換爲定義的結構體對象。
- VGAStat entries = (VGAStat)Marshal.PtrToStructure(iptr, typeof(VGAStat));
- //iptr爲接收到的非託管的結構體指針。
反之,也可將結構體賦值後封送到非託管內存。
假如vga爲定義後實例化並賦值了的結構體。
- IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(vga));
- Marshal.StructureToPtr(vga, intptr, true);
- //在此發送intptr指針給目的方
- Marshal.FreeHGlobal(intptr);
- //釋放分配的非託管內存。