2008-10-07 12 views
29

Ich habe ein Programm, das die integrierte Webbrowser-Steuerelement verwendet. An einem gewissen Punkt während der Nutzung dieser, ich bin, an welchem ​​Punkt sich nicht sicher, aber es scheint zufällig zu sein, erhalte ich folgende Fehlermeldung:C# WebBrowser Control System.AccessViolationException

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) 

Hat jemand irgendwelche Hinweise darauf, warum ich das bekommen würde und wie man es verhindert?

+0

Wenn jemand jemals eine konsistente Lösung dafür findet, lass es mich wissen und ich werde es akzeptieren. Ich habe es umgangen, indem ich den Browser außerhalb der Anwendung geöffnet habe, im Gegensatz zur Browsersteuerung. –

+2

Gibt es eine Möglichkeit, jemandem eine Frage zu stellen? Ich arbeite nicht lange an diesem System und werde daher NIEMALS eine Antwort hier akzeptieren ... –

Antwort

3

Mein Bauchgefühl ist, dass Sie versuchen, das Dokument zu manipulieren, bevor Sie zu einem navigiert haben. Versuchen Sie, zu "about: blank" zu navigieren, bevor Sie den Dokumenttext oder html ändern.

Wenn Sie bereits eine Navigation durchführen, beachten Sie, dass die Navigation asynchron ist. Daher müssen Sie die Ereignisse des Browsers überwachen, um festzustellen, wann die Navigation abgeschlossen ist. Andernfalls können Sie versuchen, in das Dokument zu schreiben, bevor es existiert.

+1

Ich schreibe nicht auf das Dokument. Ich gebe nur eine URL an den Webbrowser weiter. Ich habe auch einen Zurück- und einen Aktualisierungsknopf. Ich manipuliere den Text oder HTML im Dokument zu keiner Zeit. –

1

Wir treffen das auch. Inkonsequent erhalten wir diese Ausnahme.

Einige Fragen zur Eingrenzung: Verwenden Sie direkt eine mshtml-Schnittstelle (z. B. mshtml.dll)? Ein COM-Interop direkt ausführen?

Wir haben festgestellt, dass das einige COM MSHTML-Schnittstellen falsch aufrufen kann.

Wir haben auch festgestellt, dass COM-Marshalling falsch verursachen kann.

Wenn der MSHTML-Schnittstellenimport einen Fehler enthält, den der integrierte WebBrowser verwendet, kann dies zu einem Fehler führen.

Zugriff auf Dokument IFRAME Elemente aus einer anderen Domäne können dies verursachen.

Es kann auch sein, dass WebBrowser-Aufrufe ausgeführt werden, wenn das Dokument nicht vollständig bereit ist.

0

Nur ein Vorschlag, ich bin kein Experte auf diesem, aber den WebBrowser viel in früheren Anwendungen verwendet, aber warum schreiben Sie nicht eine Funktion zu warten 1 Sekunde vor dem Versuch, den Browser irgendetwas passieren und immer überprüfen Sie den Bereitschaftszustand im Voraus auch. Könnte es etwas verlangsamen, aber es sollte es kugelsicher machen. :)

+0

Ich werde es versuchen und sehen, ob es funktioniert. –

0

Sind die Seiten, die Sie navigieren, zum Hosten von ActiveX-Steuerelementen? Wenn ja, kann einer davon fehlerhaft sein. Überprüfen Sie auch Ihre Seiten in IE. Sehen Sie, ob sie auf die gleiche Weise abstürzen. Dies wird helfen zu isolieren, wenn es spezifisch für den Inhalt oder das Browser-Steuerelement ist.

0

Ich habe am Ende nur die Webseite im Browser geöffnet. Auf diese Weise muss ich mir nicht einmal Sorgen machen. Es ist immer noch seltsam, dass es diesen Fehler wirft.

+0

