我有一个非托管C++代码
,我想将它转换成托管C#代码
,非托管代码如下所示,我搜索过但没有找到我的回答...我想知道编码以下代码的正确方法,我不确定如何编码枚举然后在结构中引用它..MMTPConxNack
结构是的成员另一个结构内的 union 。
层次结构如下所示:
typedef enum
{
MMTPCnxNckRsn_NoAnswer=-2,
MMTPCnxNckRsn_SendError=-1,
MMTPCnxNckRsn_Ok=0,
MMTPCnxNckRsn_InvalidMember,
MMTPCnxNckRsn_HubNotReady,
MMTPCnxNckRsn_UnknownMember,
MMTPCnxNckRsn_LastCnxTooRecent,
MMTPCnxNckRsn_InvalidVersion,
MMTPCnxNckRsn_InvalidOptions,
MMTPCnxNckRsn_TooManyCnx
} MMTPCnxNckRsn;
typedef struct
{
MMTPCnxNckRsn Reason;
} MMTPConxNack;
typedef struct
{
long Length;
short Type;
union
{
MMTPConxReq ConxReq;
MMTPConxAck ConxAck;
MMTPConxNack ConxNack; // the structure with an enum inside
MMTPErrInd ErrInd;
} Data;
} MMTPMsg;
实际上我想编码 MMTPConxNack
结构..我使用 FieldOffset 来定义大小。提前致谢。
最佳答案
枚举看起来像这样:
public enum MMTPCnxNckRsn {
MMTPCnxNckRsn_NoAnswer = -2,
MMTPCnxNckRsn_SendError = -1,
MMTPCnxNckRsn_Ok = 0,
MMTPCnxNckRsn_InvalidMember,
MMTPCnxNckRsn_HubNotReady,
MMTPCnxNckRsn_UnknownMember,
MMTPCnxNckRsn_LastCnxTooRecent,
MMTPCnxNckRsn_InvalidVersion,
MMTPCnxNckRsn_InvalidOptions,
MMTPCnxNckRsn_TooManyCnx
}
包含的结构是:
public struct MMTPConxNack {
public MMTPCnxNckRsn Reason;
}
联盟是:
[StructLayout(LayoutKind.Explicit)]
public struct MMTPMsgDataUnion
{
[FieldOffset(0)]
public MMTPConxReq ConxReq;
[FieldOffset(0)]
public MMTPConxAck ConxAck;
[FieldOffset(0)]
public MMTPConxNack ConxNack;
[FieldOffset(0)]
public MMTPErrInd ErrInd;
}
这是棘手的部分。您使用 LayoutKind.Explicit
和 FieldOffset
来指定 C++ union 的所有成员相互重叠。显然,您需要定义该 union 中包含的其他 3 种类型,这些定义我们在问题的 C++ 代码中看不到。我想您已经知道如何定义它们了。
一旦声明了 union ,最终的结构就很简单了:
public struct MMTPMMsg
{
public int Length;
public short Type;
public MMTPMsgDataUnion Data;
}
关于c# - 将具有枚举成员的非托管结构编码到 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20866859/