Laden...

Marshal Struct array in IntPtr: NotSupportedException

Erstellt von ManuelSchmutz vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.231 Views
M
ManuelSchmutz Themenstarter:in
32 Beiträge seit 2013
vor 10 Jahren
Marshal Struct array in IntPtr: NotSupportedException

Hallo!

Ich versuche ein managed Struct Array in einen IntPtr umzuwandlen.

Struct:


[StructLayout(LayoutKind.Sequential)]
        public struct KeyValue
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public string key;	/* required element of type xsd:string */
            public uint readOnly;	/* required element of type xsd:boolean */
            [MarshalAs(UnmanagedType.LPStr)]
            public string value;	/* optional element of type xsd:string */
        };

Funktion:


public static IntPtr GetIntPtrFromStructArray<T>(T[] array) where T : new()
        {
            int arrayLen = array.Length;
            int structSize = Marshal.SizeOf(typeof(T));
            IntPtr ptr = Marshal.AllocCoTaskMem(arrayLen * structSize);
            for (int i = 0; i < arrayLen; i++)
                Marshal.StructureToPtr(array[i], (IntPtr)(ptr.ToInt32() + i * structSize), false);
            return ptr;
        }

Fktaufruf:


gSoapServiceTypes.GetIntPtrFromStructArray<gSoapServiceTypes.KeyValue>(keyValue)

Meine Anwendung läuft unter WindowsCE mit .Net Compact Framework 3.5.
Das Problem, das ich habe ist, dass beim Ausführen der Funktionen Marshal.SizeOf(typeof(T) und Marshal.StructureToPtr(array_, (IntPtr)(ptr.ToInt32() + i * structSize), false) ich eine System.NotSupportedException bekomme. Das komische ist versuche ich ein anderes Struct z.b.


[StructLayout(LayoutKind.Sequential)]
        public struct ChangeAvailability
        {
            public uint connectorId;
            public uint type;
        };

umzuwandlen gibts keine Probleme.
Ich denke daher dass irgendwas mit dem struct KeyValue bzw. [MarshalAs(UnmanagedType.LPStr)] nicht stimmt.

Unter normalen Windows Desktop .Net Framework 3.5 gibts bei selbigem Aufruf kein Problem.

Hat damit jemand Erfahrung unter WinCE .NetCF 3.5 oder weiß warum das so ist?
Bitte um Hilfe bzw. Lösungsansätze.

LG

W
872 Beiträge seit 2005
vor 10 Jahren

Schau Dir mal Interop: Common Issues and Debugging Techniques an. Wahrscheinlich musst Du wirklich manuall jedes Feld umwandeln.