クイズ:次のプログラムは何を印刷しますか?StructLayout Pack = 1はboolで機能しませんか?
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication2 {
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Struct1 {
bool b;
int i;
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Struct2 {
byte b;
int i;
}
class Program {
static void Main(string[] args) {
Console.WriteLine(Marshal.SizeOf(typeof(Struct1)));
Console.WriteLine(Marshal.SizeOf(typeof(Struct2)));
Console.ReadKey();
}
}
}
回答:
8
5
これは私にとって非常に紛らわしいです。 boolとbyteの両方が1バイトのサイズを持ち、[StructLayout(LayoutKind.Sequential, Pack=1)]
を指定すると、パディングの問題を無効にする必要があります。両方の構造体は5バイトでなければなりません。だから私は2つの質問があります:
- マーシャルはなぜこのように動作しますか?
- 回避策はありますか?私はインポートする必要があるネイティブ構造体に1バイトのブール値を持っています。私はバイトの代わりにもちろん使用することができますが、それは "乱雑"です。
ありがとうございます。
これは驚異的なMicrosoft-ismです:boolはCとC++では1バイトです。マイクロソフト固有のtypedefにマーシャリングすることは決してなかったでしょう。 – Asik
ブール値はCの整数(少なくともC99以前)です。 C++だけがネイティブ 'bool'型を持っています。ブール値としてint型を使用するインターオペラビリティについては、より一般的です。 – SztupY