如何转换C++;结构到C#等价物? 这是我的C++结构(DOC说每个实例必须是10个字节大小):

如何转换C++;结构到C#等价物? 这是我的C++结构(DOC说每个实例必须是10个字节大小):,c#,c++,dll,interop,dllimport,C#,C++,Dll,Interop,Dllimport,我制作了以下C#struct: 以下是我在C#项目中的完整测试代码: 这是控制台上的输出: LaserPoint.Size: 8 为什么点的大小是8字节而不是10字节 UInt16 = 2 bytes UInt16 = 2 bytes byte[6] = 6 bytes Total = 10 bytes ? 我这里缺少什么?我认为问题在于阵列。。。试试这个: [StructLayout(LayoutKind.Sequential, Pack=1)] public struct Las

我制作了以下C#struct:

以下是我在C#项目中的完整测试代码:

这是控制台上的输出:

LaserPoint.Size: 8
为什么
点的大小是8字节而不是10字节

UInt16  = 2 bytes
UInt16  = 2 bytes
byte[6] = 6 bytes
Total   = 10 bytes ?

我这里缺少什么?

我认为问题在于阵列。。。试试这个:

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct LaserPoint {
    public UInt16 x;                   // 2 bytes
    public UInt16 y;                   // 2 bytes
    [MarhalAs(UnmanagedType.ByValArray, SizeConst = 6]
    public byte[] colors;              // 6 bytes
}
byte[]colors
不是6字节宽。它甚至不是实际的数组,而是对堆上字节数组的引用。根据您的平台,它的大小为32位(4字节)或64位(8字节)(内部为指针)。这就是为什么得到的结果是8字节的大小(2字节+2字节+4字节)。在64位平台上,您将获得12个字节(2+2+8)的大小

<> > < <代码>结构> <代码>行为类似C++ >代码>结构> <代码>添加<代码> MARSalasAtgult< /C> >并指定<代码> unMauldType。
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct LaserPoint {
    public UInt16 x;                  
    public UInt16 y;                         
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public byte[] colors;             
}

因为数组不是编译时固定大小的数组。把它想成一个C++中的指针,非常感谢!我决定接受阿德里安的回答,因为他补充了一些有用的解释。但我也投票给了你的。
UInt16  = 2 bytes
UInt16  = 2 bytes
byte[6] = 6 bytes
Total   = 10 bytes ?
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct LaserPoint {
    public UInt16 x;                   // 2 bytes
    public UInt16 y;                   // 2 bytes
    [MarhalAs(UnmanagedType.ByValArray, SizeConst = 6]
    public byte[] colors;              // 6 bytes
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct LaserPoint {
    public UInt16 x;                   // 2 bytes
    public UInt16 y;                   // 2 bytes
    public byte[] colors;              // 6 bytes
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct LaserPoint {
    public UInt16 x;                  
    public UInt16 y;                         
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public byte[] colors;             
}