我有一个使用内置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(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)
有没有人知道为什么我会得到这个以及如何预防呢?
答案 0 :(得分:6)
我们最近在几个客户的机器上遇到了类似的问题。在某些环境中,问题证明是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:\Windows\System32\regsvr32.exe C:\Windows\System32\jscript.dll
C:\Windows\SysWOW64\regsvr32.exe C:\Windows\SysWOW64\jscript.dll
这两个命令都必须是“以管理员身份运行”。
答案 1 :(得分:4)
在尝试访问WebBrowser.ReadyState和WebBrowser.Document时,我在各种场合遇到此异常。
我在Windows XP 32bit上只有例外。在其他解决方案没有帮助之后,它似乎是一个线程问题。我包含了使用互斥锁访问Web浏览器控件的任何代码块,这似乎解决了这个问题。
答案 2 :(得分:3)
我的直觉是,在您导航到文档之前,您正试图操纵文档。尝试在更改文档文本或html之前导航到“about:blank”。
如果您已经在执行导航,请注意导航是异步的,因此您需要监视浏览器的事件以检测导航何时完成。否则,您可能会尝试在文档存在之前写入文档。
答案 3 :(得分:1)
我们也在打这个。不一致,我们会得到这个例外。
有些问题可以帮助缩小范围:你是否直接使用任何mshtml接口(例如mshtml.dll)?直接做任何COM互操作?
我们发现错误地调用某些COM MSHTML接口会导致这种情况。
我们还发现错误地进行COM编组会导致这种情况。
如果内置WebBrowser使用的MSHTML界面导入中存在错误,则可能导致此错误。
从其他域访问文档IFRAME元素可能会导致此问题。
当文档还没有准备好时,进行WebBrowser调用可能也会导致这种情况。
答案 4 :(得分:0)
只是一个建议,我不是这方面的专家,但在之前的应用程序中已经使用了很多WebBrowser,但是为什么不写一个函数在尝试通过浏览器之前等待1秒并且总是事先检查readystate以及。 可能会减慢一点,但它应该使它成为防弹。 :)
答案 5 :(得分:0)
您要导航的页面是否托管任何ActiveX控件?如果是,其中一个可能存在缺陷。还要在IE中查看您的页面。看看它们是否以同样的方式崩溃。如果它特定于内容或浏览器控件,这将有助于隔离。
答案 6 :(得分:0)
我最后只是在浏览器中打开网页。这样我甚至不用担心这个。它仍然很奇怪它会抛出这个错误。
答案 7 :(得分:0)
这似乎是一个Vista问题,发生在我身上的是我的C#webBrowser1打开了一个网页,该网页运行了一个java applet,用于打开运行ActiveX应用程序/脚本的外部IE网页。
当ActiveX脚本尝试更新回C#应用程序的内存时,Vista中的“数据执行保护”将此操作标记为恶意/病毒,并使用System.AccessViolationException结束程序:尝试读取或写入受保护的记忆这通常表明其他内存已损坏。“
我对此的解决方法是使用cmd
中的此行转换Vista中的DEP"bcdedit.exe /set {current} nx AlwaysOff"
然后重启机器。
XP也运行DEP所以在某些情况下我觉得这种感冒也发生在这里。 测试它的DEP问题是否可以做到这一点。
右键点击“我的电脑” 选择“属性”和“高级” 在“启动和恢复”下,单击“设置” 现在点击“编辑” 记事本刚刚开始。只需更换线路: 码: AlwaysOff的noexecute选项 重新启动电脑以完成交易。
如果你想重新激活DEP就足以反过来了,如下所示:
替换为 引用: AlwaysOff noexecute = noexecute = optin