我有一个unmanaged C++ code,我想将其转换为managed C# code,下面显示了非托管代码,我进行了搜索,但没有找到答案...我想知道编码以下代码的正确方法,我不是确保如何编码枚举,然后在一个结构中引用它。MMTPConxNack结构是另一个结构内的联合的成员。
层次结构如下所示:

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.ExplicitFieldOffset来指定C++联合的所有成员彼此重叠。显然,您需要为此联合中包含的其他3种类型定义,这些问题在问题的C++代码中看不到。我想您已经知道如何定义它们。

声明联盟后,最终结构很简单:
public struct MMTPMMsg
{
    public int Length;
    public short Type;
    public MMTPMsgDataUnion Data;
}

10-07 19:00
查看更多