мы сталкиваемся с подобной проблемой.У нас есть программное обеспечение, которое работает на многих машинах без проблем.На одном Windows XP SP 3 мы имеем следующее поведение:
- Приложение запускается и работает правильно
- Через некоторое время мы начинаем получать AccessViolationException из собственного кода GDI.Приложение прекращает рендеринг некоторых элементов управления или вылетает, если исключение не обрабатывается.
Есть несколько мест, откуда происходит нарушение, например:
1) Исключение: System.AccessViolationException
Сообщение. Попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.
Источник: System.Drawing
at System.Drawing.SafeNativeMethods.Gdip.GdipDrawImageI(HandleRef graphics, HandleRef image, Int32 x, Int32 y)
at System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y)
at System.Drawing.Graphics.DrawImageUnscaled(Image image, Int32 x, Int32 y)
at Aga.Controls.Tree.TreeViewAdv.DrawTree(PaintEventArgs e)
at Aga.Controls.Tree.TreeViewAdv.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
Код, похоже, не делает ничего необычного.Он рендерит изображение в буфер и затем вызывает: e.Graphics.DrawImageUnscaled (_bufferImage, 0, 0);Доступ к буферу не осуществляется никаким другим потоком.
2)
at System.Drawing.SafeNativeMethods.Gdip.GdipDrawLineI(HandleRef graphics, HandleRef pen, Int32 x1, Int32 y1, Int32 x2, Int32 y2)
at System.Drawing.Graphics.DrawLine(Pen pen, Int32 x1, Int32 y1, Int32 x2, Int32 y2)
at System.Drawing.Graphics.DrawLine(Pen pen, Point pt1, Point pt2)
at SomeMyNamespace.SomeMyControl.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.UserControl.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.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Здесь метод OnPaint
не делает ничего, кроме рисования только одной строки.Перо (и его кисть), переданное DrawLine
, конечно, хорошо инициализировано и не утилизировано.