Как интересно, поскольку у вас уже есть ответ, основная проблема здесь заключается в том, что структура просто должна быть правильного размера. Поскольку управляемые типы не имеют встроенных массивов, вам просто нужно освободить место, которое в противном случае понадобилось бы. Когда вы пишете в C ++ / CLI, вы часто видите StructLayoutAttribute с явным параметром Size. Это заставляет среду выполнения выделять правильный объем памяти для типа, что позволяет ему быть прозрачным для собственной стороны. Отсюда следует, что они также должны работать:
[StructLayout(LayoutKind.Sequential, Size=24)]
public struct T_SAMPLE_STRUCT
{
public int num;
// to get the string here, you'd need to get a pointer
public char firstChar;
}
// or
[StructLayout(LayoutKind.Sequential)]
public struct T_SAMPLE_STRUCT
{
public int num;
public byte c0;
public byte c1;
public byte c2;
public byte c3;
public byte c4;
public byte c5;
public byte c6;
public byte c7;
public byte c8;
public byte c9;
public byte c10;
public byte c11;
public byte c12;
public byte c13;
public byte c14;
public byte c15;
public byte c16;
public byte c17;
public byte c18;
public byte c19;
}
Конечно, их гораздо сложнее использовать из управляемого кода (вам необходимо скопировать память или использовать указатели), но они иллюстрируют концепцию типа blittable, которая в основном заключается в том, как типы передаются между собственным и управляемым кодом ,