本文系原创。
前两天在工作中需要在Winform的窗体中内嵌的一个浏览器,我们都知道winform其实是自带了WebBroswer控件的,但是这个控件是IE的浏览器,存在这样那样的兼容性问题,不能完全满足的需求,所以就研究了下其他的开源浏览器框架,内嵌到我们的窗体中,完成了产品需求,以下做一个记录和分享。
由于产品是要做商用的,所以必须得考虑开源性和开源协议的问题。研究了Geckofx、CefSharp这两个组件,其中Geckofx的开源许可证为MPL,CefSharp开源许可证为BSD。
CefSharp
CEF(Chromium Embedded Framework, 嵌入式Chromium框架)是C/C++开发的库。目前 Google Chrome(Google浏览器),Chromium浏览器,Opera等都是基于CEF为核心,Webkit引擎的浏览器。
CefSharp组件的下载地址:https://www.nuget.org/packages/CefSharp.WinForms/49.0.1。注意下载的是NuGet包,需要自己安装到本地,CefSharp和.NET FrameWork版本要相对应,另外CEF不能自适应 x86/x64,必须选择一个目标,下载的包中是同时带了x86和x64依赖组件的,根据目标来选择使用,其中核心依赖的dll为:CefSharp.Core.dll、CefSharp.dll、CefSharp.WinForms.dll。
代码部分:
1 private void FormWebBroswer_Load(object sender, EventArgs e) 2 { 3 InitBroswer("https://www.cnblogs.com"); 4 } 5 6 private void InitBroswer(String url) 7 { 8 if (!Cef.IsInitialized) 9 { 10 var settings = new CefSettings() 11 { 12 Locale = "zh-CN", 13 AcceptLanguageList = "zh-CN", 14 MultiThreadedMessageLoop = true 15 }; 16 Cef.Initialize(settings); 17 18 Cef.EnableHighDPISupport(); 19 } 20 21 m_broswer = new ChromiumWebBrowser(url); 22 m_broswer.Dock = DockStyle.Fill; 23 m_panel.Controls.Add(m_broswer); 24 } 25 26 private void m_textBoxUrl_KeyDown(object sender, KeyEventArgs e) 27 { 28 if (e.KeyData == Keys.Enter) 29 { 30 if (m_broswer != null) 31 { 32 m_broswer.Load(m_textBoxUrl.Text); 33 } 34 } 35 }
注意:
- 同一个进程中打开多个浏览器时最好不要多次Cef.Initialize(settings),可能会有问题;
- Cef.EnableHighDPISupport(),可有效解决高分别率下屏幕闪烁问题。
效果:
Geckofx
Geckofx是skybound工作室开发的一个开源的用于方便将gecko引擎(最主要的浏览器是firefox)链接到.net 窗体应用的一个组件。
Geckofx下载地址:https://www.nuget.org/packages/Geckofx45,下载的时候同样也要考虑.NET FrameWork版本和目标平台,x86和x64实在不同的程序包中的,根据需要下载。依赖的组件主要包括Geckofx-Core.dll、Geckofx-Winforms.dll及运行时环境xulrunner。
编写代码:
1 private readonly String xulRunnerPath = Application.StartupPath + "/xulrunner"; 2 private GeckoWebBrowser m_webBrowser; 3 4 public FormWebBroswer() 5 { 6 InitializeComponent(); 7 if (!Xpcom.IsInitialized) 8 { 9 Xpcom.Initialize(xulRunnerPath); 10 } 11 } 12 13 private void FormWebBroswer_Load(object sender, EventArgs e) 14 { 15 m_webBrowser = new GeckoWebBrowser(); 16 m_webBrowser.Dock = DockStyle.Fill; 17 18 m_panelContainer.Controls.Add(m_webBrowser); 19 20 m_webBrowser.Navigate("https://www.sina.com.cn/"); 21 }
效果:
注意:Geckofx win64、.NET FrameWork4.0版本不太好找,个别版本存在内存泄漏问题,谨慎选择。
原文地址:https://www.cnblogs.com/mohanchen/p/9037975.html