【发布时间】:2016-03-22 08:26:53
【问题描述】:
我有如下结构
[StructLayout(LayoutKind.Sequential)]
public struct MyStructType
{
[MarshalAs(UnmanagedType.U1)]
public byte stx;
public UInt16 cmdId;
public UInt16 status;
public UInt16 pktNo;
[MarshalAs(UnmanagedType.U1)]
public byte contPkt;
[MarshalAs(UnmanagedType.U1)]
public byte dataoffset;
public UInt16 dataLength;
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 6)]
public byte[] data;
public UInt16 checkSum;
[MarshalAs(UnmanagedType.U1)]
public byte cr;
}
我尝试使用以下代码将此结构转换为字节数组。
byte[] ConvertStructureToByteArray(MyStructType str)
{
int size = Marshal.SizeOf(str);
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(str, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);
return arr;
}
但我收到以下错误,因为他们不知道尺寸
类型“MyStructType”不能作为非托管结构封送;无法计算出有意义的大小或偏移量。
问题是因为
public UInt16 dataLength;
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 6)]
public byte[] data;
dataLength 在运行时计算。如何将此结构转换为 ByteArray?
【问题讨论】:
-
我认为这不适用于结构。假设您想这样做以将其发送到 C/C++ 函数,您可能必须改用
IntPtr,并使用Marshal.AllocHGlobal()自己显式设置它并使用Marshal.Copy()填充它 -
是的,我做到了。请参阅 ConvertStructureToByteArray 方法。
-
我的意思是你需要将
data声明为IntPtr -
我的理解是
SizeParamIndex适用于extern调用中的不同参数,而不是在现有类型中;例如:msdn.microsoft.com/en-us/library/…
标签: c# arrays byte structure marshalling