14

私は解決策を探すために多くの時間を費やしましたが、それでもそれを見つけることができません。

私には2つのクラスがあります:

[StructLayout(LayoutKind.Sequential)]
public class Result
{
    public int Number;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string Name;
    public int Size;
}

[StructLayout(LayoutKind.Sequential)]
public class CoverObject
{
    public int NumOfResults;
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 4)]
    public Result[] Results;
}

コマンドが52を返すと期待していMarshal.SizeOf(typeof(CoverObject))ますが、20だけです。したがって、後で使用するマーシャルとアンマーシャルのすべてが機能していません。

Resultクラスの最初のメンバー(Number)のみをカウントしているようです。私は何か間違ったことをしましたか?

4

1 に答える 1

14

クラスを構造体に変更します

[StructLayout(LayoutKind.Sequential)]
public struct Result
{
    public int Number;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string Name;
    public int Size;
}

[StructLayout(LayoutKind.Sequential)]
public struct CoverObject
{
    public int NumOfResults;
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 4)]
    public Result[] Results;
}

何処か別の場所:

Marshal.SizeOf(typeof(CoverObject)) // it will return 52
于 2013-03-26T08:53:15.397 に答える