Qual é a diferença entre as estruturas que contêm bool vs uint ao usar PInvoke?
Pergunta
Ok, agora estou muito confuso. Depois da minha última pergunta tinha várias pessoas comentário sobre a mudança bool para uint verifiquei que eles são do mesmo tamanho por:
Console.WriteLine("sizeof bool = {0}", Marshal.SizeOf(typeof(bool)));
Console.WriteLine("sizeof uint = {0}", Marshal.SizeOf(typeof(uint)));
Qual das impressões do curso:
sizeof bool = 4
sizeof uint = 4
Dito isso, eu, em seguida, quebrou e deu suas sugestões uma tentativa de qualquer maneira ... Mudando um único bool dentro de uma estrutura para um uint. O que eu não consigo descobrir para a vida de mim é porque este fez o trabalho ...
Então, isso 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;
}
Quando usado desta estrutura:
[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
[FieldOffset(0)] public short EventType;
[FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
}
Mas nesta estrutura de quebra:
[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;
}
No entanto, quando eu mudar bool bKeyDown para uint na estrutura KEY_EVENT_RECORD
ele começa a trabalhar de novo ...
Alguém pode explicar esse comportamento?
Eu realmente gostaria de saber o porquê dele para que eu possa evitar este recurso não documentado (aka bug) no futuro.
Solução 3
Pergunta reformulado com uma nova amostra:
booleana Marshalling com LayoutKind. explícita, é esta quebrado ou não como projetado?
Outras dicas
Tente configurar o tipo de campo para bool e adicionar o 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;
}
MarshalAsAttribute Docs para UnmanagedType
bools são 1byte -> sizeof (C # Referência)
Além disso, veja Padrão Marshaling para tipos booleanos