Pack = 4 和 Pack = 1 使得结构不等同于它的 C 声明

Pack = 4 and Pack = 1 makes the struct not equivalent to its C declaration

有结构:

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct WAVEFORMATEX
    {
        public ushort wFormatTag;
        public ushort nChannels;
        public ushort nSamplesPerSec;
        public uint nAvgBytesPerSec;
        public ushort nBlockAlign;
        public ushort wBitsPerSample;
        public ushort cbSize;
    };
    public WAVEFORMATEX audioInfo = new WAVEFORMATEX();

含 Pack=4 Marshal.SizeOf(audioInfo) returns 20 字节

包=1 - 长度 = 16 字节。

在 C++ 级别上,我不使用任何选项,例如 "Pack" 并且 sizeof 始终 = 16

但是当我将引用从 C# 传递到 C++ (Interop) 时出现问题。

如果对齐 Pack=4 结果看起来是正确的,当 Pack=1 时,nAvgBytesPerSec 的值太高(异常),但其他都正常。

所以缺少的一点是为什么在 C++ 中该值在自然长度为 16 字节的情况下是可以的,但在 C# 中相同的值 (nAvgBytesPerSec) 只有在 Pack=4 时才可以,当长度为 20 字节时,这显然更长最多 4 个字节? 在这种情况下,互操作级别会发生什么? 什么(谁)负责从 C++ 到 C# 的对齐和正确传输数据?

您从哪里获得 WAVEFORMATEX 的结构布局?

根据我在网上看到的所有内容,正确的布局是:

typedef struct {
  WORD  wFormatTag;
  WORD  nChannels;
  DWORD nSamplesPerSec;
  DWORD nAvgBytesPerSec;
  WORD  nBlockAlign;
  WORD  wBitsPerSample;
  WORD  cbSize;
} WAVEFORMATEX;

in C/C++,在 C# 中转换为:

[StructLayout(LayoutKind.Sequential)]
struct WAVEFORMATEX
{
    public ushort    wFormatTag;
    public ushort    nChannels;
    public uint        nSamplesPerSec;
    public uint        nAvgBytesPerSec;
    public ushort    nBlockAlign;
    public ushort    wBitsPerSample;
    public ushort    cbSize;
}

你能试着整理一下看看会发生什么吗?