[英]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.Explicit
和FieldOffset
来指定C ++联合的所有成员彼此重叠。 显然,您需要为此联合中包含的其他3种类型定义,这些问题在问题的C ++代码中是看不到的。 我想您已经知道如何定义它们。
声明联合后,最终结构很简单:
public struct MMTPMMsg
{
public int Length;
public short Type;
public MMTPMsgDataUnion Data;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.