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 байт. Итак, у меня есть два вопроса:

  • Почему ранжирование работает таким образом?
  • Есть обходной путь? У меня есть 1-байтовые логические значения в нативных структурах, которые мне нужно импортировать. Я могу использовать байт вместо этого, конечно, но это «грязно».

Спасибо.

9
задан Asik 19 March 2012 в 07:23
поделиться