下面是我试图从c ++转换为c#
的代码struct PSB {
short type_of_psb;
short call_dependent;
int32 del_psb_status;
uint32 seq_number[2];
int32 uma_psb_status;
short psb_reserved[6];
}
以前,我写过以下结构。
[StructLayout(LayoutKind.Explicit)]
public struct PSB
{
[FieldOffset(0)]
public short type_of_psb;
[FieldOffset(2)]
public short call_dependent;
[FieldOffset(4)]
public int del_psb_status;
[FieldOffset(8)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public uint32 seq_number; // Here is the problem
[FieldOffset(16)]
public int uma_psb_status;
[FieldOffset(20)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public short[] psb_reserved;
}
但是上面的c#代码不起作用,问题在于成员 seq_number
所以我把它改成了
来自public ulong seq_number
的 uint seq_number
,我删除了上面的marshalas属性。
现在它正在使用遗留代码。我不知道为什么?如果我将其定义为数组,会出现什么问题?
答案 0 :(得分:1)
您的C ++结构和MarshalAs
属性都将类型列为数组,但您的C#结构只声明了一个数字。我不确定你到底发生了什么错误,但看起来你试图将两个数字的数组转换成一个数字,这显然会引起一些问题。
尝试将MarshalAs
属性保留在已发布的结构中,只需将public uint32 seq_number;
替换为public uint32[] seq_number;
。