我正在开发一个需要与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;
答案 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;