繁体   English   中英

带C#枚举成员的元数据非托管结构

[英]Marshal unmanaged structure with enum member to c#

我有一个unmanaged C++ code ,我想将其转换为managed C# code ,该非托管的代码如下所示,我进行了搜索,但没有找到答案...我想知道编组以下代码的正确方法,我不确定如何MMTPConxNack一个枚举,然后在一个结构中引用它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定义大小。 提前致谢。

您需要一个C#枚举和结构来匹配本机的:

public enum MMTPCnxNckRsn
{
    MMTPCnxNckRsn_NoAnswer,            
    MMTPCnxNckRsn_SendError,         
    MMTPCnxNckRsn_Ok,                  
    MMTPCnxNckRsn_InvalidMember,         
    MMTPCnxNckRsn_HubNotReady,           
    MMTPCnxNckRsn_UnknownMember,         
    MMTPCnxNckRsn_LastCnxTooRecent,       
    MMTPCnxNckRsn_InvalidVersion,        
    MMTPCnxNckRsn_InvalidOptions,       
    MMTPCnxNckRsn_TooManyCnx             
}

public struct MMTPConxNack
{
    public readonly MMTPCnxNckRsn Reason;
}

然后您将其封送为:

var managedItem = (MMTPConxNack)Marshal.PtrToStructure(pointer,typeof(MMTPConxNack));

枚举看起来像这样:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM