У меня есть следующее (сокращенное) определение функции в моем коде С++:
EXPORT_API Table* OpenTableExport();
где Table — это структура вида:
typedef struct Table
{
int fCurrKey;
int fTableNo;
int fRecSize;
char fCreating;
Table* fNextTable;
Table* fPrevTable;
MyFileType fFile;
} Table;
Итак, чтобы PInvoke эту функцию из управляемого кода, я, естественно, попробовал следующее:
[DllImport("Export.dll", EntryPoint = "OpenTableExport", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern Table OpenTable();
Со следующим классом таблицы:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class Table
{
public KeyDescription fCurrKey;
public int fTableNo;
public uint fRecSize;
public byte fCreating;
public Table fNextTable;
public Table fPrevTable;
public FileDescription fFile;
}
Теперь при использовании метода я получаю следующее исключение (перевод с немецкого):
Поле «fNextTable» типа «Таблица» не может быть маршалировано, для этого типа не существует поддержки маршалинга.
Почему .NET в любом случае не может упорядочить члены fNextTable и fPrevTable того же типа, что и упорядочивающий?
Я также могу просто заменить ссылки в определении управляемого класса на IntPtr... но действительно ли это необходимо? (Тогда сортировка будет работать более или менее).