2009-04-02 5 views
3

Ich habe ein Programm, das das C# WebBrowser-Steuerelement verwendet und es muss ermitteln, welche Seite geladen wird, um zu bestimmen, was als nächstes zu tun ist. Das Programm funktioniert auf den meisten Computern des Mitarbeiters im Büro gut, funktioniert aber bei einigen nicht.C# -WebBrowser-Steuerelement, das das DocumentCompleted-Ereignis nicht auslöst

Ich habe festgestellt, das Problem ist, dass das documentCompleted Ereignis nicht auf diesen Computern feuert, die es nicht funktioniert.

Dieses Programm verwendet Threads, um Daten zu verarbeiten, und der webbrowser.navigate-Aufruf wird über einen Delegaten vorgenommen. Aber ich habe auch den Code geändert, um keine Delegaten für die Navigationsaktion zu verwenden, ohne das Ergebnis zu ändern.

Ich habe auch ein eigenes Programm, das nur einen grundlegenden WebBrowser und Debug-textfield und die DocumentCompleted Ereignis tut Feuer bei der Verwendung dieses Programms hat.

HINWEIS: Bei den Computern, auf die nicht geschossen wird, handelt es sich um ältere PCs mit Einzelkern-/Threadprozessoren.

Ich habe keine Ideen zu diesem Thema, jede Hilfe wäre willkommen.

Antwort

2

Wenn es sich um ein Threading-Problem handelt, stellen Sie sicher, dass Sie Application.DoEvents() aufrufen. Ich hatte Probleme damit, dass WebBrowser nicht richtig funktionierte, wenn ich dies nicht schaffte.

+0

Wann müsste ich das tun? Nachdem der Thread fertig ist? – user42931

+1

In Ordnung, gerade versucht, dass nach den Threads ihre Arbeit zu beenden. Keine Änderung. Außerdem wurde versucht, Application.DoEvents() für einen 1-Sekunden-Timer auszuführen. Keine Änderung. :( – user42931

+0

Genau mein Problem gelöst. – Auxiliary

3

Beim Versuch, this question zu lösen, hatte ich ursprünglich mein WebBrowser-Steuerelement in einem using() -Block, und es entsorgte sich selbst, bevor das DocumentCompleted-Ereignis ausgelöst werden konnte. Machst du etwas Ähnliches oder ist der WebBrowser in einem Formular, das offen bleibt?

4

@Pavel L:

Das Problem hier ist, dass Sie eine Web-Browser-Steuerung von mshtml.dll verwendet, aber .NET Framework enthält diese Datei nicht. Die Lösung hierfür ist einfach kopieren Sie mshtml.dll in Ihre App-Verzeichnis oder setzen Sie die Eigenschaft 'Copy local' von Microsoft.mshtml auf True.

Sorry für mein schlechtes Englisch: D

+0

+1 - Ihre Antwort ist klar und präzise. –

6

Wie Codeblock erklärt, dies scheint durch den Installationsstatus von Microsoft.mshtml.dll

bezogen werden wir Kunden habe, wo die Microsoft.mshtml.dll nicht im GAC ist (noch im Computer), und die Komponente WebBrowser löst niemals ein Ereignis aus.

durch den Reflektor in der WebBrowser-Klasse, das DocumentComplete Ereignis wird von einer Unterklasse WebBrowserEvent, die DWebBrowserEvents2 eine private Schnittstelle implementieren genannt angehoben.

Diese Schnittstelle ist ein ComImport von {34A715A0-6587-11D0-924A-0020AFC7AC4D}, die, glaube ich, zu Microsoft.mshtml.dll zusammenhängt.

So war unsere Lösung zu installieren the Office 2003 Redistributable Primary Interop Assemblies, die DLL auf Programme installieren dann registrieren sie auf dem GAC.

Hinweis: Achten Sie nicht auf das erforderliche .NET Framework 1.1 oder Office erforderlich, es kopiert nur einige DLLs.

Hinweis 2: Die 2007 package scheint die gleiche DLL enthalten.

+0

Great .. Danke. – Sayka

1

Nun, ich würde gerne noch einfachere Lösung teilen, anstatt ein Paket zu installieren.

Wie bereits erwähnt, hängt das DocumentComplete-Ereignis irgendwie von der Microsoft.mshtml.dll-Datei ab. Sie können es auf einem Computer mit installiertem Visual Studio finden. Es muss also kopiert und auf dem Zielrechner installiert werden. Hier ist die Beschreibung des Prozesses:

  1. Legen Sie die Microsoft.mshtml.dll-Datei in das "% Programfiles% \ Microsoft.NET \ Primary Interop Assemblies" -Ordner.
  2. Ziehen Sie es dann in den Ordner "% SystemRoot% \ Assembly".
  3. Registrieren Sie die Bibliothek mit dem Dienstprogramm RegAsm.exe (das sich im entsprechenden Unterordner von "% windir% \ Microsoft.NET \ Framework" befindet).

P.S. Vielleicht wird es besser gemacht, aber diese Lösung funktioniert und ich hoffe, es wird für Sie nützlich sein.

1

Damit das DocumentCompleted-Event ausgelöst wird, muss die sichtbare Eigenschaft des Webbrowsers auf True festgelegt werden.

Es kann auch sichtbar sein, wenn Sie mehrere Bildschirme haben.
Wenn Sie> 1 Bildschirm haben, schalten Sie alle außer dem Hauptbildschirm aus, dies sollte das Problem beheben.
Alternativ können Sie das Fenster auf den zweiten Bildschirm verschieben.

0

Stellen Sie sicher webbrowser.Visible=true; dies funktioniert für mich, ich hatte ähnliche Probleme zuvor.