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
Schau Dir mal Interop: Common Issues and Debugging Techniques an. Wahrscheinlich musst Du wirklich manuall jedes Feld umwandeln.