2008年12月12日金曜日

bool型のマーシャリングのワナ

マネージコードでのbool(=System.Boolean)型の中身は
4バイトの整数(false=0, true=o以外)で、
慨定のマーシャリングの動作では4バイト整数としてアンマネージコードに渡される。

が、

OpenGLでのGLBoolean型は、調べてみると、
「1バイト符号無し整数」。
つまり、マーシャリング時に型の不一致が起こってバグる。
解決方法は、

(1)
[MarshalAs( UnmanagedType.U1 )] という属性を付加して、
boolが1バイト符号付き整数(true=1, false=0)に変換されるように指定する。

(2)
bool型の代わりにbyte型を使い、
true = 1, false = 0へ置き換える。

・・・のはずなんだけど、
(1)の方法で、bool[]型に、
[MarshalAs( UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1 )]
という属性をつけてやってみたら、
どうもうまくいかない。
ArraySubType = UnmanagedType.U1でもダメだった。
1バイト整数に変換されず、4バイトのままアンマネージコードに渡されてるっぽい。
(2)の方法でbool[]の代わりにbyte[]を使うとうまくいく。
なんか属性の指定方法が間違ってるのだろうか?

0 件のコメント: