我正在将应用程序从c ++转换为C#,并且对处理导入结构的正确方法有疑问。我正在尝试将结构从c dll转换为c#c中的结构看起来像这样

typedef struct card_info
{
  ushort r;
  ushort s;
  enum_a a;
  usinged long ul;
  ushort n;
  ushort* b;
  ushort id;
} CARD_INFO;


当我使用[StructLayout(LayoutKind.Sequentaial)]时,数组的大小在c#中为20个字节。但是,如果看一下我的工作c ++代码,它是24个字节。我将C#更改为如下形式:

[StructLayout(LayoutKind.Explicit)]
public struct CardInfo
{
  [FieldOffset(0) public ushort r;
  [FieldOffset(2) public ushort s;
  [FieldOffset(4) public EnumA a;
  [FieldOffset(8) public ushort ul;
  [FieldOffset(12) public ushort n;
  [FieldOffset(16) public UInt32 b;
  [FieldOffset(20) public ushort id;
}


这似乎可以编译,但是我不相信这是执行此操作的正确方法。请让我知道这是否正确或是否有更好的方法。

谢谢

最佳答案

usinged long ul;


这是一个错字,但这绝对不是ushort,而是uint。

也不要使用FieldOffset,让编译器将其弄清楚。现在Marshal.SizeOf()将返回24,插入适当的填充量。 b成员应为IntPtr btw。

关于c# - 如何将C结构从dll转换为C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4587793/

10-12 23:19