Autor Beitrag
Codeexplorer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Di 28.08.07 15:16 
Hallo ! :lol:

Ich möchte zur Laufzeit den Speicherplatzbedarf von etwas größeren struct -Typen bestimmen.
Bei einfachen Strukturen wie:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
  public struct Data
    {
        public int int1;
        public int int2;
        public int int3;

    }

hat es einfach mit:
ausblenden C#-Quelltext
1:
 int size = Marshal.SizeOf(typeof(Data));					

funktioniert. Leider bekomme ich keine vernünfigen Werte mehr, wenn ich ein Array einbette.
Also etwa so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
   [StructLayout(LayoutKind.Sequential, Pack = 4, Size=20)]
    public struct Data
    {
        public int int1;
        public int int2;
        [MarshalAs(UnmanagedType.ByValArray,
            ArraySubType = UnmanagedType.SysInt,
            SizeConst = 12)]
        public int[] int3;
        public Data(int arrSize)
        {
            int1 = 0;
            int2 = 0;
            int3 = new int[arrSize];
        }
    }

    ...
    Data data= new Data(3);
    int size = Marshal.SizeOf(data);

SizeOf liefert einen Wert von 56 aber ich hätte 20 erwartet. Weiß jemand Rat ?
Grüße
Oliver
PS: [StructLayout(LayoutKind.Explicit, Pack = 1)] habe ich auch schon ausprobiert, leider ohne Erfolg.
Codeexplorer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Di 28.08.07 15:29 
o.k., o.k. war ein kleiner Denkfehler. Die angegebene Größe
im Attribut wird nicht in byte sondern in Anzahl der
Array-Elemente angegeben.
Es muss also heißen:
ausblenden C#-Quelltext
1:
2:
3:
      [MarshalAs(UnmanagedType.ByValArray,
            ArraySubType = UnmanagedType.SysInt,
            SizeConst = 3)]