C#调用C++库

  • 获取到dll名称与路径,
  • 获取dll内需要使用接口的名称与需要使用的类型。
  • eg:如果有使用枚举,结构体,指针,或者类,需要在程序中实现该结构体或者类。建议直接进行拷贝。结构体一般需要设置特性LayoutKind.Sequentil。
  • 一般枚举类型,只需本地参照C++定义重新定义一个,建议直接进行拷贝
  • 指针类型使用引用传参ref,这时需要提前知道传入指针参数的数据格式。eg:需要传入的是一个数组首地址。那个则可以定义一个数组:eg:bool Test(const int* param)作为形参传入接口中,已知传入的是一个数组,那么可以定义 int[]  param = new param[ 1 ]{1}; 使用 Test(ref param[0]);
  • 结构体作为形参传入。需要定义与C++一样的结构体传入。建议直接拷贝。同时使用特性StructLayoutAttribute(LayoutKind.Sequentil)声明结构体的内存布局。知识补充记录:在C/C++中,struct类型的内存是按照成员声明顺序分布,默认是按照占用内存最大的成员进行内存对齐。在.Net中,可以使用特性LayoutKind.Sequentil,控制成员的布局,也可以根据数据类型使用StructLayoutAttribute中的特性进行设置,例如字符的编码格式CharSet  CharSet; 数据字段对齐 int Pack;声明结构体的绝对大小 int Size。

[StructLayout (LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct OpenParam
{
     public int W;                           
     public int H;                          
     public int X;                      
     public int Y;                      
     public int S;                        
     public uint F;             
}
  • 使用DllImport导入dll,需要填入dll的路径名称(一般是在系统dll目录下,或者在运行目录下,可以直接写入dll名称,否则需要填写路径);同时写入调用方式(一般为CallingConvention.Cdecl,CallingConvention.StdCall 两种,根据实际编译调用方式使用)。
[DllImport ("kernel32", CallingConvention = CallingConvention.Cdecl,SetLastError = true)]
public static extern IntPtr LocalFree(IntPtr mem);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值