Я хочу прочитать нативную структуру в тип C #, используя Marshalling. Мой метод к структурам маршала такой:
T ReadObject<T>(BinaryReader br) {
var bytes = br.ReadBytes(Marshal.SizeOf(typeof(T)));
var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
try {
return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
}
finally {
handle.Free();
}
}
Теперь это работает нормально, проблема возникает со следующим типом:
[StructLayout(LayoutKind.Sequential, Pack=1)]
class SubData {
public short A1;
public short A2;
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
class Data {
public short Id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
public SubData[] SubDatas;
}
Обратите внимание, что это прекрасно работает, если SubData является структурой ! Но если SubData является классом, он заставляет Marshal.PtrToStructure выдавать FatalExecutionEngineError. Я хотел бы придерживаться классов, потому что иногда мои типы имеют значения по умолчанию, а структуры не могут иметь инициализаторы полей или конструкторы по умолчанию, а также некоторые из этих типов довольно велики.
Спасибо за помощь.
Редактировать: сообщение об ошибке: «Во время выполнения обнаружена фатальная ошибка. Адрес ошибки был 0x6af99aec, в потоке 0x348. Код ошибки: 0xc0000005. Эта ошибка может быть ошибкой в CLR или в небезопасном или не поддающиеся проверке части пользовательского кода. Общие источники этой ошибки включают ошибки пользовательского маршалинга для COM-взаимодействия или PInvoke, которые могут повредить стек. "