gpt4 book ai didi

c# - Marshall 在 c# 中使用 ifdef 和联合构造结构

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:25 25 4
gpt4 key购买 nike

我在 C 中有以下非托管代码

typedef struct {         
PNIO_UINT16 AlarmSpecifier;
PNIO_UINT32 ModIdent;
PNIO_UINT16 UserAlarmDataLen;

#ifdef PNIO_ALARM_OLD_STRUC
PNIO_UINT8 UserAlarmData[PNIO_MAX_ALARM_DATA_LEN];
#else
union {
PNIO_ALARM_DATA_MAINTENANCE_DIAGNOSIS m_diag; /* Another struct of size 20bytes */
PNIO_UINT8 UserAlarmData[PNIO_MAX_ALARM_DATA_LEN]; /* Byte array, PNIO_MAX_ALARM_DATA_LEN=1472 */
} UAData;
#endif

} ATTR_PACKED PNIO_ALARM_INFO;

这是我的托管转换,我能够推断大小并正确布局联合,但我不知道如何处理从 c 代码到 c# 的 ifdef 条件

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct PNIO_ALARM_INFO
{
[FieldOffset(0)]
public ushort AlarmSpecifier;

[FieldOffset(2)]
public uint ModIdent;

[FieldOffset(6)]
public ushort UserAlarmDataLen;

// ifdef condition is true use this field
//[FieldOffset(8)]
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1472)]
//public byte[] UserAlarmData;

// ifdef condition false use following fields
[FieldOffset(8)]
public PNIO_ALARM_DATA_MAINTENANCE_DIAGNOSIS m_diag;

[FieldOffset(28)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1472)]
public byte[] UserAlarmData;
}

谁能告诉我如何处理 if 条件和联合?

最佳答案

一旦编译,C 和 C# 中的结构是静态的,在这方面没有区别。 #ifdef 的工作方式也几乎相同,这里也没有区别。

这里唯一要意识到的是,根据 PNIO_ALARM_OLD_STRUC 的值,编译可以产生两个不同的结构。您需要以相同的方式编译 C 和 C# 代码,以便它们产生相同的结构定义。

如果你想用一个 C# 版本处理两个 C 版本,你需要定义两个不同的 C# 结构,以便它们都出现在一个编译单元中。然后你需要弄清楚什么时候使用哪个结构。

关于c# - Marshall 在 c# 中使用 ifdef 和联合构造结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20424621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com