我有一个第三方导出函数和三个大小相同、成员数量相同但成员类型不同的结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1, Size = 34)]
public struct StructA
{
public Int32 id;
public Int16 year;
public Char month;
public Char day;
// and 12 more Char members
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1, Size = 34)]
public struct StructB
{
public Int32 id;
public Int16 year;
public Byte month;
public Byte day;
// and 12 more Byte members
public Int64 padding1;
public Int32 padding2;
public Int16 padding3;
// padding fields supply the 14 bytes left of the total size (34)
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1, Size = 34)]
public struct StructC
{
public Int32 id;
public Int16 year;
public Int16 month;
public Int16 day;
// and 12 more Int16 members
}
private static extern Int32 foo_nction(ref struct structure);
我希望 StructA 和 StructC 具有相同的结果,因为它们具有相同数量的相同顺序的参数,并且每个参数对应的不是类型而是大小,但最相似的结果是在 StructA 和 StructB 之间,尽管它们的类型不相等尺寸。
事实是:
当我将 StructA 作为参数传递给 3rd-party 函数时,一切正常。
当我将 StructB 作为参数传递时,它的成员会得到预期值,但会被截断,因为 Char 的物理字节为 2,而 Byte 的物理字节为 1(正如我们友好的论坛朋友所说)。
当我将 StructC 作为参数传递时,来自第 3 方函数的值会融化,就好像一个 Int16 类型的值可以存储两个 Char 类型的值一样。例如,当我将 StructA 作为参数传递时,我收到形成“2013-5-27”的日期数据,当我传递 StructB 时,我收到形成“2013-6917-2”的日期数据
谁能解释这种行为的原因?