【发布时间】:2011-07-26 08:14:55
【问题描述】:
我正在开发一个 .NET 2.0 WinForms 应用程序。它以前包含标准的 Microsoft ActiveX WebBrowser 控件,但我正在研究替代方案。
我需要做什么:
将 WebBrowser 用作应用程序中的标准 Web 浏览器控件
也可以在后台使用它 - 例如,创建控件、呈现网页并将结果输出到图像(使用 .DrawToBitmap),而无需将控件附加到表单。
挂钩到生命周期中的各种事件——主要是 DocumentCompleted。
可以通过控件的新实例或使用现有控件每 30 秒左右加载(或重新加载)网页。应用程序可以长时间无限期地保持运行。
必须使用 .NET 2.0。没有 3.0+ 或 WPF 的东西。
到目前为止,我能找到的仅有的三个控件都有相当严重的问题,阻碍我继续前进:
Microsoft ActiveX WebBrowser - 存在大量内存泄漏,不适合长时间运行。
WebKit.NET - 据我所知,这必须在任何渲染完成之前附加到表单,使其对于缩略图生成部分毫无用处。似乎也受到内存泄漏的影响。
GeckoFX - 最适合我,但不能正确支持线程(这对于缩略图生成部分至关重要)。
还有其他选择吗?
【问题讨论】:
-
“不正确支持线程”是什么意思我认为可以创建一些解决方法
-
有一个 Xpcom.Initialize 调用,在 GeckoFX 中只能调用一次。从我收集到的信息来看,一旦您在线程中调用该方法,GeckoWebBrowser 控件就会绑定到该线程——在任何其他线程中使用 GeckoWebBrowser 执行任何操作都会导致 COM 错误。
-
作为一种解决方法,您可以生成将封装 GeckoFX 的进程
-
是的,这就是我一直在阅读并保留在我脑海中的一个想法。某种最后的手段 - 主要项目已经非常复杂,我不想添加更多的移动部分作为外部流程。
-
嘿!我有个主意!您可以尝试将它放在不同的 AppDomain 中,它可能会提供与单独进程相同的好处并且开销要小得多。