gpt4 book ai didi

c# - 仅在 IDE 之外的 Release模式下 x64 .NET 4.0 应用程序崩溃

转载 作者:可可西里 更新时间:2023-11-01 09:12:04 26 4
gpt4 key购买 nike

所以,我的小测试应用程序遇到了一个非常奇怪的问题。就问题而言,我的意思是它崩溃了……很难。没有异常(至少,没有我能捕捉到的)被抛出,只是“Blah Blah 已经停止响应......”消息。它当我在 x64、 Release模式和 IDE 之外 运行应用程序时崩溃。如果我在 x86 模式下运行它,或者如果我在 x64 的 IDE 中运行它,或者我在 x64 中作为 DEBUG 独立运行它,它工作正常。

我已将其缩小到我的 p/invoke PeekMessage 调用。所以,我需要这里的聪明才智来查看我写的废话,并告诉我我做的是否正确。因为,说真的,我他妈的快要失去理智了。我在两台计算机上试过这个,它们都表现出相同的行为。我有点担心这可能是 .NET 4.0 错误。

无论如何,这是我的 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(注意:抑制安全属性在类定义中,因此它被应用):

[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);

这是消息:

[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

因此,如果您发现任何不太正确的地方,请告诉我。我不希望这不是我的错。

抱歉,如果不够详细,如果您需要更多信息,请留言。

最佳答案

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

如果你看一下Windows Data Types你可以看到:

  • LPARAM 是一个 LONG_PTR,即它在 32 位平台上的大小为 32 位,在 64 位平台上的大小为 64 位。
  • PARAM 是一个 UINT_PTR,在 32 位平台上也是 32 位大小,在 64 位平台上是 64 位大小。

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

关于c# - 仅在 IDE 之外的 Release模式下 x64 .NET 4.0 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8122874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com