C代码如下typedef struct{
  char name[20];
  char passwd[20];
}CURONE;
typedef struct{ CURONE admin;
 CURONE hiadmin[10];
 CURONE hipasswd[10];}WHOLE;BOOL GET_PARAM(char *sname,char *url,WHOLE &w)
{
//对w 的结构体进行处里

我的C#代码如下:
public struct CURONE{
  [MarshalAs(UnmanagedType.ValTChar,SizeConst=20)]
  string name;
  [MarshalAs(UnmanagedType.ValTChar,SizeConst=20)]
  string passwd;
}public struct WHOLE{ [MarshalAs(UnmanagedType.Struct)]           //正确
 CURONE admin;
 [MarshalAs(UnmanagedType.Struct,SizeConst=10)]           
 CURONE hiadmin[];                         // 报错,类型不对
 [MarshalAs(UnmanagedType.Struct,,SizeConst=10)]
 CURONE hipasswd[];                         //报错, 类型不对}经过测试,对结构数组,不按数组操作,确能够通过,当然只能得到 hiadmin[0] 的值了。
[MarshalAs(UnmanagedType.Struct)]           
 CURONE hiadmin;                         ===============
有什么方法可以解决啊!

解决方案 »

  1.   

    微软的工具告诉我是这样写的:
    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi)]
    public struct CURONE {
        
          [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=20)]
        public string name;
        
          [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=20)]
        public string passwd;
    }[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct WHOLE {
        
           public CURONE admin;
        
           [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=10, ArraySubType=System.Runtime.InteropServices.UnmanagedType.Struct)]
        public CURONE[] hiadmin;
        
            [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=10, ArraySubType=System.Runtime.InteropServices.UnmanagedType.Struct)]
        public CURONE[] hipasswd;
    }
      

  2.   

    using System.Runtime.InteropServices;[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct CURONE
    {
        /// char[20]
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] 
        public string name;    /// char[20]
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] 
        public string passwd;
    }[StructLayout(LayoutKind.Sequential)]
    public struct WHOLE
    {
        /// CURONE->Anonymous_968e0614_bde3_4620_922f_d5159450a488
        public CURONE admin;    /// CURONE[10]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10, ArraySubType = UnmanagedType.Struct)] 
        public CURONE[] hiadmin;    /// CURONE[10]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10, ArraySubType = UnmanagedType.Struct)] 
        public CURONE[] hipasswd;
    }
      

  3.   

    你用百度或google搜索一下:
    P/Invoke Interop Assistant 
      

  4.   

    今天试了,果然正确。但有点疑问:赋值的时候出现错误:WHOLE w=new WHOLE();w.admin.name="n1";
    w.admin.passwd="p1";w.hiadmin[0].name="cctv";
    w.hiadmin[0].passwd="yyy";....将这个结构w 传入函数时,出现错误,调试窗口一看,hiadmin 值为NULL, 而 admin 值是存在的。
      

  5.   

    w.hiadmin = new CURONE[数组长度];
    w.hiadmin[0] = new CURONE();
    w.hiadmin[0].name="cctv"; 
    w.hiadmin[0].passwd="yyy"; 
    大哥,你要先初始化才能赋值啊
      

  6.   

    http://topic.csdn.net/u/20070314/07/0cabb2e7-c18b-464d-b697-9769d87de078.html