2013-03-26 18 views
11

Ich habe viel Zeit verbracht, um nach der Lösung zu suchen, aber immer noch nicht herausfinden.Marshall Array von Strukturen

Ich habe 2 Klassen:

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

Meine Erwartung, dass der Befehl Marshal.SizeOf(typeof(CoverObject)) 52 zurückkehren wird, aber nicht, es ist nur 20. Somit sind alle marshall und entordnen, dass ich später verwenden funktionieren nicht.

Scheinbar zählt nur das erste Mitglied (Number) in der Result-Klasse. Habe ich etwas falsch gemacht?

+0

Was Ihr nicht verwalteten structs aussehen? –

+0

Meinst du struct in C/C++ Code geschrieben? –

+0

@TuTran Ja, und auch die pinvoke Funktionserklärungen –

Antwort

11

Klassen

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

einige, wo man sonst Structs ändern:

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

Ja, es funktioniert. Ändere nur die Klasse Result zu struct only. –