При выполнении P/Invoke важно сопоставить макет данных.
Мы можем управлять компоновкой структуры, используя некоторый атрибут.
Например:
struct MyStruct
{
public bool f;
}
дает размер 4. Хотя мы можем сообщить компилятору, что он должен быть 1 байт bool для соответствия типу С++ bool
:
struct MyStruct
{
[MarshalAs(UnmanagedType.I1)]
public bool f;
}
дает размер 1.
Они имеют смысл. Но когда я тестировал фиксированный массив bool, я был в замешательстве.
unsafe struct MyStruct
{
public fixed bool fs[1];
}
дает размер 4 байта. и
unsafe struct MyStruct
{
public fixed bool fs[4];
}
по-прежнему задает размер 4 байта. но
unsafe struct MyStruct
{
public fixed bool fs[5];
}
дает размер 8.
Похоже, что в фиксированном массиве bool размер элемента bool по-прежнему равен 1 байт, но выравнивание равно 4 байтам. Это не соответствует массиву bool С++, размер которого равен 1 байту и выравниванию.
Может кто-нибудь объяснить мне об этом?
Обновление: я, наконец, узнаю, причина в том, что тип bool в структуре, тогда эта структура никогда не будет blattable! Поэтому не ожидайте, что структура, которая имеет тип bool внутри, будет такой же, как в C.
С уважением, Сян.