Элемент управления C # WebBrowser не запускает событие DocumentCompleted - PullRequest
3 голосов
/ 02 апреля 2009

У меня есть программа, использующая элемент управления C # WebBrowser, и она должна определить, какая страница загружена, чтобы определить, что делать дальше. Программа отлично работает на большинстве компьютеров сотрудника в офисе, но на некоторых не работает.

Я установил, что проблема в том, что событие documentCompleted не запускается на тех компьютерах, на которых оно не работает.

Эта программа использует потоки для обработки данных, и вызов webbrowser.navigate осуществляется через делегата. Но я также изменил код, чтобы не использовать делегатов для действия навигации без изменений в результате.

Я также создал отдельную программу, в которой есть просто WebBrowser и отладка textfield, а событие DocumentCompleted вызывает при использовании этой программы.

ПРИМЕЧАНИЕ. Компьютеры, на которых он не работает, - это старые ПК с одноядерными / потоковыми процессорами.

У меня нет идей по этому вопросу, любая помощь будет оценена.

Ответы [ 7 ]

6 голосов
/ 05 февраля 2010

Как объяснено CodeBlock, похоже, это связано с состоянием установки Microsoft.mshtml.dll

У нас есть клиенты, у которых Microsoft.mshtml.dll отсутствует в GAC (и в компьютере), а затем компонент WebBrowser никогда не запускает никаких событий.

При использовании Reflector в классе WebBrowser событие DocumentComplete вызывается подклассом WebBrowserEvent, который реализует закрытый интерфейс DWebBrowserEvents2.

Этот интерфейс представляет собой ComImport из {34A715A0-6587-11D0-924A-0020AFC7AC4D}, который, я полагаю, связан с Microsoft.mshtml.dll.

Таким образом, наше решение заключалось в установке распространяемых первичных сборок взаимодействия Office 2003 , которые устанавливают DLL в Program Files, а затем регистрируют ее в GAC.

Примечание: не обращайте внимания на требуемый .NET Framework 1.1 или офисный режим, он просто копирует некоторые библиотеки.

Примечание 2: 2007 пакет , кажется, включает в себя ту же самую DLL.

4 голосов
/ 27 ноября 2009

@ Павел Л:

Проблема здесь в том, что вы использовали элемент управления веб-браузера из mshtml.dll, но .NET Framework не включает этот файл. Решением для этого является просто скопировать mshtml.dll в каталог приложения или установить для свойства «Копировать локальный» файла Microsoft.mshtml значение True.

Извините за мой плохой английский: D

3 голосов
/ 03 апреля 2009

При попытке решить этот вопрос у меня изначально был элемент управления WebBrowser в блоке using (), и он удалялся до того, как могло произойти событие DocumentCompleted. Вы делаете что-то подобное, или WebBrowser находится в форме, которая остается открытой?

2 голосов
/ 02 апреля 2009

Если это проблема с многопоточностью, убедитесь, что вы вызываете Application.DoEvents (). У меня были проблемы с неправильной работой WebBrowser, когда я не смог этого сделать.

1 голос
/ 27 января 2012

Для того чтобы documentCompleted-Event сработал,
для свойства visible веб-браузера должно быть установлено значение true.

Он также может быть видимым, если у вас несколько экранов.
Если у вас> 1 экран, отключите все, кроме основного экрана, это должно решить проблему.
Или переместите окно на второй экран.

1 голос
/ 01 ноября 2010

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

Как было указано ранее, событие DocumentComplete каким-то образом зависит от файла Microsoft.mshtml.dll. Вы можете найти его на компьютере с установленной Visual Studio. Поэтому его необходимо скопировать и установить на целевой компьютер. Вот описание процесса:

  1. Поместите файл Microsoft.mshtml.dll в папку «% ProgramFiles% \ Microsoft.NET \ Первичные сборки взаимодействия».
  2. Затем перетащите его в папку «% SystemRoot% \ Assembly».
  3. Зарегистрируйте библиотеку с помощью утилиты RegAsm.exe (которая находится в соответствующей подпапке «% windir% \ Microsoft.NET \ Framework»).

P.S. Может быть, это может быть сделано лучше, но это решение работает, и я надеюсь, что оно будет полезно для вас.

0 голосов
/ 26 февраля 2013

Убедитесь, что webbrowser.Visible=true; это работает для меня, у меня были подобные проблемы ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...