Was ist der Unterschied zwischen den Strukturen vs uint enthält Bool wenn PInvoke verwenden?
Frage
Ok, ich bin jetzt sehr verwirrt. Nach meiner letzten Frage hatte mehrere Leute Kommentar über Bool Wechsel in uint ich überprüft sie die gleiche Größe von:
Console.WriteLine("sizeof bool = {0}", Marshal.SizeOf(typeof(bool)));
Console.WriteLine("sizeof uint = {0}", Marshal.SizeOf(typeof(uint)));
Welche natürlich druckt:
sizeof bool = 4
sizeof uint = 4
Das heißt, ich dann brach und gab ihre Vorschläge einen Versuch sowieso ... eine einzige Bool innerhalb einer Struktur zu einem uint ändern. Was ich kann nicht für das Leben von mir herauszufinden, warum diese es geschafft arbeiten ...
So funktioniert das:
[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;
}
Wenn in dieser Struktur verwendet:
[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
[FieldOffset(0)] public short EventType;
[FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
}
Aber in dieser Struktur bricht es:
[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;
}
Doch wenn ich Bool bKeyDown ändern in der KEY_EVENT_RECORD
Struktur in uint es wieder zu arbeiten beginnt ...
Kann jemand bitte dieses Verhalten erklären?
Ich möchte wirklich, warum es wissen, so dass ich diese nicht dokumentierte Funktion vermeiden kann (auch bekannt als Fehler) in die Zukunft.
Lösung 3
Frage mit einer neuen Probe umformuliert:
Boolean Rangieren mit Layoutkind. explizite Ist das gebrochene oder so entworfen versagt?
Andere Tipps
Versuchen Sie, den Feldtyp das Attribut in bool und fügen Sie [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;
}
Docs für MarshalAsAttribute Docs für UnmanagedType
bools sind 1 Byte -> sizeof (C # -Referenz)
Auch finden Sie unter Standardmarshalling für Boolesche Typen