Попытка чтения или записи в защищенную память

Я начал видеть AccessViolationException в моем приложении несколько разных мест. Это никогда не происходило на моем компьютере разработки, нашем тестовом сервере. Он также проявил себя только на 1 из наших 2 производственных серверов. Поскольку это происходило только на одном из наших производственных серверов, я начал просматривать установленные версии .net framework на серверах.


Я обнаружил, что (по какой-то странной причине) производственный сервер, у которого были проблемы, имел 2.0 sp2, 3.0 sp2 и 3.5 sp1, в то время как другой производственный сервер и тестовый сервер имели 2.0 sp1.


мое приложение предназначено только для платформы 2.0, решено удалить все версии платформы с рабочего сервера и установить только 2.0 sp1. До сих пор мне не удалось воспроизвести эту проблему. Весьма интересный.

ПК развития: компактная 2.0 с пакетом обновления 2, компактная 3.5, 2.0 SP2 и 3.0 SP2 и 3.5 с пакетом обновления 1 Тестовый сервер: 2.0 с пакетом обновления 1 Производство сервер1: 2.0 с пакетом обновления 1 Производство server2: 2.0 пакет обновления SP2, 3.0 SP2, то 3.5 с пакетом обновления 1

Теперь, почему я не могу воспроизвести проблему на моем компьютере разработки, на котором есть 2.0 sp2, я не могу понять. Я слышал слухи, что это нарушение доступа может произойти на каком-то программном обеспечении, использующем удаленное взаимодействие, что делает мой, но нарушение доступа никогда не происходит, когда удаленное взаимодействие происходит на самом деле. Я в порядке с использованием только 2.0 sp1 на данный момент, но мне действительно интересно узнать, есть ли у кого-нибудь эта проблема, и если они нашли обходной путь для более новых версий frameowork.

вот несколько исключений и их трассировки стека:

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at ICSharpCode.TextEditor.TextArea.HandleKeyPress(Char ch)
   at ICSharpCode.TextEditor.TextArea.SimulateKeyPress(Char ch)
   at ICSharpCode.TextEditor.TextArea.OnKeyPress(KeyPressEventArgs e)
   at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
   at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
   at System.Windows.Forms.Control.WmKeyChar(Message& m)
   at System.Windows.Forms.Control.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)

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
   at System.Windows.Forms.Control.DefWndProc(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
   at System.Windows.Forms.RichTextBox.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)

13 ответов


У меня была та же проблема. 2.0 работал нормально. после установки до 3.5 sp1 приложение получает нарушение доступа.

установлен http://support.microsoft.com/kb/971030 и моя проблема решена, даже если я не использую LCG.


Microsoft также выпустила исправление (2 июля 2007 года), чтобы предотвратить ошибку "попытка чтения или записи защищенной памяти", которая преследовала платформу .NET 2.0 в течение некоторого времени. Посмотрите наhttp://support.microsoft.com/kb/923028 - не уверен, что это относится к вам, но подумал, что вы могли бы проверить это.


У меня была та же проблема после обновления с .NET 4.5 до .NET 4.5.1. То, что исправило это для меня, выполняло эту команду:

netsh winsock reset


для VS 2013,.NET Framework 4.5.1 также имеет AccessViolationException ошибка (KB2915689) при работе с сокетами SQL Server / TCP. Обновление до.NET Framework 4.5.2 исправляет эту проблему.

сообщено VS.NET AccessViolationException

попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.


Я использовал OLEDB, и я переключился на SQL Client, и это решило мою проблему с этой ошибкой.


обычно я получаю " попытку чтения или записи защищенной памяти "при вызове метода" Show " на некоторых WinForms. Я проверил, и в этих формах нет ничего особенного. Я не знаю, почему это работает (может быть, кто-то может мне сказать), но обычно перемещение кода, который выполняется в событии "Load" формы, в событие "Shown" исправляет его для меня, и я никогда не вижу его снова.


проверьте, чтобы убедиться, что у вас нет нити в нити. Вот что вызвало эту ошибку для меня. См. эту ссылку:попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена


в некоторых случаях добавление "Option Strict On" в VB.NET и решение всех вопросов, которые он находит путем правильного литья, решило эту проблему для меня.


в моем случае это было исправлено, когда я настроил "включить 32-битные приложения" =True для пула приложений на сервере IIS.


в моем случае шрифты, используемые в одной из общих библиотек, не были установлены в системе.


проблема может быть из - за смешанных платформ сборки DLL в проекте. Я. e вы создаете свой проект для любого процессора, но имеете некоторые библиотеки DLL в проекте, уже построенном для платформы x86. Это вызовет случайные сбои из-за различного сопоставления памяти 32-битной и 64-битной архитектуры. Если все библиотеки DLL построены для одной платформы, проблема может быть решена. Для безопасности попробуйте bulinding для архитектуры 32bit x86, потому что она наиболее совместима.


в моем случае у меня были проблемы с "переменными среды" при добавлении ссылки на мою COM DLL.

когда я добавил ссылку на мой проект, я ищу P:\Core путь, тогда как я добавил c:\core путь в прошлое в среду пути varaible.

Итак, мой код сначала пытался ошибиться. Я удалил это и не зарегистрировал ссылку DLL и повторно зарегистрировал мою ссылку DLL с помощью (regsvr32). Надеюсь, это поможет.


Привет, есть две возможные причины.

  1. у нас есть неуправляемый код, и мы вызываем его из управляемого кода. это предотвращает запуск этого кода. попробуйте запустить эти команды и перезагрузите компьютер

    cmd: netsh winsock reset

открыть cmd.exe и выполнить команду "netsh winsock reset catalog"

  1. антивирус рассматривает неуправляемый код как вредоносный и ограничивает запуск этого кода отключить анти-вирус и тогда проверьте