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#的?????

解决方案 »

  1.   

    我刚做玩这类问题
    C#通过CLR/C++调用本地C++DLL
      

  2.   

    http://blog.csdn.net/chifuqi/article/details/7163089
      

  3.   

    你要有C++的头文件、才能用clr/c++
    只有DLL的话就用dllimport关键字吧、
    回调就是C#中的委托
      

  4.   


    /************************************************************************/
    /* 回调函数:
    /************************************************************************/
    typedef void (*WTYDataExCallback)(recognise_result *recResult);我使用的是回调函数,以前用托管的方式是可以解决问题的,但是,我将参数改为结构体就不行了,
    不知道是不是C#这块对传的结构体参数有什么要求的写法呢,而且,我的recognise_result结构体中,
    还有结构体成员变量,这块是不是在C#也有什么写法。
      

  5.   

    C++中的结构体、
    C#中是不能识别的、你要在C#中声明一个相对应的结构体
      

  6.   


    我按照你的方式写成下面的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”: 内部限制: 结构太复杂或太大。
      

  7.   

    C++中的结构体、
    C#中是不能识别的、你要在C#中声明一个相对应的结构体
    下次帖代码请框起来好么、
    我不知道你的结构体是怎样的、回调这样转是没错的
      

  8.   

        [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; 
        }我这样声明不行吗?????
      

  9.   

    因为你用的是结构体嵌套,需要用intptr转换,看这篇文章试试吧亲:
    http://tcspecial.iteye.com/blog/1685149