2013-03-26 68 views
11

我花了很多时间来寻找解决方案,但仍然没有找到答案。Marshall数组结构

我有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)。我做错了什么吗?

+0

什么非托管的结构是什么样子? – 2013-03-26 08:47:10

+0

你是指用C/C++代码编写的结构体吗? – 2013-03-26 08:48:40

+0

@TuTran是的,还有pinvoke函数声明 – 2013-03-26 08:55:18

回答

11

改变你的类结构

[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 
+0

是的,它的工作原理。只是将类Result更改为仅结构。 – 2013-03-26 09:06:29