2013-03-26 17 views
11

Ho passato molto tempo a cercare la soluzione ma non la trovo ancora.Marshall array of structures

ho 2 classi:

[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; 
} 

La mia aspettativa che il comando Marshal.SizeOf(typeof(CoverObject)) restituirà 52, ma non, è solo 20. Così, tutti Marshall e unmarshall che uso entro e non funzionano.

All'apparenza conta solo il primo membro (numero) nella classe Result. Ho fatto qualcosa di sbagliato?

+0

Che cosa i vostri struct non gestiti assomigliano? –

+0

Intendi struct scritto in codice C/C++? –

+0

@TuTran Sì, e anche le dichiarazioni della funzione pinvoke –

risposta

11

Cambia i tuoi classi per struct

[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; 
} 

qualche altro posto:

Marshal.SizeOf(typeof(CoverObject)) // it will return 52 
+0

Sì, funziona. Basta cambiare la classe Risultato per strutturare solo. –