Mam pewne problemy marshaling wskaźnik do tablicy ciągów. Wygląda nieszkodliwe tak:Marshaling wskaźnik do tablicy ciągów
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
to faktycznie osadzony wewnątrz innej struktury tak:
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
kod niezarządzalny oddzwania do kodu zarządzanego i zwraca Outerstruct jako IntPtr z pamięci przydzielonej i wartości wypełnione .
Zarządzane świat:
[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!
}
Jeśli zmienię listOfStrings po prostu jako IntPtr, to Marshal.PtrToStructure działa, ale teraz nie mogę zgrać listOfStrings i wyodrębnić ciągi jeden po drugim.
ByValArray == lokalna tablica, LPArray == wskaźnik do tablicy. Chociaż SizeConst nadal powinien działać z LPArray, więc błąd podczas marszałkowania był trochę dziwny. –
Och, to powinno również działać, jeśli masz publiczne string [] listOfStrings, czyli jego ByValArray, który robi różnicę, w którą wierzę. –