У меня возникли проблемы с маршалингом указателя на массив строк. Это выглядит безобидно, как это:
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
Это на самом деле встроено в другую структуру, подобную этой:
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
Неуправляемый код возвращает обратно в управляемый код и возвращает Outerstruct в виде IntPtr с выделенной памятью и заполненными значениями.
Управляемый мир:
[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!
}
Если я изменю listOfStrings на просто IntPtr, тогда Marshal.PtrToStructure работает, но теперь я не могу скопировать в listOfStrings и извлечь строки одну за другой.