まず第一に、私には多くの回避策があるので、私は立ち往生していません!! 最高なのは、もう 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 ]