各位大神,在使用C#调用一个C++的库的时候,其中有个参数是一个结构体,结构体里面有一个数组:
typedef unsigned char BYTE;
typedef struct{
BYTE byRes1[20];
}ANTS_NET_DVR_DEVICEINFO这个结构该在C#怎么定义?

解决方案 »

  1.   

        public struct ANTS_NET_DVR_DEVICEINFO
        {
            public byte []byRes1 = new byte[20];
        }
      

  2.   

    这种问题网上搜搜一大堆,居然还能给出这么幼稚的答案。
        public struct ANTS_NET_DVR_DEVICEINFO
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public byte[] byRes1;
        }
      

  3.   

    试试这样的
      public struct ANTS_NET_DVR_DEVICEINFO
        {
            [MarshalAs(UnmanagedType.ByValArray,SizeConst=20)]
            public char[] byRes1;
        }
      

  4.   

    很感谢兄台回复,这个方法已经试过了,是不行的,会报封送PInvoke 的封送处理错误
    估计不是这样的.
    我记得有类似这样的
     [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 20)]
    只是找不到合适的类型
      

  5.   

    是的,应该[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 20)]
    给看叉了,呵呵
      

  6.   


    ByValArray不行,会提示内存错误
      

  7.   

    不可能不行,内存错误还可能是因为调用方式没指定造成的。另外要注意,必须用byte[]而不能是char[],因为C#里面的char是2个字节,C++里面只有1个字节。
      

  8.   


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct ANTS_NET_DVR_DEVICEINFO
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
        public char[] cColorName;
    }希望可以解决你的问题O(∩_∩)O~
      

  9.   

    您说的指定调用方式是指这样么?
     [StructLayoutAttribute (LayoutKind.Sequential, CharSet = CharSet.Ansi)]
      public struct ANTS_NET_DVR_DEVICEINFO
        {
            [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst=20)]
            public char[] byRes1;
        }
      

  10.   

    再强调下,只能用byte,不能用char,那个CharSet是对String的编码设置,与char无关。如果需要转化为字符串,你可以将byte[]接收后,自己通过Encoding类转换到字符串