Подтвердить что ты не робот

С# 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)

Есть ли у кого-нибудь подсказки относительно того, почему я хотел бы получить это и как его предотвратить?

4b9b3361

Ответ 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