有一个自定义结构体: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数组?谢谢
{
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数组?谢谢
“类型 BExtrTypeHrmnCntRt 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。”
“类型 BExtrTypeHrmnCntRt 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。”
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();
}
}
}
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();
}
}
}
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测试正确
送你一段 转成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);
vs2008中照样通过!
XP系统!看你代码有没其它问题!
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?哪位大牛帮忙解决一下