有一个自定义结构体:public struct TimeYS
{
public int Year;
public int Month;
public int Day;
public int Hour;
public int Minute;
public int Second;
}
public struct BExtrTypeHrmnCntRt
{
public TimeYS Tm;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public float[]   MxAN;        //A相最大含有率
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public TimeYS[]  MxTmAN;      //A相最大含有率发生时间
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public float[]   MnAN;        //A相最小含有率
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public TimeYS[]  MnTmAN;      //A相最小含有率发生时间
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public float[]   MxBN;        //B相最大含有率
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public TimeYS[]  MxTmBN;      //B相最大含有率发生时间
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public float[]   MnBN;        //B相最小含有率
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public TimeYS[]  MnTmBN;      //B相最小含有率发生时间
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public float[]   MxCN;        //C相最大含有率
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public TimeYS[]  MxTmCN;      //C相最大含有率发生时间
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public float[]   MnCN;        //C相最小含有率
[MarshalAs(UnmanagedType.ByValArray, SizeConst=51)]
public TimeYS[]  MnTmCN;      //C相最小含有率发生时间
}
当用Marshal.SizeOf(typeof(BExtrTypeHrmnCntRt))获取这个结构体长度时,却提示错误,请问该如何获取这样的结构体长度,或者说将这种结构体转成byte数组?谢谢

解决方案 »

  1.   

    没人帮忙吗?错误信息是:
    “类型 BExtrTypeHrmnCntRt 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。”
      

  2.   

    没人帮忙吗?错误信息是:
    “类型 BExtrTypeHrmnCntRt 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。”
      

  3.   

    http://msdn.microsoft.com/zh-cn/library/0t2cwe11(VS.80).aspx
      

  4.   

    加上[StructLayout(LayoutKind.Sequential)]
      

  5.   

    vs2005 .NET2.0编译通过!
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;namespace ConsoleApplication1
    {
        public struct TimeYS
        {
            public int Year;
            public int Month;
            public int Day;
            public int Hour;
            public int Minute;
            public int Second;
        }    public struct BExtrTypeHrmnCntRt
        {
            public TimeYS Tm;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MxAN;        //A相最大含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MxTmAN;      //A相最大含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MnAN;        //A相最小含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MnTmAN;      //A相最小含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MxBN;        //B相最大含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MxTmBN;      //B相最大含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MnBN;        //B相最小含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MnTmBN;      //B相最小含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MxCN;        //C相最大含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MxTmCN;      //C相最大含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MnCN;        //C相最小含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MnTmCN;      //C相最小含有率发生时间
        }
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(Marshal.SizeOf(typeof(BExtrTypeHrmnCntRt))); //输出8592
                Console.ReadLine();
            }
        }
    }
      

  6.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;namespace ConsoleApplication1
    {
        public struct TimeYS
        {
            public int Year;
            public int Month;
            public int Day;
            public int Hour;
            public int Minute;
            public int Second;
        }    public struct BExtrTypeHrmnCntRt
        {
            public TimeYS Tm;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MxAN;        //A相最大含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MxTmAN;      //A相最大含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MnAN;        //A相最小含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MnTmAN;      //A相最小含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MxBN;        //B相最大含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MxTmBN;      //B相最大含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MnBN;        //B相最小含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MnTmBN;      //B相最小含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MxCN;        //C相最大含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MxTmCN;      //C相最大含有率发生时间
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public float[] MnCN;        //C相最小含有率
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
            public TimeYS[] MnTmCN;      //C相最小含有率发生时间
        }
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(Marshal.SizeOf(typeof(BExtrTypeHrmnCntRt))); //输出8592
                Console.ReadLine();
            }
        }
    }
      

  7.   

            [StructLayout(LayoutKind.Sequential)]
            public struct TimeYS
            {
                public int Year;
                public int Month;
                public int Day;
                public int Hour;
                public int Minute;
                public int Second;
            }
            [StructLayout(LayoutKind.Sequential)]
            public struct BExtrTypeHrmnCntRt
            {
                public TimeYS Tm;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public float[] MxAN;        //A相最大含有率
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public TimeYS[] MxTmAN;      //A相最大含有率发生时间
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public float[] MnAN;        //A相最小含有率
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public TimeYS[] MnTmAN;      //A相最小含有率发生时间
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public float[] MxBN;        //B相最大含有率
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public TimeYS[] MxTmBN;      //B相最大含有率发生时间
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public float[] MnBN;        //B相最小含有率
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public TimeYS[] MnTmBN;      //B相最小含有率发生时间
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public float[] MxCN;        //C相最大含有率
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public TimeYS[] MxTmCN;      //C相最大含有率发生时间
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public float[] MnCN;        //C相最小含有率
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
                public TimeYS[] MnTmCN;      //C相最小含有率发生时间
            }
    .....
                MessageBox.Show(Marshal.SizeOf(typeof(BExtrTypeHrmnCntRt)).ToString()); VS2008 .NET3.5测试正确
      

  8.   

    //对象的成员按照它们在被导出到非托管内存时出现的顺序依次布局。这些成员根据在 StructLayoutAttribute.Pack 中指定的封装进行布局,并且可以是不连续的。[StructLayout(LayoutKind.Sequential)]没有这句不行吗?
      

  9.   

    ......也可以的 :0不知道你怎么弄的有错误啊..
    送你一段 转成byte的代码            int size = Marshal.SizeOf(typeof(BExtrTypeHrmnCntRt));
                BExtrTypeHrmnCntRt xobj = new BExtrTypeHrmnCntRt();
                IntPtr pUm = Marshal.AllocHGlobal(size);
                Marshal.StructureToPtr(xobj, pUm,  true);
                byte[] bytes = new byte[size];
                Marshal.Copy(pUm, bytes, 0, size);
                Marshal.DestroyStructure(pUm, typeof(BExtrTypeHrmnCntRt));
                Marshal.FreeHGlobal(pUm);
      

  10.   

    在VS2005中没有做任何设置,直接新建“控制台项目”,把你代码往里复制,引入System.Runtime.InteropServices命名空间,就OK了!
    vs2008中照样通过!
    XP系统!看你代码有没其它问题!
      

  11.   

    遇到一个问题,在我自定义的结构体中,
     public struct INITIAL_OFFER_MESSAGE
        {
            public MESSAGE_HEADER MsgHeader;        public CONNECTION_INFORMATION ConnectionInfo;        public byte[] Hash;
        }
      MESSAGE_HEADER ,CONNECTION_INFORMATION 是我自定义的另外两个结构体,长度都固定为8bytes,Hash是长度可变的byte数组,我得到一个改结构体的实例对象,其中Hash数组的长度为32byte,但是我用System.Runtime.InteropServices.Marshal.SizeOf方法得到该结构体对象的长度怎么是20?哪位大牛帮忙解决一下
      

  12.   

    小伙,跑这来问,你先自己好好检查你的Hash数组的长度是32byte还是32bit。做事认真点,,,,