С# WebBrowser Control System.AccessViolationException
У меня есть программа, которая использует встроенный элемент управления webbrowser. В какой-то момент во время использования этого я не уверен, в какой момент, но он кажется случайным, я получаю следующую ошибку:
System.AccessViolationException
FullText = System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
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)
Есть ли у кого-нибудь подсказки относительно того, почему я хотел бы получить это и как его предотвратить?
Ответы
Ответ 1
У нас недавно возникла аналогичная проблема на машинах нескольких клиентов. Проблема оказалась ошибкой в управлении MSHTML в определенных средах. Общим симптомом проблемы является нарушение библиотеки jscript.dll.
Симптомы, которые могут помочь диагностировать, если та же проблема - jscript.dll не указан в модулях в отладчике и не загружается процессом; Исходная трассировка стека для сбоя следующая:
mshtml!CRootTracker::CollectGarbageInternal+0xd
mshtml!CDoc::ReduceMemoryPressureTask+0x29
mshtml!CStackPtrAry<unsigned long,12>::GetStackSize+0xb6
mshtml!GlobalWndProc+0x183
USER32!InternalCallWinProc+0x23
USER32!UserCallWinProcCheckWow+0x109
USER32!DispatchMessageWorker+0x3bc
USER32!DispatchMessageW+0xf
Решение состоит в том, чтобы перерегистрировать библиотеку jscript.dll, и авария должна исчезнуть.
Повторная регистрация библиотеки выполняется следующим образом (пример приведен для 64-разрядной Windows, в противном случае нужна только первая строка):
C:\Windows\System32\regsvr32.exe C:\Windows\System32\jscript.dll
C:\Windows\SysWOW64\regsvr32.exe C:\Windows\SysWOW64\jscript.dll
Обе команды должны быть "Запуск от имени администратора".
Ответ 2
Я чувствую, что вы пытаетесь манипулировать документом, прежде чем переходите к нему. Перед изменением текста документа или html попробуйте перейти к "about: blank".
Если вы уже выполняете навигацию, обратите внимание, что навигация является асинхронной, поэтому вам необходимо отслеживать события браузера, чтобы обнаружить, когда навигация завершена. В противном случае вы можете попытаться записать документ до его существования.
Ответ 3
Я сталкивался с этим исключением в разных случаях, пытаясь получить доступ к WebBrowser.ReadyState и WebBrowser.Document.
У меня были исключения исключительно на Windows XP 32bit. После того, как другие решения не помогли, это, по-видимому, было проблемой с потоками. Я окружил все блоки кода, которые обратились к веб-браузеру с помощью блокировок мьютексов, и это, казалось, решило проблему.
Ответ 4
Мы тоже это делаем. Непосредственно, мы получим это исключение.
Некоторые вопросы, которые помогут вам сгладить это: используете ли вы какие-либо интерфейсы mshtml напрямую (например, mshtml.dll)? Выполнение любого COM-взаимодействия напрямую?
Мы обнаружили, что неправильное использование некоторых интерфейсов COM MSHTML может привести к этому.
Мы также обнаружили, что неправильное использование COM-маршаллинга может вызвать это.
Если в интерфейсе MSHTML появляется ошибка, которую использует встроенный WebBrowser, это может привести к этому.
Доступ к элементу документа IFRAME из другого домена может привести к этому.
Возможно, это может вызвать вызовы WebBrowser, когда документ не совсем готов.
Ответ 5
Просто предложение, я не эксперт по этому вопросу, но много использовал WebBrowser в предыдущих приложениях, но почему бы вам не написать функцию, чтобы подождать 1 секунду, прежде чем пытаться передать браузеру, и всегда проверяйте предварительный процесс заранее, а также,
Может немного замедлить его, но он должен сделать его пуленепробиваемым.:)
Ответ 6
Являются ли страницы, на которые вы переходите на хостинг любых элементов управления ActiveX? Если да, один из них может быть ошибочным. Также проверьте свои страницы в IE. Смотрите, если они рухнули таким же образом. Это поможет изолировать, если оно зависит от содержимого или контроля браузера.
Ответ 7
В итоге я просто открыл веб-страницу в браузере. Таким образом, мне даже не нужно беспокоиться об этом. По-прежнему странно, что это порождает эту ошибку.
Ответ 8
Кажется, это проблема с Vista, что мне показалось, что мой С# webBrowser1 открывает веб-страницу, на которой запущен Java-апплет, который открывает внешнюю веб-страницу IE, которая запускает приложение ActiveX/ script.
Когда ActiveX script пытается обновить обратно в память приложения С#, DEP "Предотвращение выполнения данных" в Vista помещает эту операцию как враждебную/вирусную и завершает программу с помощью System.AccessViolationException: Попытка прочитать или записать защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Мое исправление для этого состояло в том, чтобы включить DEP в Vista с этой строкой в cmd
"bcdedit.exe /set {current} nx AlwaysOff"
и перезагрузите компьютер.
XP также запускает DEP, поэтому в некоторых случаях я думаю, что этот холод здесь тоже.
Чтобы проверить, делает ли это вопрос DEP, выполните следующие действия.
Щелкните правой кнопкой мыши на "Мой компьютер"
Выберите "Свойства" и "Дополнительно"
В разделе "Запуск и восстановление" нажмите "Настройки".
Теперь нажмите "Изменить"
Блокнот только начался. Просто замените строку:
Код: noexecute optionn от AlwaysOff
Перезагрузите компьютер, чтобы завершить транзакцию.
Если вы хотите повторно активировать DEP, достаточно провести обратное, например:
Заменить на
Цитата: AlwaysOff noexecute = noexecute = optin