等效的C ++ typedef结构到C#

时间:2016-11-23 22:37:08

标签: c# c++ struct

我正在开发一个需要与DLL通信的项目。提供的SDK有一个C ++的演示项目,它使用上面的typedef结构从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#中使用这种转换后的结构,但由于缺少* 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));

谢谢@Asik你是对的!问题是由dwNPIOData的错误类型等效引起的,因为C ++中的usigned长度为32位,而C#中的长度为64位。解决方案是在C#中使用uint32类型 public uint dwNPIOData;

2 个答案:

答案 0 :(得分:4)

请记住整数类型并不代表C++C#中的相同内容。特别是, <dependency> <groupId>jtidy</groupId> <artifactId>jtidy</artifactId> <version>r820</version> </dependency> 在C ++中表示long,但在C#*中表示at least 32 bits。对齐也可能有所不同,因为您没有用任何一种语言明确指定它。

简而言之,您需要使用等效类型,并确保对齐与映射完全相同。它与&#34;缺失* LPTRACKIRDATA&#34;无关。

*问题原来是C#strictly 64 bits代替ulong

答案 1 :(得分:0)

OP的答案:

感谢@Asik,您说对了!该问题是由于dwNPIOData的错误类型等效引起的,因为C ++中的usigned long为32Bits,而在C#中为64bits。解决方案是在C#中使用uint32类型 public uint dwNPIOData;