CSharp调用C动态链接库详解 下载本文

内容发布更新时间 : 2024/5/5 8:23:59星期一 下面是文章的全部内容请认真阅读。

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();