c# - 将具有枚举成员的非托管结构编码到 c#

标签 c# c++ pinvoke marshalling

我有一个非托管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.ExplicitFieldOffset 来指定 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/

相关文章:

c# - 如何对我的对象是否真的可序列化进行单元测试?

c++ - Crypto++ 的 SecByteBlock 类的优点

c# - FindMimeFromData() 的 dwMimeFlags 参数中 FMFD_RETURNUPDATEDIMGIMES 的数值是多少?

c++ - 是否有平面未排序的 map /集合实现?

c# - 用于 P/Invoke 访问的引脚数据

c# - PInvoke/Interop 声明

c# - 允许迭代而不产生任何垃圾

c# - 将模型传递给部分时出现类型转换错误

c# - 结构图错误 : No Default Instance defined for PluginFamily

C++ STL : Vector syntax