Pinvoke를 사용할 때 Bool과 UINT를 포함하는 구조의 차이점은 무엇입니까?
문제
좋아, 나는 이제 매우 혼란스러워. 마지막 질문 후 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
즉, 나는 파열되어 어쨌든 그들의 제안을 시도했다. 내가 내 삶을 위해 알아낼 수없는 것은 이것이 왜 작동하게 만든 이유입니다 ...
그래서 이것은 작동합니다 :
[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
새로운 샘플과 함께 질문 :
다른 팁
필드 유형을 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;
}
문서 마샬라 스트리트문서 UnmanagedType
부울은 1 비트 ->입니다 크기 (C# 참조)
또한 참조하십시오 부울 유형의 기본 마샬링
제휴하지 않습니다 StackOverflow