Итак, у меня очень странная проблема с моим маленьким тестовым приложением. И под проблемой я подразумеваю это вылетает ... тяжело. Никаких исключений (по крайней мере, ничего, что я мог бы уловить) не генерируется, только сообщение «Бла-бла перестал отвечать ...». Оно вылетает ТОЛЬКО , когда я запускаю приложение в x64, режим выпуска и вне IDE . Если я запускаю его в режиме x86, или если я запускаю его в среде IDE в x64, или я запускаю его отдельно как DEBUG в x64, он работает нормально.
Я сузил круг вопросов до вызова функции p / invoke PeekMessage. Итак, мне нужны блестящие умы, чтобы посмотреть на написанную мною чушь и сказать, правильно ли я это делаю. Потому что, серьезно, я собираюсь чтобы потерять свой гребаный разум. Я пробовал это на двух компьютерах, и они оба показывают одинаковое поведение. Меня немного беспокоит, что это может быть ошибка .NET 4.0.
В любом случае, вот мой p / вызвать код. Пожалуйста, дайте мне знать, если увидите что-нибудь странное или просто глупое:
Вот вызов PeekMessage:
private static bool PeekMessage()
{
MSG message = new MSG(); // Message to retrieve.
return Win32API.PeekMessage(ref message, IntPtr.Zero, 0, 0, PeekMessageFlags.NoRemove);
}
Вот PeekMessage (ПРИМЕЧАНИЕ: атрибут защиты suppress находится в определении класса, поэтому он применяется):
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("User32.dll", CharSet=CharSet.Auto)]
public static extern bool PeekMessage(ref MSG msg, IntPtr hwnd, uint wFilterMin, uint wFilterMax, PeekMessageFlags flags);
Вот MSG:
[StructLayout(LayoutKind.Sequential)]
internal struct MSG
{
/// <summary>Window handle.</summary>
public IntPtr hwnd;
/// <summary>Message to process.</summary>
public uint Message;
/// <summary>Window message parameter 1.</summary>
public uint wParam;
/// <summary>Window message parameter 2.</summary>
public uint lParam;
/// <summary>Time message was sent?</summary>
public uint time;
/// <summary>Mouse pointer position.</summary>
public Point pt;
}
И, наконец, PeekMessageFlags:
internal enum PeekMessageFlags
{
/// <summary>Keep message on the message queue.</summary>
NoRemove = 0,
/// <summary>Remove message from the queue.</summary>
Remove = 1,
/// <summary>Do not yield execution to waiting threads.</summary>
NoYield = 2
}
Я проверил журнал событий и получил следующее:
Faulting application name: Tester_Graphics.exe, version: 1.0.0.0, time stamp: 0x4ec0ba85
Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000
Exception code: 0xc0000005
Fault offset: 0x00000000000001cb
Faulting process id: 0x1260
Faulting application start time: 0x01cca299e2c21a77
Faulting application path: D:\Code\Current\Gorgon\Branches\2.x\Dorian\Examples\Tester_Graphics\bin\Release\Tester_Graphics.exe
Faulting module path: unknown
Report Id: 20ac891f-0e8d-11e1-a5d7-bcaec5753ddd
Итак, если вы видите что-то не совсем правильное, дайте мне знать. Я бы не хотел, чтобы это было не по моей вине.
Извините, если это недостаточно подробно, если вам нужна дополнительная информация, просто оставьте заметку.