c# -将类似结构的行为转换为第三方函数

本文关键字:转换 第三方 函数 结构 | 更新日期: 2023-09-27 18:15:14

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

[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作为参数传递给第三方函数时,一切都很完美。

当我传递StructB作为参数时,它的成员得到预期的值,但被截断,因为Char的物理字节是两个,而Byte的物理字节是一个(正如我们友好的论坛朋友所说)。

当我传递StructC作为参数时,来自第三方函数的值就融化了,好像一个int16类型的值可以存储两个char类型的值。例如,当我传递StructA作为参数时,我接收到形成"2013-5-27"的日期数据,当我传递StructB时,我接收到形成"2013-6917-2"的日期数据

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

c# -将类似结构的行为转换为第三方函数

更新:

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

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

和该问题的其他答案也很好,需要更多的解释。

我认为关键是你把[封送]搞混了。您的数据,无论是结构还是数组都没有直接传递到c++端,而是将封送为,也就是说,它被复制到固定内存中,然后传递给c++代码。CharSet不是用来决定数据的物理长度,而是用来决定如何解释字符。


Char的物理字节数为2;但byte是其中之一。您的数据可能会被截断。

看一下char和byte。