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