C# Marshal.Structure

Gast #2193774
Lesenswert?

Hallo Forum,
ich habe eine Klasse wo ich eine Struktur angelegt habe.
Nun möchte ich mit Marshal.Struture  den Inhalt der Struktur in ein byte 
Array kopieren aber es will mir einfach nicht gelingen! Bitte kann mir 
jemand ein kleines Beispiel machen?


Vielen Dank und Schönen Sonntag
D d ad S s
#2193937
Lesenswert?

der der auf dem Schlauch steht schrieb:
>
1
> public struct Point
2
> {
3
>     public int x;
4
>     public int y;
5
>     public double  d;
6
>     public string sepp;
7
> }
8
>
>
> die Structur sieht so aus
>
>
> Vielen Dank und Schönen Sonntag
> D d ad S s
1
        [StructLayout(LayoutKind.Sequential)]
2
        public struct Point {
3
            //[MarshalAs(UnmanagedType.I4)] auskommentiert, da dies die Defaults sind
4
            public int x;
5
            //[MarshalAs(UnmanagedType.I4)]
6
            public int y;
7
            //[MarshalAs(UnmanagedType.R8)]
8
            public double d;
9
            //[MarshalAs(UnmanagedType.LPStr)]
10
            public string sepp;
11
        }
12
        Point point1 = new Point() { x = 1234, y = 2345, d = 3.456, sepp = "45678" };
13
        int structLen = Marshal.SizeOf(point1);
14
        IntPtr ptr = Marshal.AllocHGlobal(structLen);
15
 
16
       byte[] dest = new byte[structLen];
17

18
        Marshal.StructureToPtr(point1, ptr, false);
19
        Marshal.Copy(ptr, dest, 0, structLen);
20
        Marshal.FreeHGlobal(ptr);
21
        
22
       // oder Elementweise mit BitConverter.GetBytes...
#2194094
Lesenswert?

der der auf dem Schlauch steht schrieb:
> Vielen Dank für deine Hilfe.
> Ist diese Vorgens weise sinnvoll oder hat das Marshalen Nachteile?

Kommt drauf an warum das gemacht wird...
Eins ist auf jeden Fall sicher: Es kostet Zeit und Speicher.
Geht es z.B. nur um das serialisieren von Daten, um diese zu speichern, 
gibt es einfachere und schnellere Möglichkeiten
z.B. http://www.codeproject.com/KB/IP/fastJSON.aspx
Gast #2195633
Lesenswert?

Hallo Profis,
habe versucht mit Marshal.PtrToStructure das Array tt in die Stuctur zu 
schreiben aber ich mach noch was falsch denn die werte in der Structure 
bleiben gleich.
Kann mir jemand auf die Sprünge helfen

Gruß und Danke
1
arraytest.Point point1 = new arraytest.Point(); 
2
                point1.x = 5;
3
                point1.y = 0xff;
4
                point1.d = 55;
5
                int structLen = Marshal.SizeOf(point1);
6
                IntPtr ptr = Marshal.AllocHGlobal(structLen);
7

8
                byte[] dest = new byte[structLen];
9
                byte[]tt = new  byte [structLen ];
10
                tt[0] = 4;
11
                tt[1] = 0xff;
12

13
                tt[2] = 77;
14
                tt[3] = 88;
15
                Marshal.StructureToPtr(point1, ptr, false);
16
                Marshal.Copy(ptr, dest, 0, structLen);
17
                IntPtr Pointer = Marshal.AllocHGlobal(structLen);
18
                //Marshal.Copy(tt, 0, Pointer, tt.Length);
19
                Marshal.PtrToStructure(Pointer,typeof(Point));
20
                Marshal.FreeHGlobal(ptr);
#2197993
Lesenswert?

Mit etwas mehr Kommentaren
1
            Point point1 = new Point() { x = 1234, y = 2345, d = 3.456, sepp = "45678" };
2
            int structLen = Marshal.SizeOf(point1);
3
            byte[] dest = new byte[structLen];
4

5
            // ptr zeigt auf den mit Alloc... reservierten Speicher
6
            IntPtr ptr = Marshal.AllocHGlobal(structLen);
7
            // StructureToPtr copiert den Inhalt von point1 in den Speicher auf den ptr zeigt
8
            Marshal.StructureToPtr(point1, ptr, false);
9
            // Copy kopiert das dann in das Array dest
10
            Marshal.Copy(ptr, dest, 0, structLen);
11
            // tt ist das kopierte Array dest
12
            byte[] tt = dest;
13
            // zum Test eine Änderung
14
            tt[1] = 0xff;
15
            // den Inhalt von tt in den mit Alloc...reservierten Speicher zurück kopieren
16
            Marshal.Copy(tt, 0, ptr, structLen);
17
            // und mit PtrToStructure in eine neue Struct packen
18
            Point point2 = (Point)Marshal.PtrToStructure(ptr, typeof(Point));

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren