请问:
C#中结构体数组能不能当作一个类,还是需要把它分成许多结构体一一进行操作?比如:
[StructLayout(LayoutKind.Sequential, Pack = 4)]
struct A
{..}A a;Marshal.SizeOf(a);
Marshal.SizeOf(typeof(A));
以上两种方法都可求出结构体大小。那么现在:
A[]aa=new A[16];那么:
Marshal.SizeOf(aa);
Marshal.SizeOf(typeof(A[]));这两种方式是否可以求出结构体数组的大小?因为我用的一些函数是对结构体进行操作,我想把它们也用在结构体数组上。如有兴趣您可看下这两个函数:
       //结构体复制入byte数组
        public static byte[] StructToBytes(object structObj)
        {
            //得到结构体的大小
            int size = Marshal.SizeOf(structObj);
            //创建byte数组
            byte[] bytes = new byte[size];
            //分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将结构体拷到分配好的内存空间
            Marshal.StructureToPtr(structObj, structPtr, false);
            //从内存空间拷到byte数组
            Marshal.Copy(structPtr, bytes, 0, size);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回byte数组
            return bytes;
        }
        //byte数组复制入结构体
        public static object BytesToStuct(byte[] bytes, Type type)
        {
            //得到结构体的大小
            int size = Marshal.SizeOf(type);
            //byte数组长度小于结构体的大小
            if (size > bytes.Length)
            {
                //返回空
                return null;
            }
            //分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将byte数组拷到分配好的内存空间
            Marshal.Copy(bytes, 0, structPtr, size);
            //将内存空间转换为目标结构体
            object obj = Marshal.PtrToStructure(structPtr, type);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回结构体
            return obj;
        }

解决方案 »

  1.   

    应该是可以的。Marshal.SizeOf(object); 
    Marshal.SizeOf(Type);
    没有规定不可以是Array类型
     一个简单的方式是先structObj.getType().IsArray()判断是不是数组,如果是获取数组里的各个Type的length
    加起来。
      

  2.   

    请问: 
    C#中结构体数组能不能当作一个类,还是需要把它分成许多结构体一一进行操作? 比如: 
    [StructLayout(LayoutKind.Sequential, Pack = 4)] 
    struct A 
    {..} A a; Marshal.SizeOf(a); 
    Marshal.SizeOf(typeof(A)); 
    以上两种方法都可求出结构体大小。 那么现在: 
    A[]aa=new A[16]; 那么: 
    Marshal.SizeOf(aa); 
    Marshal.SizeOf(typeof(A[])); 这两种方式是否可以求出结构体数组的大小?因为我用的一些函数是对结构体进行操作,我想把它们也用在结构体数组上。 如有兴趣您可看下这两个函数: 
          //结构体复制入byte数组 
            public static byte[] StructToBytes(object structObj) 
            { 
                //得到结构体的大小 
                int size = Marshal.SizeOf(structObj); 
                //创建byte数组 
                byte[] bytes = new byte[size]; 
                //分配结构体大小的内存空间 
                IntPtr structPtr = Marshal.AllocHGlobal(size); 
                //将结构体拷到分配好的内存空间 
                Marshal.StructureToPtr(structObj, structPtr, false); 
                //从内存空间拷到byte数组 
                Marshal.Copy(structPtr, bytes, 0, size); 
                //释放内存空间 
                Marshal.FreeHGlobal(structPtr); 
                //返回byte数组 
                return bytes; 
            } 
            //byte数组复制入结构体 
            public static object BytesToStuct(byte[] bytes, Type type) 
            { 
                //得到结构体的大小 
                int size = Marshal.SizeOf(type); 
                //byte数组长度小于结构体的大小 
                if (size > bytes.Length) 
                { 
                    //返回空 
                    return null; 
                } 
                //分配结构体大小的内存空间 
                IntPtr structPtr = Marshal.AllocHGlobal(size); 
                //将byte数组拷到分配好的内存空间 
                Marshal.Copy(bytes, 0, structPtr, size); 
                //将内存空间转换为目标结构体 
                object obj = Marshal.PtrToStructure(structPtr, type); 
                //释放内存空间 
                Marshal.FreeHGlobal(structPtr); 
                //返回结构体 
                return obj; 
            } 
    copy for  have a look
      

  3.   

    所有的数组对象都是一个新的基于Array类型的子类型的一个实例。
      

  4.   

    再顶!
    [StructLayout(LayoutKind.Sequential, Pack = 4)] 
    struct A 
    {..} 
     
    A[]aa=new A[16]; 那么: 
    Marshal.SizeOf(aa); //失败!Marshal.SizeOf(typeof(A[])); //失败!我采用的方法是:把数组包装到一个结构里,然后求结构的大小,虽然成功但多加了一层,不知有没更好方法?
      

  5.   

    你的目的是网络传输还是P/Invoke?
      

  6.   

    回gomoku:
    "你的目的是网络传输还是P/Invoke?"都不是,是文件操作。将自定义格式数据写入或从文件读出。以前VC下用CopyMemory通杀(内存映射文件),而在C#下则"处处受制",当然安全性是没得说。要想使用那两个函数,看来只能采用把数组包装到一个结构里的方法了。另外说明一下,使用C#数组类不行,因为我无法控制其内存结构。