C#中定义:
[DllImport(\, ExactSpelling = false)] public extern static UInt32 Fuc(int a, IntPtr b);// C中结构体: #define M 3
typedef struct __tag_MBITMAP{ DWord dwPixelArrayFormat; Long lWidth; Long lHeight;
Long lPitch[MPAF_MAX_PLANES]; Byte* pPlane[MPAF_MAX_PLANES]; }BITMAP
C#定义:
[StructLayout(LayoutKind.Sequential)] //此句在C#中重新定义结构体时一定要加上 public struct BITMAP {
[MarshalAs(UnmanagedType.U4)] public UInt32 dwPixelArrayFormat; [MarshalAs(UnmanagedType.I4)] public Int32 lWidth;
[MarshalAs(UnmanagedType.I4)] public Int32 lHeight;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Int32[] lPitch;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public IntPtr[] pPlane; //对于结构体中的指针数组,一般采用IntPtr数组 }
对于上面的这个结构体,如果在C/C++中出现了结构体指针,那么我们应该在C#中使用IntPtr类型变量,然后使用如下方法将指针指向结构体。
定义结构体对象S,则在C#中获取结构体指针的方法如下: IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(S)); Marshal.StructureToPtr(S, intptr, false); //将指针intptr指向结构体
操作之后一定要释放内存——
Marshal.FreeHGlobal(intptr);//释放分配的非托管内存。
反之也可以由指向结构体的指针变量获取结构体。Marshal.PtrToStructure();