В чем разница между структурами, содержащими bool и uint, при использовании PInvoke?
Вопрос
Хорошо, я сейчас очень растерялся. После моего последнего вопроса несколько человек прокомментировали изменение bool на uint. Я подтвердил, что они имеют одинаковый размер:
Console.WriteLine("sizeof bool = {0}", Marshal.SizeOf(typeof(bool)));
Console.WriteLine("sizeof uint = {0}", Marshal.SizeOf(typeof(uint)));
Который, конечно, печатает:
sizeof bool = 4
sizeof uint = 4
Тем не менее, я потом сломался и все равно попробовал их предложения ... Заменив единственное значение bool внутри структуры на uint. То, что я не могу понять, для моей жизни, почему это заставило это работать ...
Так что это работает:
[StructLayout(LayoutKind.Sequential)]
public struct KEY_EVENT_RECORD
{
public bool bKeyDown;
public short wRepeatCount;
public short wVirtualKeyCode;
public short wVirtualScanCode;
public char UnicodeChar;
public int dwControlKeyState;
}
При использовании в этой структуре:
[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
[FieldOffset(0)] public short EventType;
[FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
}
Но в этой структуре он ломается:
[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
[FieldOffset(0)] public short EventType;
[FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
[FieldOffset(4)] public MOUSE_EVENT_RECORD MouseEvent;
[FieldOffset(4)] public WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
[FieldOffset(4)] public MENU_EVENT_RECORD MenuEvent;
[FieldOffset(4)] public FOCUS_EVENT_RECORD FocusEvent;
}
Тем не менее, когда я изменяю bool bKeyDown на uint в структуре KEY_EVENT_RECORD
, он снова начинает работать ...
Может ли кто-нибудь объяснить это поведение?
Мне бы очень хотелось узнать причину этого, чтобы в будущем я смог избежать этой недокументированной функции (иначе ошибка).
Решение 3
Вопрос переписан с новым образцом:
Логический маршаллинг с LayoutKind. Явный, это сломано или терпит неудачу как разработано?
Другие советы
Попробуйте установить тип поля bool и добавьте атрибут [MarshalAs (UnmanagedType.Bool)].
[StructLayout(LayoutKind.Sequential)]
public struct KEY_EVENT_RECORD
{
[MarshalAs(UnmanagedType.Bool)]
public bool bKeyDown;
public short wRepeatCount;
public short wVirtualKeyCode;
public short wVirtualScanCode;
public char UnicodeChar;
public int dwControlKeyState;
}
Документы для MarshalAsAttribute Документы для UnmanagedType
bools имеют размер 1 байт - > sizeof (справочник по C #)