【问题标题】:C# WebBrowser Control System.AccessViolationExceptionC# WebBrowser 控制 System.AccessViolationException
【发布时间】:2010-09-15 18:53:08
【问题描述】:

我有一个使用内置网络浏览器控件的程序。在使用它的某个时候,我不确定在什么时候,但它似乎是随机的,我收到以下错误:

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)

有没有人知道我为什么会得到这个以及如何预防它?

【问题讨论】:

  • 如果有人为此找到一致的解决方案,请告诉我,我会接受的。我通过在应用程序之外打开浏览器而不是浏览器控件来解决它。
  • 有没有办法将问题的所有权转让给其他人?我不再在这个系统上工作,因此永远不会在这里接受答案......

标签: c# .net exception browser


【解决方案1】:

我们最近在几个客户的机器上遇到了类似的问题。这个问题原来是某些环境中 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

这两个命令都必须是“以管理员身份运行”。

【讨论】:

    【解决方案2】:

    我在尝试访问 WebBrowser.ReadyState 和 WebBrowser.Document 时多次遇到此异常。

    我只在 Windows XP 32 位上遇到了例外情况。在其他解决方案没有帮助之后,它似乎是一个线程问题。我用互斥锁包围了所有访问 Web 浏览器控件的代码块,这似乎解决了问题。

    【讨论】:

    • 经过 10 个小时的调试和搜索,这对我有帮助。谢谢!顺便说一句,我在 Windows 7 中遇到了异常。
    【解决方案3】:

    我的直觉是,您正在尝试在导航到文档之前对其进行操作。在更改文档文本或 html 之前尝试导航到“about:blank”。

    如果您已经在执行导航,请注意导航是异步的,因此您需要监视浏览器的事件以检测导航何时完成。否则,您可能会尝试在文档存在之前对其进行写入。

    【讨论】:

    • 我没有写文件。我只是将一个 URL 传递给网络浏览器。我还有一个返回和刷新按钮。我不会在任何时候操作文档中的文本或 html。
    【解决方案4】:

    我们也在解决这个问题。不一致,我们会得到这个异常。

    一些有助于缩小范围的问题:您是否直接使用任何 mshtml 接口(例如 mshtml.dll)?直接做任何 COM 互操作?

    我们发现不正确地调用某些 COM MSHTML 接口会导致这种情况。

    我们还发现不正确地执行 COM 编组会导致这种情况。

    如果内置 WebBrowser 使用的 MSHTML 界面导入存在错误,则可能导致此问题。

    从另一个域访问文档 IFRAME 元素可能会导致这种情况。

    在文档尚未完全就绪时调用 WebBrowser 也可能导致此问题。

    【讨论】:

      【解决方案5】:

      只是一个建议,我不是这方面的专家,但在以前的应用程序中使用过很多 WebBrowser,但是为什么不编写一个函数来等待 1 秒,然后再尝试通过浏览器并始终事先检查 readystate . 可能会慢一点,但它应该使它防弹。 :)

      【讨论】:

        【解决方案6】:

        您要导航到的页面是否托管任何 ActiveX 控件?如果是,其中之一可能有缺陷。还要检查您在 IE 中的页面。看看他们是否以同样的方式崩溃。如果它特定于内容或浏览器控件,这将有助于隔离。

        【讨论】:

          【解决方案7】:

          我最终只是在浏览器中打开了网页。这样我就不用担心这个了。不过还是会抛出这个错误还是很奇怪。

          【讨论】:

          • 我最初接受了这个,但有些人可能无法将其用作答案,所以只要其他人有问题,我就暂时不回答这个问题。跨度>
          【解决方案8】:

          这似乎是一个 Vista 问题,发生在我身上的是我的 C# webBrowser1 打开了一个运行 Java 小程序的网页,该小程序打开了一个运行 ActiveX 应用程序/脚本的外部 IE 网页。

          当 ActiveX 脚本尝试更新回 C# 应用程序的内存时,Vista 中的 DEP“数据执行保护”会将此操作标记为恶意/病毒,并以 System.AccessViolationException: Attempted to read or write 结束程序受保护的内存。这通常表明其他内存已损坏。”

          我的解决方法是在 Vista 中使用 cmd 中的这一行来关闭 DEP

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

          然后重启机器。

          XP 也运行 DEP,所以在某些情况下,我猜这里也会发生这种情况。 要测试它是否是 DEP 问题,请执行此操作。

          右击“我的电脑” 选择“属性”和“高级” 在“启动和恢复”下,单击“设置” 现在点击“编辑” 记事本才刚刚开始。只需替换该行: 代码: AlwaysOff 的 noexecute 选项 重新启动您的 PC 以完成交易。

          如果您想重新激活 DEP,则足以进行反向操作,如下所示:

          替换为 引用: AlwaysOff noexecute = noexecute = optin

          【讨论】:

          • 这也发生在 XP 机器上。
          • XP 也运行 DEP,所以我会在调试时尝试关闭 DEP,看看是否是问题所在。
          猜你喜欢
          • 2012-02-20
          • 2010-12-25
          • 2011-12-17
          • 1970-01-01
          • 2014-09-17
          • 2021-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多