同事用c++写了一个dll,其中有一个结构体如下typedef struct Item {
 WORD BWType;  
 TCHAR Name[10];  
 TCHAR Number[20];
 WORD NumType;  
 WORD Scope;   
 FILETIME Start;
 FILETIME End;
 DWORD Ceoid;
} Item, *Item;
在C++中sizeof(Item)=88我在C#中如何定义一个结构体和他对应呢?我试如下定义:  [StructLayout(LayoutKind.Sequential)]
        public struct Item
        {
            public ushort BWType;
           [MarshalAs(UnmanagedType.LPArray, SizeConst = 10)]   
            public char[]  Name;   
           [MarshalAs(UnmanagedType.LPArray, SizeConst =20)]   
            public char[]  phoneNumber ;
            public ushort numType ;     
            public  ushort scope ; 
            public  UInt64 startTime;  
            public  UInt64 endTime ;  
            public  uint   ceoid ; 
        }
在C#中Marshal.SizeOf(Item)=96 ,好奇怪啊,这96是怎么来的呢?

解决方案 »

  1.   

    因为你写的不对c++里TCHAR是根据工程当前的字符集而定的, c++里结果是88表明你同事用的Unicode字符集c#里有FILETIME结构体,而且和c++的一样,在 System.Runtime.InteropServices.FILETIME
    你的c#结构定义是错的,所以计算结果也不正确
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct FItem
    {
          public ushort BWType;
          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
          public string Name;
          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
          public string phoneNumber;
          public ushort numType;
          public ushort scope;
          public FILETIME startTime;
          public FILETIME endTime;
          public uint ceoid;
    }
    上面用红色标注的地方都是你写的不正确的地方
      

  2.   

    晕  CSDN的红色标记有问题
      

  3.   

    楼主用string  调用前初始化的时候 string.Tocharray()就可以用了。
      

  4.   

    我仔细算了一下,我在C#里写的结构体是按8字节对齐的,所以大小是96还有,我开发的是win mobile 上的软件,FILETIME只有PC平台上才支持,在mobile下没有这个结构啊。