簡體   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