C++代码:
#define BIG_PICSTREAM_SIZE 200000-47
#define SMALL_PICSTREAM_SIZE 10000
typedef struct
{
char cameraName[256];
char chIP[16];
char chGateway[16];
char chNetmask[16];
char chDNS[16];
}NetCamera_info;typedef struct
{
char chYear[5];
char chMonth[3];
char chDay[3];
char chHour[3];
char chMinute[3];
char chSecond[3];
char chMillisecond[7];
}camera_time;typedef struct
{
char chLeft[5]; /* 左 */
char chTop[5]; /* 上 */
char chRight[5]; /* 右 */
char chBottom[5]; /* 下 */
}recognise_coordinate;typedef struct
{
char chWTYIP[16];
int nFullLen;
int nPlateLen;
char chFullImage[BIG_PICSTREAM_SIZE];
char chPlateImage[SMALL_PICSTREAM_SIZE];
char chColor[5];
char chPlate[15];
recognise_coordinate recogniseC;
camera_time cameraRecTime; }recognise_result;
/************************************************************************/
/* 回调函数:
/************************************************************************/
typedef void (*WTYDataExCallback)(recognise_result *recResult);/************************************************************************/
/* 注册回调函数
/************************************************************************/
void __stdcall WTY_RegDataExEvent(WTYDataExCallback WTYDataEx);
请高手指教怎么来将C++的dll接口函数给成C#的?????
#define BIG_PICSTREAM_SIZE 200000-47
#define SMALL_PICSTREAM_SIZE 10000
typedef struct
{
char cameraName[256];
char chIP[16];
char chGateway[16];
char chNetmask[16];
char chDNS[16];
}NetCamera_info;typedef struct
{
char chYear[5];
char chMonth[3];
char chDay[3];
char chHour[3];
char chMinute[3];
char chSecond[3];
char chMillisecond[7];
}camera_time;typedef struct
{
char chLeft[5]; /* 左 */
char chTop[5]; /* 上 */
char chRight[5]; /* 右 */
char chBottom[5]; /* 下 */
}recognise_coordinate;typedef struct
{
char chWTYIP[16];
int nFullLen;
int nPlateLen;
char chFullImage[BIG_PICSTREAM_SIZE];
char chPlateImage[SMALL_PICSTREAM_SIZE];
char chColor[5];
char chPlate[15];
recognise_coordinate recogniseC;
camera_time cameraRecTime; }recognise_result;
/************************************************************************/
/* 回调函数:
/************************************************************************/
typedef void (*WTYDataExCallback)(recognise_result *recResult);/************************************************************************/
/* 注册回调函数
/************************************************************************/
void __stdcall WTY_RegDataExEvent(WTYDataExCallback WTYDataEx);
请高手指教怎么来将C++的dll接口函数给成C#的?????
C#通过CLR/C++调用本地C++DLL
只有DLL的话就用dllimport关键字吧、
回调就是C#中的委托
/************************************************************************/
/* 回调函数:
/************************************************************************/
typedef void (*WTYDataExCallback)(recognise_result *recResult);我使用的是回调函数,以前用托管的方式是可以解决问题的,但是,我将参数改为结构体就不行了,
不知道是不是C#这块对传的结构体参数有什么要求的写法呢,而且,我的recognise_result结构体中,
还有结构体成员变量,这块是不是在C#也有什么写法。
C#中是不能识别的、你要在C#中声明一个相对应的结构体
我按照你的方式写成下面的C#接口 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct NetCamera_info
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] cameraName; /* 当前相机的名称 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chIP; /* IP地址 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chGateway; /* 网关地址 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chNetmask; /* 子网掩码 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chDNS; /* DNS服务器 */
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct camera_time
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chYear; /* 年 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chMonth; /* 月 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chDay; /* 日 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chHour; /* 时 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chMinute; /* 分 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chSecond; /* 秒 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public char[] chMillisecond; /* 微妙 */
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct recognise_coordinate
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chLeft; /* 左 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chTop; /* 上 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chRight; /* 右 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chBottom; /* 下 */
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct recognise_result
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chWTYIP;
public Int32 nFullLen;
public Int32 nPlateLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 200000 - 47)]
public char[] chFullImage;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10000)]
public char[] chPlateImage;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chColor;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public char[] chPlate;
public recognise_coordinate recogniseC;
public camera_time cameraRecTime;
}
//数据回调
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void WTYDataExCallback(ref recognise_result recResult);
//注册回调函数
[DllImport("XXX.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, EntryPoint = "WTY_RegDataExEvent", SetLastError = true)]
public static extern void WTY_RegDataExEvent(WTYDataExCallback WTYDataEx);
在使用的使用,这样使用的
private WTYDataExCallback DataExCallbcak = null;
public void WTYDataExCallback(ref WTY.recognise_result recResult)
{
}
this.DataExCallbcak = new WTYDataExCallback(this.WTYDataExCallback);
WTY_RegDataExEvent(this.DataExCallbcak);
但是最后,在WTY_RegDataExEvent的时候报出如下的错误:未处理的“System.Runtime.InteropServices.MarshalDirectiveException”类型的异常出现在 KHTSample.exe 中。其他信息: 无法封送处理“parameter #1”: 内部限制: 结构太复杂或太大。
C#中是不能识别的、你要在C#中声明一个相对应的结构体
下次帖代码请框起来好么、
我不知道你的结构体是怎样的、回调这样转是没错的
public struct NetCamera_info
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] cameraName; /* 当前相机的名称 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chIP; /* IP地址 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chGateway; /* 网关地址 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chNetmask; /* 子网掩码 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chDNS; /* DNS服务器 */
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct camera_time
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chYear; /* 年 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chMonth; /* 月 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chDay; /* 日 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chHour; /* 时 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chMinute; /* 分 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public char[] chSecond; /* 秒 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public char[] chMillisecond; /* 微妙 */
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct recognise_coordinate
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chLeft; /* 左 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chTop; /* 上 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chRight; /* 右 */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chBottom; /* 下 */
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct recognise_result
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] chWTYIP;
public Int32 nFullLen;
public Int32 nPlateLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 200000 - 47)]
public char[] chFullImage;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10000)]
public char[] chPlateImage;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public char[] chColor;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public char[] chPlate;
public recognise_coordinate recogniseC;
public camera_time cameraRecTime;
}我这样声明不行吗?????
http://tcspecial.iteye.com/blog/1685149