只能在IDE之外的发布模式下使用x64 . net 4.0应用程序崩溃

本文关键字:x64 net 崩溃 应用程序 模式 IDE 布模式 | 更新日期: 2023-09-27 18:14:24

所以,我的小测试应用程序遇到了一个非常奇怪的问题。我说的问题是指它崩溃了……困难的。没有抛出任何异常(至少,我没有捕捉到任何异常),只有"Blah Blah已经停止响应…"消息。当我在x64,发布模式和IDE外运行应用程序时,它崩溃。如果我在x86模式下运行它,或者如果我在x64的IDE中运行它,或者我在x64中作为DEBUG单独运行它,它工作得很好。

我已经把它缩小到我的p/invoke PeekMessage调用。所以,我需要在座的天才来看看我写的这些垃圾然后告诉我我写得对不对。因为,说真的,我快要疯掉了。我在两台电脑上尝试过,它们都表现出相同的行为。我有点担心这可能是。net 4.0的bug。

不管怎样,这是我的p/invoke代码。如果你看到任何奇怪或愚蠢的事情,请告诉我:

下面是对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

所以,如果你看到任何不太对的地方,请告诉我。我希望这不是我的错。

如果不够详细,请给我留言。

只能在IDE之外的发布模式下使用x64 . net 4.0应用程序崩溃

MSGlParamwParam字段大小错误。您应该使用IntPtr而不是uint/int

如果你看一下Windows数据类型,你可以看到:

  • LPARAMLONG_PTR,即32位平台的32位大小和64位平台的64位大小。
  • PARAM是一个UINT_PTR,在32位平台上是32位,在64位平台上是64位。

相反,intuint类型的大小都是32位,无论平台,这意味着在64位平台上,您的MSG结构太小64位,这将导致某种类型的内存损坏。