我遇到了WPF的WebBrowser控件问题。当我改变标签时,它会因为名义错误而崩溃 - 我想我知道为什么(在下面解释),但我想不出办法解决它。我正在寻找关于如何重新组织代码才能正常工作的想法,或者是我用来实现目标的替代方案。
程序的设置是这样的:有多个选项卡,包含边框/网格/等。在其中一个选项卡上,有一个Grid,其中包含“Widgets”,每个都包含一个WebBrowser。这些浏览器正在加载各种本地托管的页面,其中包含用户的信息。为了使小部件看起来很好,一些代码在浏览器的LoadCompleted事件中运行。
brow = new WebBrowser();
brow.LoadCompleted += wb_LoadCompleted;
(wb_LoadCompleted函数并不重要:程序将作为进行调用,而不是在执行期间。)
此外,当用户更改选项卡时,这些窗口小部件具有一个名为的Dispose函数。
brow.LoadCompleted -= wb_LoadCompleted;
brow.Source = null;
现在,如果用户打开带有这些窗口小部件的选项卡,那么在页面开始加载之后,在加载并调用该事件之前,用户再次切换选项卡,程序将在崩溃后崩溃尝试调用wb_LoadCompleted事件。我认为这是因为错误described here而发生的。处理程序已被释放,因为选项卡已更改,但线程要调用处理程序。在Visual Studio中,如果我在wb_LoadCompleted方法上放置一个中断,当它抛出错误时它将在该断点上,所以我认为程序仍然知道它应该运行什么代码,它只是没有权限。
到目前为止,我一直无法找到解决方法或解决方案。除了代码修复尝试之外,我尝试使用不同的浏览器控件(Awesemonium和其他几个);虽然他们工作没有这个错误,但他们也使我们的程序分布的大小膨胀30兆。这几乎是规模的两倍,我们这样做是不可行的。任何可行的浏览器控件都很棒,但最多需要10兆。
如果你让我知道你需要看到什么,我也可以分享一些其他代码;但是,我认为这比当前的代码问题更多的是时间/位置/排序问题,如果这是有道理的。
电子;添加完整错误文本:
托管调试助手'FatalExecutionEngineError'在-programpath中检测到问题 -
其他信息:运行时遇到致命错误。错误的地址位于0x6bd5e4ad,位于线程0xa54上。错误代码是0x80131623。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。