Система управления веб-браузером C#.Исключение AccessViolationException

#c# #.net #exception #browser

Вопрос:

У меня есть программа, которая использует встроенный элемент управления 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(MSGamp; 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. Если кто-нибудь когда-нибудь найдет последовательное решение для этого, дайте мне знать, и я приму его. Я обошел это, открыв браузер вне приложения, в отличие от элемента управления браузером.

2. Есть ли способ передать право собственности на вопрос кому-то другому? Я давно не работаю над этой системой и поэтому НИКОГДА не приму здесь ответа…

Ответ №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:WindowsSystem32regsvr32.exe C:WindowsSystem32jscript.dll
C:WindowsSysWOW64regsvr32.exe C:WindowsSysWOW64jscript.dll
 

Обе команды должны быть «Запущены от имени администратора».

Ответ №2:

Я сталкивался с этим исключением в разных случаях, пытаясь получить доступ к WebBrowser.Готовое состояние и веб-браузер.Документ.

У меня были исключения исключительно для 32-битной Windows XP. После того, как другие решения не помогли, возникла проблема с потоками. Я окружил все блоки кода, которые обращались к элементу управления веб-браузером, мьютексными блокировками, и это, казалось, решило проблему.

Комментарии:

1. После 10 часов отладки и поиска это то, что помогло мне. Спасибо! Кстати, я получал исключения в Windows 7.

Ответ №3:

У меня такое чувство, что вы пытаетесь манипулировать документом до того, как перейдете к нему. Попробуйте перейти в раздел «О программе:пусто», прежде чем изменять текст документа или html.

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

Комментарии:

1. Я не пишу в документ. Я просто передаю URL-адрес веб-браузеру. У меня также есть кнопка «Назад» и «Обновить». Я никогда не манипулирую текстом или html в документе.

Ответ №4:

Мы тоже этим занимаемся. Непоследовательно, но мы получим это исключение.

Некоторые вопросы, которые помогут сузить это: используете ли вы какие-либо интерфейсы mshtml напрямую (например mshtml.dll)? Выполняете ли вы какое-либо прямое взаимодействие с COM?

Мы обнаружили, что неправильный вызов некоторых интерфейсов COM MSHTML может привести к этому.

Мы также обнаружили, что неправильное выполнение сортировки COM может привести к этому.

Если в импорте интерфейса MSHTML есть ошибка, которую использует встроенный веб-браузер, это может привести к этому.

Доступ к элементам IFRAME документа из другого домена может привести к этому.

Возможно, что выполнение вызовов веб-браузера, когда документ не совсем готов, также может привести к этому.

Ответ №5:

Просто предложение, я не эксперт в этом, но много использовал веб-браузер в предыдущих приложениях, но почему бы вам не написать функцию, чтобы подождать 1 секунду, прежде чем пытаться передать браузеру что-либо, и всегда заранее проверять состояние готовности. Может немного замедлить его, но это должно сделать его пуленепробиваемым. 🙂

Ответ №6:

Являются ли страницы, на которые вы переходите, хостингом каких-либо элементов управления ActiveX? Если да, то один из них может быть испорчен. Также проверьте свои страницы в IE. Посмотрим, не разобьются ли они так же. Это поможет изолировать, если это относится к конкретному контенту или элементу управления браузером.

Ответ №7:

В итоге я просто открыл веб-страницу в браузере. Таким образом, мне даже не придется беспокоиться об этом. Все равно странно, что он выдает эту ошибку.

Комментарии:

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

Ответ №8:

Похоже, это проблема Vista, со мной произошло то, что мой веб-браузер C# 1 открыл веб-страницу, на которой был запущен java-апплет, открывающий внешнюю веб-страницу IE, на которой запущено приложение/скрипт ActiveX.

Когда скрипт ActiveX пытается обновить обратно в память приложения C#, DEP «Предотвращение выполнения данных» в Vista помечает эту операцию как враждебную/вирусную и завершает программу вместе с Системой.Исключение AccessViolationException: Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена».

Мое исправление для этого состояло в том, чтобы включить DEP в Vista с помощью этой строки в cmd

 "bcdedit.exe /set {current} nx AlwaysOff"
 

и перезагрузите машину.

XP также запускает DEP, так что в некоторых случаях, я думаю, это тоже произойдет здесь. Чтобы проверить, является ли это проблемой DEP, сделайте это.

Щелкните правой кнопкой мыши на «Мой компьютер», выберите «Свойства» и «Дополнительно» В разделе «Запуск и восстановление», нажмите» Настройки», теперь нажмите «Редактировать», Блокнот только начался. Просто замените строку: Код: опция noexecute на AlwaysOff Перезагрузите компьютер, чтобы завершить транзакцию.

Если вы хотите повторно активировать DEP, достаточно выполнить обратное, например, так:

Заменить цитатой: Всегда безрезультатно = безрезультатно = оптин

Комментарии:

1. Это происходило и на машинах XP.

2. XP тоже запускает DEP, поэтому я попытаюсь включить DEP во время отладки, чтобы понять, в чем проблема.