Сегодня: Суббота, 20.04.2024, 06:51 (МСК)| Здравствуйте, Гость| Мой профиль | Регистрация | Вход | RSS

Работаем с VirtualDub

Визуальная среда Flowstone

Роботы и экзоскелеты

Новинки в области цифровых камер

Плагины Sonnox Oxford
Главная » ПРОГРАММИРОВАНИЕ

Заметки на полях. C#. Ошибка прорисовки AccessViolationException was unhandled. Attempted to read or write protected memory

08.02.2014


Это довольно частая ситуация, с которой сталкивались и сталкиваются очень многие. Причем мы описываем случай наиболее характерный для Windows XP SP3, а IDE могут быть разными, то есть это различные версии Visual C# либо же sharpDevelop.

Ситуация во многом патовая, потому как по существу становится невозможным нормально программировать, элементы типа DataGridView при запуске отладки приложения вызывают ошибку AccessViolationException was unhandled Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."


 

А полный текст ошибки выглядит так:

System.AccessViolationException was unhandled

Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
Source="System.Drawing"
StackTrace:
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.Drawing.Graphics.DrawRectangle(Pen pen, Rectangle rect)
at System.Windows.Forms.DataGridView.PaintBorder(Graphics g, Rectangle clipRect, Rectangle
bounds)
at System.Windows.Forms.DataGridView.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.DataGridView.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)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.
IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason,
ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,
ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at test0001.Program.Main() in C:\kzm_list_coder\test0001\test0001\Program.cs:line 18
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback
callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

Причем перестают компилироваться и старые проекты, которые были созданы и нормально компилировались на других ОС и так далее.

В интернете довольно много советов типа «переустановите ОС», «переустановите NET Framework», «переустановите Visual Studio», но они не разрешают ситуацию.

Что же делать в таком случае? Реальное решение ситуации — переопределить классы используемых компонент, которые вызывают ошибку прорисовки. 

Давайте все покажем на простом примере. Создаем новый проект C# Windows Application. На форму помещаем DataGridView, нажимаем F5 и видим нашу ошибку. Теперь заходим в файл Form1.Designer.cs. Там вписываем:

class NewDataGridView : System.Windows.Forms.DataGridView

{
public NewDataGridView() { DoubleBuffered = true; }
}

а строку this.dataGridView1 = new System.Windows.Forms.DataGridView();

меняем на this.dataGridView1 = new NewDataGridView();



Запускаем приложение на отладку, вуаля, проблема решена. И работать с DataGridView вы можете в обычном режиме. 


Кристофер




Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Ассоциация боевых роботов
Рекомендуем...
Новости

Разделы

Опросы

Какой язык программирования вы считаете наиболее актуальным сегодня?
Всего ответов: 329

Друзья

3D-кино






Найти на сайте:








Об авторе       Контакты      Вопрос-ответ        Хостинг от uCoz