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;
}
你能试着整理一下看看会发生什么吗?
有结构:
[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;
}
你能试着整理一下看看会发生什么吗?