【C# 调用C/C++动态库 需要注意的地方】

1、接口在*.cs文件中声明:

A、在函数接口前添加[DllImport("jnvsdk.dll")];

        注意点:如果你的C++动态库不是jnvsdk.dll,请替换成对应的XXX.dll库的路径名。

B、将C++头文件中的接口直接赋值到[DllImport("jnvsdk.dll")]下方;

        C、在接口前面添加 public static extern 字段,保证其他类能够用类名正常调用它;

        D、将接口形参的类型 更改为C#相同字节的类型名;

        注意点:一定保证与C++中类型相同:字节数,有无符号。定义自定义结构体时一定要注意字节对齐方式与C++定义的结构体保持一致,否则会出现问题。

        E、C++的char */unsigned char*/Void *都用IntPtr替代,前前面不能家 ref引用符,其他指针可以用 ref 家变量定义,如C/C++中的函数形参为"int *len",在C#中定义为"ref int len"在C#中,如果是C++传实参到C#,则len就是表示的变量,而非指针,如果是C#传参到C++函数,那么需要在变量前面加上ref ,这时C#会自动根据C++函数形参类型去决定传变量还是传变量的指针给函数;如果IntPtr所指的为数组首地址,此时申明时绝对不要家ref,因为这个时候如果接受C++传递过来的指针会编程值,导致数据处理失败;

F、回调函数申明时,在C/C++中回调函数类型定义 和  回调函数注册函数都必须 是WINAPI声明,否则会报错;

        G、在C#中回调函数必须声明为delegate(委托)类型,回调注册函数必须定义为 公有静态函数,否则调用时会报错。


实例:

C/C++:

结构体定义:

   typedef struct _JNVSDK_DEV_INFO
{
DWORD dwIpAddr;
WORD wPort;
WORD wStreamId;
int iChnCount;
char byGetAudio;
char Reserved[3];
void *pPriv;
} JNVSDK_DEV_INFO, *PJNVSDK_DEV_INFO;

函数定义:

JNVSDK_API int JNVSDK_DEV_Connect(JNVSDK_DEV_INFO *p_dev_info, char *pUserName, char *pPassWord);

        回调函数:

         typedef int (WINAPI * JNVSDK_ParkingPlaceResult_Callback_t) (RECOGNITION_RESULT *parkingplaceResult, unsigned char *jpegbuf, int *jpeglen);
JNVSDK_API int WINAPI JNVSDK_ParkingPlaceResult_Register_Callback(JNVSDK_ParkingPlaceResult_Callback_t ParkingPlaceResultCallback);


C#申明:

结构体定义:

[StructLayout(LayoutKind.Sequential, Pack=1)] //结构体定义不需添加字段,Pack指直接对齐方式
public struct JNVSDK_DEV_INFO
{
public UInt32    dwIpAddr;
public UInt16 wPort;
public UInt16 wStreamId;
public int iChnCount;
public byte byGetAudio;
    //指定byte[]数组大小,这里大小必须与C/C++定义的数组大小一样,否则会出现字节对齐不一致,导致数据存储出错误
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte [] Reserved;
public IntPtr pPriv;
}

函数申明:

   [DllImport("jnvsdk.dll")]//C++函数声明时必须有的字段,指明引用哪个C++库的函数
        public static extern int JNVSDK_DEV_Connect(ref JNVSDK_DEV_INFO p_dev_info, string pUserName, string pPassWord);

回调函数:

[UnmanagedFunctionPointer(CallingConvention.StdCall)]//定义回调函数时必须家的字段
        public delegate int JNVSDK_Enum_Callback_t(ref JNVSDK_ENUM_INFO p_enum_info, IntPtr pContext);//Get all local network ipcam enum_info
        [DllImport("jnvsdk.dll")]
        public static extern int JNVSDK_Enum_Register_Callback(JNVSDK_Enum_Callback_t EnumCallback, IntPtr pContext);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值