cefsharp解决CefSharp.Cef.Shutdown() 时主程序退出的问题

 

 

 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)