2013-03-26 11 views
11

Spędziłem dużo czasu, szukając rozwiązania, ale wciąż go nie znajduję.Szereg struktur Marshalla

Mam 2 klasy:

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

moje oczekiwanie, że polecenie Marshal.SizeOf(typeof(CoverObject)) powróci 52, ale nie, to tylko 20. Tak więc, wszystkie Marshall i wycofać że używam później nie działają.

Wygląda na to, że liczy tylko pierwszy element (Number) w klasie Result. Czy robię coś źle?

+0

Co twoi niezarządzani elemencie wyglądać? –

+0

Masz na myśli struct napisany w C/C++? –

+0

@TuTran Tak, a także deklaracje funkcji pinvoke –

Odpowiedz

11

zmienić swoje zajęcia na elemencie

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

gdzie indziej:

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

Tak, to działa. Wystarczy zmienić klasę Wynik tylko na strukturę. –