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 ] 

0 ответов

Другие вопросы по тегам