问题 马歇尔阵列的结构


我花了很多时间来寻找解决方案,但仍然没有找到它。

我有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;
}

我期望这个命令 Marshal.SizeOf(typeof(CoverObject)) 将返回52,但不是,它只是20.因此,我后来使用的所有马歇尔和解组都不起作用。

看起来它只计算Result类中的第一个成员(Number)。我做错了什么吗?


3375
2018-03-26 08:42


起源

你的非托管结构是什么样的? - Matthew Watson
你的意思是用C / C ++代码编写的结构吗? - Tu Tran
@TuTran是的,还有pinvoke函数声明 - David Heffernan
@DavidHeffernan:谢谢!我找到了解决方案。 - Tu Tran


答案:


将您的类更改为结构

[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

11
2018-03-26 08:53



是的,它有效。只需将类Result更改为struct。 - Tu Tran