C++ typedef struct 等效于 C#
Posted
技术标签:
【中文标题】C++ typedef struct 等效于 C#【英文标题】:Equivalent of C++ typedef struct to C# 【发布时间】:2016-11-23 22:37:07 【问题描述】:我正在处理一个需要与 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));
【问题讨论】:
C++ 中不需要 typedef 结构。这是对 C 的回溯。 有什么问题? @juanchopanza 很高兴知道,但 C++ dll 不是我的,我只是从我的 C# 应用程序中的 DLL 调用一个方法,所以我必须处理预期的结构。 @SLaks 好吧,我必须在 C# 中处理来自 DLL 的返回数据(我想是用 C 或 C++ 编码的)。提供的 SDK 有一个使用上述 typedef 结构调用 DLL 的 C++ 演示项目,它运行良好,但在 C# 中,我的结构以不同的顺序填充。 【参考方案1】:请记住,整数类型在 C++ 和 C# 中的含义并不相同。特别是,long
在 C++ 中表示 at least 32 bits
,但在 C#* 中表示 strictly 64 bits
。对齐方式也可能不同,因为您没有在任何一种语言中明确指定它。
简而言之,您需要使用等效类型并确保对齐方式完全相同,映射才能正常工作。它与“丢失的 *LPTRACKIRDATA”无关。
*问题最初用 C# ulong
代替 uint
。
【讨论】:
感谢您提供的信息,我将 ulong 更改为 uint (uint32),因此现在类型将匹配。我认为其余的是正确的等效类型。 经过进一步测试,现在的顺序是一样的,你是对的,问题是 ulong(C++ 中的 32 大小与 C# 中 64 位的 ulong 不同)将其更改为 uint 修复了问题.【参考方案2】:OP 的回答:
谢谢@Asik,你是对的!问题是由 dwNPIOData 的错误类型等效引起的,因为 C++ 中的 usigned long 是 32 位,而在 C# 中它是 64 位大小。解决方案是在 C# 中使用类型 uint32
public uint dwNPIOData;
【讨论】:
以上是关于C++ typedef struct 等效于 C#的主要内容,如果未能解决你的问题,请参考以下文章