等效于C Typedef struct与C#

Equivalent of C++ typedef struct to C#

本文关键字:struct Typedef      更新时间:2023-10-16

我正在研究一个需要与DLL通信的项目。提供的SDK在C 中具有一个演示项目,它使用上述Typedef struct从DLL中重新读取数据,并且它运行良好,但我必须做同样的事情,但是在C#中,我尝试创建一个类似的结构dll我的结构以不同的顺序填充。

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#中使用这种转换的struct,但数据并未涉及正确的变量名称,可能是由于缺少的 *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 中长期使用的是32bits,并且在C#中是一个64BITS的大小。解决方案是使用C#中的UINT32类型 public uint dwNPIOData;