C# 当.NET应用程序因System.AccessViolation异常而崩溃时,这意味着什么?

C# 当.NET应用程序因System.AccessViolation异常而崩溃时,这意味着什么?,c#,.net,forms,exception,C#,.net,Forms,Exception,应用程序本身有2000行长,因此将代码粘贴到这里是没有意义的,特别是因为收到的一个用户没有给出任何提示,说明我的代码的哪一部分导致了问题 顺便说一下,该应用程序只是一个Windows窗体,带有datagridview,通常只显示几百行数据和一些其他控件。在崩溃之前,它加载datagridview每一行的单元格的速度非常慢。(但没有其他用户遇到过相同的问题。) 例外文本如下。是否有人可以检查它,并告诉我它是否是由我的代码出错或与经历此异常的用户的特定设置不兼容引起的 我注意到下面的描述说内存已损坏

应用程序本身有2000行长,因此将代码粘贴到这里是没有意义的,特别是因为收到的一个用户没有给出任何提示,说明我的代码的哪一部分导致了问题

顺便说一下,该应用程序只是一个Windows窗体,带有datagridview,通常只显示几百行数据和一些其他控件。在崩溃之前,它加载datagridview每一行的单元格的速度非常慢。(但没有其他用户遇到过相同的问题。)

例外文本如下。是否有人可以检查它,并告诉我它是否是由我的代码出错或与经历此异常的用户的特定设置不兼容引起的

我注意到下面的描述说内存已损坏。这是否意味着用户的计算机内存不好

  ************** Exception Text **************
  System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
     at System.Drawing.SafeNativeMethods.Gdip.GdipDrawRectangleI(HandleRef graphics, HandleRef pen, Int32 x, Int32 y, Int32 width, Int32 height)
     at System.Drawing.Graphics.DrawRectangle(Pen pen, Int32 x, Int32 y, Int32 width, Int32 height)
     at System.Windows.Forms.ControlPaint.DrawFlatCheckBox(Graphics graphics, Rectangle rectangle, Color foreground, Brush background, ButtonState state)
     at System.Windows.Forms.ControlPaint.DrawFlatCheckBox(Graphics graphics, Rectangle rectangle, ButtonState state)
     at System.Windows.Forms.ControlPaint.DrawCheckBox(Graphics graphics, Int32 x, Int32 y, Int32 width, Int32 height, ButtonState state)
     at System.Windows.Forms.ControlPaint.DrawCheckBox(Graphics graphics, Rectangle rectangle, ButtonState state)
     at System.Windows.Forms.CheckedListBox.OnDrawItem(DrawItemEventArgs e)
     at System.Windows.Forms.ListBox.WmReflectDrawItem(Message& m)
     at System.Windows.Forms.ListBox.WndProc(Message& m)
     at System.Windows.Forms.CheckedListBox.WndProc(Message& m)
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
     at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

如果没有更多的代码,很难说清楚。这里有一些事情需要注意

NET是一个托管环境,其基本原则之一是能够在编译时验证代码。具体而言,这意味着可以对代码单元做出某些保证,例如:

  • 无法读取超出数组边界的内容
  • 无法修改函数指针
  • 无法读取/修改内存的代码段
  • 无法混淆对象引用的类型
尝试这样做要么在编译时失败,要么在运行时出现异常

您看到的异常是“不安全”代码的结果。“不安全”实际上有点用词不当——最好用“无法验证”来形容。有时,出于性能原因,有必要放弃代码的可验证性,以通过指针算法等方法换取原始速度

此应用程序没有不安全的代码


WinForms广泛使用“不安全”代码。更确切地说,程序集没有任何不安全的代码,但它依赖于不安全的库代码

我注意到下面的描述说内存已损坏。这是否意味着用户的计算机内存不好

坏内存是一种可能性,但不太可能。当预期存在的值实际不存在时,内存已损坏。这可能是由于硬件故障,也可能是由于软件错误。根据我的经验,这个例外通常是针对软件错误而提出的。消息还说,内存可能已损坏

这里的堆栈跟踪可能不是很有见地,因为内存可能在较早的时候已经损坏,并且只在这里看到的堆栈帧期间被检测到

对user32.dll的ShowWindow函数(ShowWindow(p.MainWindowHandle,SW_SHOWDEFAULT);)有一个平台调用,但此调用发生在消息循环启动之前

这很可能是罪魁祸首。您尝试过使用托管方法吗?这可能是因为您的窗口还没有句柄,或者它发生了变化,或者因为这个原因出现了许多问题。一般来说,在本地内容之上使用托管包装时,尽量避免PInvoke


不幸的是,如果没有看到更多的代码,就不可能提供更有用的答案,但是,希望上面提供了一些异常的上下文,并可能帮助您了解您的应用程序是如何使WinForms进入这种状态的。

我想提及这一点,因为我突然出现了这个异常,我花了几天时间才弄清楚。我不知道上面的问题是否相关,但也许它会帮助那些来搜索上述异常的人

我正在测试一些日志代码,一旦签入测试,我们就会看到构建服务器上弹出异常。我们无法在我们的开发机器上本地重新创建它

我决定将逻辑从构造函数移动到方法,突然异常变为System.EntryPointNotFoundException

在我们的测试工具中,我们使用System.WebAPI来安排对象,记录器没有引用它。引用正确的库修复了这个问题


TL;博士当您看到此异常时,不要将业务逻辑放在Ctor中并检查引用。

这可能是内存损坏或winforms中的错误。内存损坏可能意味着在某个点、某个地方发生了内存覆盖。应用程序是否在任何地方使用不安全的代码?否。此应用程序没有不安全的代码。有2个选项。要么用户的物理内存确实不好,要么应用程序在某个地方使用的非托管代码错误地将值写入内存。这很可能是软件问题,而不是内存问题。异常的调用堆栈是否始终相同?如果是,那么几乎可以肯定这是一个软件问题。您是否使用任何第三方组件?您是否修改了自动生成的表单设计器代码?“WinForms广泛使用“不安全”代码。更确切地说,您的程序集没有任何不安全的代码,但它依赖于不安全的库代码。”谢谢您的回答。这很有帮助:)