Ich habe Probleme, einen Zeiger auf ein Array von Strings Marshalling. Es sieht harmlos wie folgt aus:Marshalling-Zeiger auf ein Array von Strings
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
Dies ist eigentlich in einer anderen Struktur wie folgt eingebettet:
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
Unmanaged Code ruft zurück in verwaltetem Code und gibt Outerstruct als IntPtr mit Speicher zugeordnet und gefüllt Werte in .
Managed Welt:
[StructLayout(LayoutKind.Sequential)]
public struct UnmanagedStruct
{
[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr, SizeConst=100)]
public string[] listOfStrings;
}
[StructLayout(LayoutKind.Sequential)]
public struct Outerstruct
{
public UnmanagedStruct ums;
}
public void CallbackFromUnmanagedLayer(IntPtr outerStruct)
{
Outerstruct os = Marshal.PtrToStructure(outerStruct, typeof(Outerstruct));
// The above line FAILS! it throws an exception complaining it cannot marshal listOfStrings field in the inner struct and that its managed representation is incorrect!
}
Wenn ich listOfStrings so ändere, dass es einfach ein IntPtr ist, dann funktioniert Marshal.PtrToStructure, aber jetzt kann ich nicht in listOfStrings rippen und die Strings einzeln extrahieren.
ByValArray == In-Place-Array, LPArray == Ein Zeiger auf ein Array. Obwohl SizeConst immer noch mit einem LPArray arbeiten sollte, war der Fehler beim Marshalling ein wenig seltsam. –
Oh, das sollte auch funktionieren, wenn Sie öffentliche string [] listOfStrings haben, es ist der ByValArray, der den Unterschied macht, glaube ich. –