Webbrowser是非托管代码,而我开发时用了托管代码,一开始在这方面进行了优化,发现效果没什么改善。
后一查资料才发现病根 Microsoft的内存溢出bug,微软给出了补丁,但是微软声称说没有经过回归测试,但无论如何,这是官方提供的解决方案,也是比较冶本的。综合考虑,后来我取用了第一和第二种相结合的方式,给Webbrowser瘦了身。
一、官方解决方案
官网下载 http://support.microsoft.com/kb/943510/zh-cn
这个方法 对于window 7.0 使用发现在补丁不能使用,xp.server2003 可以考虑使用
二、程序解决方案
后又有网友从程序模式的思路上提供了二种解决方案:
1,建立线程,动态创建WebBrowser,再试用完后freeandnil,线程销毁WebBrowser所占用的内存也随即销毁~
2,建立多程序,通过程序1,调用程序2进行页面访问,当操作完后,程序2退出,内存自动清除回收,程序与程序之间的信息交互可通过ini文件的读取和保存~
[color=red][b]三、升级运行环境解决方案[/b][/color]
还有网友提供了下面这种方案:
把IE升级到IE8以后,这一BUG将不复存在了。
该兄弟声称升级IE后,生成的EXE文件可用,如果是用VB6开发的源程序,则又不能识别webbrowser控件了。
这时可以采用修改注册表,注册组件的方法解决这一问题:
将下面文字另存为一个.reg文件双击导入注册表:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}]
[HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1]
@="Microsoft Internet Controls"
[HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1\0]
[HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1\0\win32]
@="C:\\WINDOWS\\system32\\ieframe.dll"
Thank you so much mike_t2e!!!!!!!
-----------------------------------------------------------------------
Is the memory released when you minimize the app ? If so, try this:
-- in class definition
[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);
[DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern IntPtr GetCurrentProcess();
-- code to call when you want to reduce the memory
IntPtr pHandle = GetCurrentProcess();
SetProcessWorkingSetSize(pHandle, -1, -1);