簡體   English   中英

C++ typedef struct 等效於 C#

[英]Equivalent of C++ typedef struct to C#

我正在開發一個需要與 DLL 通信的項目。 提供的 SDK 有一個 C++ 演示項目,它使用上述 typedef 結構從 DLL 中檢索數據,它運行良好,但我必須做同樣的事情,但在 C# 中,我嘗試創建一個類似的結構,但是當我調用DLL my struct 以不同的順序填充。

typedef struct tagTrackIRData
{
    unsigned short wNPStatus;
    unsigned short wPFrameSignature;
    unsigned long  dwNPIOData;

    float fNPRoll;
    float fNPPitch;
    float fNPYaw;
    float fNPX;
    float fNPY;
    float fNPZ;
    float fNPRawX;
    float fNPRawY;
    float fNPRawZ;
    float fNPDeltaX;
    float fNPDeltaY;
    float fNPDeltaZ;
    float fNPSmoothX;
    float fNPSmoothY;
    float fNPSmoothZ;
} TRACKIRDATA, *LPTRACKIRDATA;

問題是我在 C# 中收到了上面的結構,但我無法在 C# 中以相同的結構格式分配它(該結構來自 c++ dll,我的程序在 C# 中調用它)。 我嘗試在 C# 中使用這種轉換后的結構,但數據沒有進入正確的變量名,可能是由於缺少 *LPTRACKIRDATA。

struct TRACKIRDATA
{
    public ushort wNPStatus;
    public ushort wPFrameSignature;
    public ulong dwNPIOData;

    public float fNPRoll;
    public float fNPPitch;
    public float fNPYaw;
    public float fNPX;
    public float fNPY;
    public float fNPZ;
    public float fNPRawX;
    public float fNPRawY;
    public float fNPRawZ;
    public float fNPDeltaX;
    public float fNPDeltaY;
    public float fNPDeltaZ;
    public float fNPSmoothX;
    public float fNPSmoothY;
    public float fNPSmoothZ;
}

我正在使用以下代碼在 C# 中調用 DLL:

TRACKIRDATA tid;
NPRESULT gdRes = getData(&tid);

getData() 在哪里

private delegate NPRESULT NP_GetData(TRACKIRDATA* data);
getData = (NP_GetData)Marshal.GetDelegateForFunctionPointer(procAddrNP_GetData, typeof(NP_GetData));

請記住,整數類型在C++C# 中的含義不同。 特別是, long在 C++ 中意味着at least 32 bits ,但在 C#* 中意味着strictly 64 bits 對齊方式也可能不同,因為您沒有在任何一種語言中明確指定它。

簡而言之,您需要使用等效類型並確保對齊完全相同才能使映射正常工作。 它與“缺少 *LPTRACKIRDATA”無關。

*問題最初是用 C# ulong代替uint

OP的回答:

謝謝@Asik 你是對的! 該問題是由 dwNPIOData 的錯誤類型等價引起的,因為 C++ 中使用的 long 是 32 位,而在 C# 中它是 64 位大小。 解決方案是在 C# public uint dwNPIOData;使用類型 uint32 public uint dwNPIOData;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM