0

まず第一に、私には多くの回避策があるので、私は立ち往生していません!! 最高なのは、もう 1Byte Pack が必要ないことです :P

しかし、正直なところ、私はその行動についてかなり困惑しています。Unity を使用しています。Windows では問題なく動作しますが、Android (mono) では失敗しました。

  • 無効なものを書いたことがありますか?
  • 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) に由来します。

  • [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 ] 
4

0 に答える 0