¿Cuál es la diferencia entre las estructuras que contienen bool vs uint cuando se usa PInvoke?
Pregunta
Ok, ahora estoy muy confundido. Después de mi última pregunta varias personas comentaron sobre cambiar bool a uint, verifiqué que son del mismo tamaño:
Console.WriteLine("sizeof bool = {0}", Marshal.SizeOf(typeof(bool)));
Console.WriteLine("sizeof uint = {0}", Marshal.SizeOf(typeof(uint)));
Que por supuesto imprime:
sizeof bool = 4
sizeof uint = 4
Dicho esto, luego me rompí y probé sus sugerencias de todos modos ... Cambiando un solo bool dentro de una estructura a un uint. Lo que no puedo entender por mi vida es por qué esto lo hizo funcionar ...
Entonces esto funciona:
[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;
}
Cuando se usa en esta estructura:
[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
[FieldOffset(0)] public short EventType;
[FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
}
Pero en esta estructura se rompe:
[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;
}
Sin embargo, cuando cambio bool bKeyDown a uint en la estructura KEY_EVENT_RECORD
, comienza a funcionar de nuevo ...
¿Puede alguien explicar este comportamiento?
Realmente me gustaría saber el por qué para poder evitar esta característica no documentada (también conocida como error) en el futuro.
Solución 3
Pregunta reformulada con una nueva muestra:
Boolean Marshalling with LayoutKind. Explícito, ¿está roto o falla como está diseñado?
Otros consejos
Intente configurar el tipo de campo en bool y agregue el atributo [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;
}
Documentos para MarshalAsAttribute Los documentos para UnmanagedType
los bools son 1 byte - > sizeof (C # Reference)
También, consulte Ajuste de referencias predeterminado para tipos booleanos