初識IntPtr

夥伴解說:c++

 c#結構體與C++指針互相轉換時就用IntPtr 
 就是把一塊內存或者一個結構體數據,經過Marshal類中的方法,進行封裝和解析。
 把C#結構體數據,封裝後給C++接口使用。或把c++指針應的對象解析爲結構體。
 
下列代碼中pGpsData就是IntPtr類型,把這個至關於指針的東西,解析成結構體BVCU_PUCFG_GPSData。
  1 BVCU_PUCFG_GPSData gpsdata = (BVCU_PUCFG_GPSData)Marshal.PtrToStructure(pGpsData, typeof(BVCU_PUCFG_GPSData)); 
如下爲結構體BVCU_PUCFG_GPSData:
 1 //GPS數據結構體 wfy on 20150417
 2     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
 3     public struct BVCU_PUCFG_GPSData
 4     {
 5         public BVCU_WallTime stTime;
 6         public Int32 iLongitude;
 7         public Int32 iLatitude;
 8         public Int32 iHeight;
 9         public Int32 iAngle;
10         public Int32 iSpeed;
11         public Int32 iStarCount;
12         public Int32 bAntennaState;
13         public Int32 bOrientationState;
14         public int iSatelliteSignal;
15         [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
16         Int32[] iReserved;
17     }

如下就是把結構體封裝成Ptr引用:git

1 BVCU_PUCFG_GPSData gpsData;
2 IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(BVCU_PUCFG_GPSData)));
3 Marshal.StructureToPtr(gpsData, pt, true);

這裏還涉及到由託管內存到非託管內存的轉移。c#爲託管,c++爲非託管。c#

相關文章
相關標籤/搜索