0

我有一个第三方导出函数和三个大小相同、成员数量相同但成员类型不同的结构:

[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”的日期数据

谁能解释这种行为的原因?

4

1 回答 1

3

更新:

抱歉,我没有为测试构建示例。我建议看看这个答案:

从 C# 调用 C++ 函数,具有大量复杂的输入和输出参数

这个问题的其他答案也很好,有更多的解释。

我认为重点是您对 [编组] 感到困惑。您的数据,无论是结构还是数组都没有直接传递给 C++ 端,而是按原样封送,也就是说,它被复制到固定内存中,然后传递给 C++ 代码。CharSet不是用来决定数据的物理长度,而是如何解释字符。


的物理字节Char为两个;但是byte是一个。您的数据可能会被截断。

看看charbyte

于 2013-05-25T17:42:22.743 回答