Ich habe das ursprünglich akzeptiert, aber manche Leute können das vielleicht nicht als Antwort verwenden, also werde ich diese Frage solange unbeantwortet lassen, wie andere Leute Probleme haben. –

0

Dies scheint ein Vista-Problem zu sein, was passiert ist, dass mein C# webBrowser1 eine Webseite geöffnet hat, die ein Java-Applet geöffnet hat, das eine externe IE-Webseite geöffnet hat, die eine ActiveX-App/Skript ausführt.

Wenn das ActiveX-Skript versucht, wieder in den Speicher der C# -App zu aktualisieren, markiert die DEP "Data Execution Prevention" in Vista diesen Vorgang als feindlich/Virus und beendet das Programm mit der System.AccessViolationException: Versuchte zu lesen oder schreibgeschützten Speicher. Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist."

Meine Lösung für dieses DEP in Vista mit dieser Linie in cmd zu drehen war

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

und starten Sie den Rechner.

XP auch DEP laufen, so dass in bestimmten Fällen wir das denken, kalt passieren auch hier. Um zu testen, ob es eine DEP Ausgabe dies tut.

Rechtsklick auf „Arbeitsplatz“ Wählen Sie „Eigenschaften“ und „Advanced“ Unter „Starten und Wiederherstellen auf Einstellungen Klicken Sie nun auf "Bearbeiten" Der Notizblock hat gerade erst begonnen. Ersetzen Sie einfach die Zeile: Code: noexecute Optionen von AlwaysOff Starten Sie Ihren PC neu, um die Transaktion abzuschließen.

Wenn Sie die DEP ausreichend sein, um reaktivieren wollen umgekehrt zu führen, wie folgt aus:

Ersetzen durch Zitat: AlwaysOff noexecute = noexecute = optin

+0

Dies geschah auch auf XP-Maschinen. –

+0

XP läuft auch DEP, also versuche ich DEP beim Debuggen auszuschalten, um zu sehen, ob das das Problem ist. – Darkmage

+1

Wie wäre es mit meinen Kunden? Ich kann nicht alle bitten, DEP zu deaktivieren ... –

5

Wir haben vor kurzem hatte ähnliches Problem an Maschinen mehrere Kunden. Das Problem stellte sich in bestimmten Umgebungen als Fehler im MSHTML-Steuerelement heraus. Ein häufiges Symptom für das Problem scheint eine fehlerhafte Registrierung der jscript.dll-Bibliothek zu sein.

Symptome, die bei der Diagnose helfen können, wenn es sich um das gleiche Problem handelt - die Datei jscript.dll ist im Debugger nicht unter Module aufgeführt und wird vom Prozess nicht geladen. Nativen Stack-Trace für den Absturz ist die folgende:

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 

Die Lösung ist die jscript.dll Bibliothek neu registrieren und der Absturz sollte weggehen.

Re-Registrierung der Bibliothek wird wie folgt (Beispiel für 64-Bit-Windows gegeben, sonst nur die erste Zeile ist erforderlich):

C:\Windows\System32\regsvr32.exe C:\Windows\System32\jscript.dll 
C:\Windows\SysWOW64\regsvr32.exe C:\Windows\SysWOW64\jscript.dll 

Beide Befehle sein „als Administrator ausführen“ haben.

3

Ich habe diese Ausnahme bei verschiedenen Gelegenheiten beim Versuch, WebBrowser.ReadyState und WebBrowser.Document zuzugreifen.

Ich hatte die Ausnahmen ausschließlich auf Windows XP 32bit. Nachdem die anderen Lösungen nicht geholfen hatten, schien es ein Threading-Problem zu sein. Ich umgab alle Code-Blöcke, die mit Mutex-Locks auf das Webbrowser-Steuerelement zugreifen, und das schien das Problem zu lösen.

+2

Nach 10 Stunden Debugging und Suche hat mir das geholfen. Vielen Dank! Übrigens, ich bekam Ausnahmen in Windows 7. – Martynas

Verwandte Themen