概述
CefSharp.CefSettings setting = new CefSharp.CefSettings();
setting.Locale = "zh-CN";
setting.CachePath = "CHBrowser/BrowserCache3";//缓存路径
setting.AcceptLanguageList = "zh-CN,zh;q=0.8";//浏览器引擎的语言
setting.LocalesDirPath = "CHBrowser/localeDir3";//日志
setting.LogFile = "CHBrowser/LogData";//日志文件
setting.PersistSessionCookies = true;//
setting.UserAgent = "";//浏览器内核
setting.UserDataPath = "CHBrowser/userData3";//个人数据
CefSharp.Cef.Initialize(setting);
CefSharp.WinForms.ChromiumWebBrowser WebBrowser = new CefSharp.WinForms.ChromiumWebBrowser("http://www.baidu.com"); //初始页面
WebBrowser.Dock = DockStyle.Fill;//设置停靠方式
this.Controls.Add(WebBrowser);//加入窗体
在程序初始化的时候,我们需要初始化浏览器参数,以前我都是这样初始化的:
1 2 | CefSharp.CefSettings setting = new CefSharp.CefSettings(); CefSharp.Cef.Initialize(setting); |
但是其实应该这样初始化:
1 2 | CefSharp.CefSettings setting = new CefSharp.CefSettings(); CefSharp.Cef.Initialize(setting, false, false); |
看接口注释:
//
// 摘要:
// Initializes CefSharp with user-provided settings. This function should be
// called on the main application thread to initialize the CEF browser process.
//
// 参数:
// cefSettings:
// CefSharp configuration settings.
//
// shutdownOnProcessExit:
// When the Current AppDomain (relative to the thread called on) Exits(ProcessExit
// event) then Shudown will be called.
//
// performDependencyCheck:
// Check that all relevant dependencies avaliable, throws exception if any are
// missing
public static bool Initialize(CefSettings cefSettings, bool shutdownOnProcessExit, bool performDependencyCheck);
第二个参数就是用来设置是否在退出的时候释放资源,默认为true,就会在当前页面退出的时候调用Shudown。然后Shudown就会把整个浏览器的资源释放掉。当浏览器资源被释放了以后,其他页面访问资源就变成了空指针访问,然后就会挂掉。
所以我们如果是做多页面窗口的话,需要手动将这个参数置为false。这样才能保证一个页面关闭时,其他页面不受影响。
至于当前被关闭页面的资源释放,我们需要显示的调用ChromiumWebBrowser的父控件的Dispose方法。如下官方示例代码所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private void CloseTabToolStripMenuItemClick(object sender, EventArgs e) { var currentIndex = browserTabControl.SelectedIndex; var tabPage = browserTabControl.Controls[currentIndex]; var control = GetCurrentTabControl(); if (control != null) { control.Dispose(); } browserTabControl.Controls.Remove(tabPage); tabPage.Dispose(); } |
最后,在主程序退出时,需要显式的调用CefSharp.Cef.Shutdown(),用来释放资源;比如FormClosing的时候。
另外,CefSharp.Cef.Initialize需要在和ChromiumWebBrowser使用的地方放在一起,不可跨DLL初始化。因为静态函数,静态变量是无法跨DLL使用的。所以如果初始化和使用的地方不在同一个DLL内,则无效。
最后
以上就是会撒娇悟空为你收集整理的cefsharp解决CefSharp.Cef.Shutdown() 时主程序退出的问题的全部内容,希望文章能够帮你解决cefsharp解决CefSharp.Cef.Shutdown() 时主程序退出的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复