我有一个使用C#WebBrowser控件的程序,它需要检测加载哪个页面以确定下一步该做什么。该程序在办公室的大多数员工的计算机上运行良好,但在某些计算机上不起作用。
我已经确定问题是documentCompleted
事件未在那些无效的计算机上触发。
此程序使用线程处理数据,webbrowser.navigate
调用是通过委托进行的。但我也改变了代码,不使用委托进行导航操作而不改变结果。
我还制作了一个单独的程序,它只有一个基本WebBrowser
和调试textfield
,而DocumentCompleted
事件会在使用该程序时触发。< / p>
注意:未启动的计算机是具有单核/线程处理器的旧PC。
我对这个问题缺乏想法,任何帮助都会受到赞赏。
答案 0 :(得分:6)
正如CodeBlock所解释的那样,这似乎与Microsoft.mshtml.dll
我们有客户在GAC(也不是计算机)中没有Microsoft.mshtml.dll
,然后WebBrowser
组件永远不会触发任何事件。
通过在WebBrowser
类中使用Reflector,DocumentComplete
事件由名为WebBrowserEvent
的子类引发,该子类实现了专用接口DWebBrowserEvents2
。
此界面是ComImport
的{{1}},我认为它与Microsoft.mshtml.dll有关。
所以我们的解决方案是安装the Office 2003 Redistributable Primary Interop Assemblies,在程序文件上安装DLL,然后在GAC上注册。
注意:不要注意所需的.NET Framework 1.1或办公室,它只是复制一些dll。
注意2:2007 package似乎包含相同的dll。
答案 1 :(得分:4)
@Pavel L:
这里的问题是您使用了mshtml.dll的Web浏览器控件,但.NET框架不包含此文件。解决方法是将mshtml.dll复制到您的应用目录或将Microsoft.mshtml的“复制本地”属性设置为True。
抱歉我的英文不好:D
答案 2 :(得分:3)
在尝试解决this question时,我最初将我的WebBrowser控件放在using()块中,并且在DocumentCompleted事件触发之前它处理了自己。您是在做类似的事情,还是WebBrowser在一个保持开放的表格上?
答案 3 :(得分:2)
如果是线程问题,请确保调用Application.DoEvents()。当我没有做到这一点时,我遇到了WebBrowser无法正常工作的问题。
答案 4 :(得分:1)
我想分享更简单的解决方案而不是安装软件包。
正如在DocumentComplete事件之前所述,某种程度上取决于Microsoft.mshtml.dll文件。您可以在安装了Visual Studio的计算机上找到它。因此需要将其复制并安装到目标计算机上。以下是该过程的描述:
P.S。可能是以更好的方式完成,但这个解决方案有效,我希望它对你有用。
答案 5 :(得分:1)
为了使documentCompleted-Event触发,
Web浏览器的visible属性需要设置为true。
如果您有多个屏幕,它也可以是可见的 如果你有&gt; 1个屏幕,关闭除主屏幕以外的所有屏幕,这应该可以解决问题 或者,将窗口移动到第二个屏幕。
答案 6 :(得分:0)
确保webbrowser.Visible=true;
这对我有用,我之前遇到过类似的问题。