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#的主要内容,如果未能解决你的问题,请参考以下文章

struct和typedef struct

(转) struct 和 typedef struct

struct和typedef struct区别

struct和typedef struct彻底明白了

C++ 类 Typedef Struct 没有命名类型

typedef struct 与 struct