使用WebBrowser控件开发的程序,占用内存会随着时间不停增长,最终内存溢出导致崩溃。究其原因是由于其自身的缺陷造成的。每一次加载新页面,WebBrowser就会多占用10-20M内存,有资料说是因为其内在的机制没有释放而导致的。这是微软承认的已知BUG,具体的修复补丁点此下载(此补丁似乎只支持XP、2003、Vista)。
《WebBrowser 控件 内存溢出(泄露) 解决方案汇总》这篇文章中给出了几个解决办法,具体的内容如下:
1.建立线程,动态创建WebBrowser,再试用完后freeandnil,线程销毁WebBrowser所占用的内存也随即销毁。
2.建立多程序,通过程序1,调用程序2进行页面访问,当操作完后,程序2退出,内存自动清除回收,程序与程序之间的信息交互可通过ini文件的读取和保存。
3.把IE升级到IE8,如果是使用的VB6开发的程序,可以修改注册表,使程序能够正常运行。修改脚本如下:
- Windows Registry Editor Version 5.00
- [HKEY_CLASSES_ROOTTypeLib{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}]
- [HKEY_CLASSES_ROOTTypeLib{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}1.1]
- @="Microsoft Internet Controls"
- [HKEY_CLASSES_ROOTTypeLib{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}1.1 ]
- [HKEY_CLASSES_ROOTTypeLib{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}1.1 win32]
- @="C:\WINDOWS\system32\ieframe.dll
我亲自尝试过第二个解决方案,但是我并没有使用ini文件进行读取和保存信息,而是采用的调用Window API跨进程传递信息来解决的,可以参考这篇文章《Winform跨进程通讯》。