C# StructLayout Pack получить System.NullReferenceException, проблема выравнивания?
Прежде всего, я бы сказал, что я не застрял, потому что есть много обходных путей для меня! Лучшее из того, что мне больше не нужен пакет 1Byte:P
Но, честно говоря, я довольно озадачен поведением. Я использую Unity, он отлично работает на Windows, но не на Android(моно)
- Я написал что-то недействительное?
- У меня есть ошибка на Mono?!
Комментарии, безусловно, приветствуются!
public class TEST
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct MyStruct {
public float field1;
public float field2;
};
//This order sucess on windows, but failed on android
private byte oneByte = 0x00;
private MyStruct mMyStruct;
public bool doTest()
{
try {
mMyStruct.field1 = (oneByte++);
} catch {
// System.NullReferenceException: Object reference not set to an instance of an object
return false;
}
return true;
}
}
Некоторые дополнительные сведения / подсказки:
Различие между Android/Windows, вероятно, происходит от разницы в архитектуре процессора Android ARM(RISC), предположим, выравнивание 4Bytes (или по крайней мере 2Bytes в режиме большого пальца)
[StructLayout (LayoutKind.Sequential, Pack = 1)], похоже, влияет не только на структуру.
Выравнивание памяти, вероятно, становится:
[ onByte ] [ field1 #0 ] [ field1 #1 ] [ field1 #2 ]
[ field1 #3 ] [ field2 #1 ] [ field2 #1 ] [ field2 #3 ]
[ field2 #4 ] [ *pad* ] [ *pad* ] [ *pad* ]
Где я ожидал еще чего-то такого:
[ onByte ] [ *pad* ] [ *pad* ] [ *pad* ]
[ field1 #0 ] [ field1 #1 ] [ field1 #2 ] [ field1 #3 ]
[ field2 #1 ] [ field2 #1 ] [ field2 #3 ][ field2 #4 ]