2008-10-07 31 views
29

Tengo un programa que utiliza el control integrado del webbrowser. En algún momento durante el uso de este, no estoy seguro en qué momento, pero parece ser al azar, me sale el siguiente error: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) 

¿Alguien tiene alguna pista de por qué me gustaría tener este y cómo prevenirlo?

+0

Si alguna vez alguien encuentra una solución consistente para esto, hágamelo saber y lo aceptaré. Lo solucioné abriendo el navegador fuera de la aplicación en lugar del control del navegador. –

+2

¿Hay alguna manera de otorgarle la propiedad de una pregunta a otra persona? No trabajo mucho en este sistema, y ​​por lo tanto NUNCA aceptaré una respuesta aquí ... –

Respuesta

3

Mi intuición es que estás tratando de manipular el documento antes de que hayas navegado hacia uno. Intente navegar a "about: blank" antes de cambiar el texto del documento o html.

Si ya está realizando la navegación, tenga en cuenta que la navegación es asincrónica, por lo que debe controlar los eventos del navegador para detectar cuándo se completa la navegación. De lo contrario, puede intentar escribir en el documento antes de que exista.

+1

No estoy escribiendo en el documento. Solo estoy pasando una URL al navegador web. También tengo un botón para volver y otro para actualizar. No estoy manipulando el texto o el html en el documento en ningún momento. –

1

Nos estamos pegando esto también. Inconsistentemente, obtendremos esta excepción.

Algunas preguntas para ayudar a reducir esto: ¿está utilizando alguna interfaz mshtml directamente (por ejemplo, mshtml.dll)? ¿Haces alguna interferencia COM directamente?

Hemos encontrado que llamar a algunas de las interfaces COM MSHTML incorrectamente puede causar esto.

También descubrimos que la clasificación de COM incorrectamente puede causar esto.

Si hay un error en la importación de la interfaz MSHTML que utiliza el WebBrowser incorporado, puede causar esto.

Accediendo al documento IFRAME Los elementos de otro dominio pueden causar esto.

Es posible que hacer llamadas a WebBrowser cuando el documento no está listo también pueda causar esto.

0

Solo una sugerencia, no soy experto en esto pero he usado mucho el WebBrowser en aplicaciones anteriores, pero ¿por qué no escribes una función para esperar 1 segundo antes de intentar pasar el navegador y siempre verificar el estado de antemano? también. Puede retrasarlo un poco, pero debería hacerlo a prueba de balas. :)

+0

Lo intentaré y veré si funciona. –

0

¿Las páginas que está navegando alojan los controles ActiveX? Si es así, uno de esos puede tener fallas. También revise sus páginas en IE. Vea si se bloquean de la misma manera. Eso ayudará a aislar si es específico para el contenido o el control del navegador.

0

Terminé simplemente abriendo la página web en el navegador. De esa forma ni siquiera tengo que preocuparme por esto. Todavía es extraño que arroje este error sin embargo.

+0

Originalmente acepté esto, pero es posible que algunas personas no puedan usar esto como respuesta, por lo que voy a dejar esta pregunta sin respuesta por el momento mientras otras personas tengan problemas. –

0

Esto parece ser un problema de Vista, lo que me sucedió fue que mi C# webBrowser1 abría una página web que ejecutaba un applet java que abría una página web externa de IE que ejecuta una aplicación/script ActiveX.

Cuando la secuencia de comandos ActiveX intenta actualizar nuevamente a la memoria de la aplicación C#, DEP "Prevención de ejecución de datos" en Vista señala esta operación como hostil/virus y finaliza el programa con System.AccessViolationException: Intentó leer o escribir memoria protegida. Esto a menudo es una indicación de que otra memoria está corrupta."

Mi solución para este era convertir de DEP en Vista con esta línea de cmd

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

y reinicie la máquina.

XP también ejecutar DEP por lo que en algunos casos creo que esto resfrío aquí también. Para probar si es un problema de DEP hacer esto.

haga clic derecho en "Mi PC" seleccionar "Propiedades" y "Avanzado" en "inicio y recuperación, haga clic en Configuración Ahora haga clic en "Editar" El bloc de notas acaba de comenzar. Simplemente reemplace la línea: Código: opción no ejecutada por AlwaysOff Reinicie su PC para completar la transacción.

Si desea volver a activar el DEP ser suficiente para llevar a cabo la inversa, así:

Reemplazar por Cita: AlwaysOff noexecute = noexecute = OptIn

+0

Esto también sucedía en máquinas XP. –

+0

XP también ejecuta DEP, por lo que trataré de activar DEP mientras estoy depurando para ver si este es el problema. – Darkmage

+1

¿Qué hay de mis clientes? No puedo pedirles a todos que deshabiliten DEP ... –

5

Recientemente hemos tenido problema similar en las máquinas de varios clientes. El problema resultó ser un error en el control de MSHTML en ciertos entornos. Un síntoma común para el problema parece ser el registro roto de la biblioteca jscript.dll.

Síntomas que pueden ayudar a diagnosticar si se trata del mismo problema: jscript.dll no aparece en Módulos en el depurador y el proceso no lo carga; seguimiento de la pila nativa para el accidente es la siguiente:

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 

La solución es volver a registrar la biblioteca jscript.dll y el accidente debe desaparecer.

Volver a registrar la biblioteca se realiza de la siguiente manera (ejemplo dado para Windows de 64 bits, de lo contrario sólo la primera línea es necesario):

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

Ambos comandos tienen que ser "Ejecutar como Administrador".

3

Encontré esta excepción en varias ocasiones al intentar acceder a WebBrowser.ReadyState y WebBrowser.Document.

Tenía las excepciones exclusivamente en Windows XP 32bit. Después de que las otras soluciones no ayudaron, parecía ser un problema de enhebrado. Rodeé todos los bloques de código que accedían al control del navegador web con bloqueos mutex, y eso parecía resolver el problema.

+2

Después de 10 horas de depuración y búsqueda, esto es lo que me ayudó. ¡Gracias! Por cierto, recibía excepciones en Windows 7. – Martynas

Cuestiones relacionadas