CefSharp簡介
源於Google官方
CEF ,全稱Chromium Embedded Framework ,基於谷歌 Chromium項目的開源Web Browser控件,它的主要用途是嵌入了第三方應用以實現瀏覽器相關的功能。例如國內的360安全瀏覽器的兼容模式即IE的內核,極速模式即Chromium內核;最近微軟新推出的Microsoft Edge也是基於Chromium開源項目實現的,看起來挺簡潔的。
CEF地址:https://bitbucket.org/chromiumembedded/
而CefSharp是Cef的C#版本,讓Chromium瀏覽器也可嵌入WinForms 和WPF中。
CefSharp地址:http://cefsharp.github.io/
CefSharp用途
關於CefSharp的用途,目前接觸到的有:
1、部署開發的網頁程序:我想B/S項目也不會專門造"輪子"來部署web應用程序;
2、定制開發瀏覽器:國內很多瀏覽器都是基於Chromium來包裝的,如搜狗、360、QQ瀏覽器等;
3、特定的網頁處理:例如網頁爬蟲,除了可以使用強大的Python來做,CefSharp也可完成;
4、客戶端嵌入Web應用:例如項目中開發一套B/S應用,可以直接嵌入C/S中,不必重寫大量代碼。
如下圖所示,為了使用Cesium框架在C/S項目中,在完成Cesium的B/S功能開發后,通過CefSharp可嵌入到C/S中使用。
示例一:使用CefSharp加載百度地圖網頁:
示例二:使用CefSharp加載Cesium球。
CefSharp開發示例
第一步,新建VS項目(目前最新版79需要Framework4.5.2)后,修改平台為X86或X64,Cef有32和64位之分:
第二步,使用NuGet搜索cef,安裝CefSharp.WinForms,其他cef.redist、CefSharp三個將自動安裝,因為它們之間存在依賴關系。
第三步,寫入初始化瀏覽器代碼:
添加引用
using CefSharp;
using CefSharp.WinForms;
定義瀏覽器對象
public ChromiumWebBrowser ChromeBrowser;
初始化瀏覽器
//初始化瀏覽器並啟動
public void InitializeChromium()
{
//參數設置
CefSettings settings = new CefSettings();
Cef.Initialize(settings);
//創建實例
chromeBrowser = new ChromiumWebBrowser("https://www.baidu.com");
//添加控件
this.Controls.Add(chromeBrowser);
chromeBrowser.Dock = DockStyle.Fill;
}
第四步,調試運行,查看效果。
CefSharp應用——彈窗與右鍵
雖然能用CefSharp將web應用嵌入到窗體程序,但遇到標簽(_blank)會彈出一個窗口,而且在任意位置可以彈出右鍵菜單,需要解決這個問題才像一個真正的客戶端軟件。
不彈出子窗體
控制彈窗的接口是ILifeSpanHandler,並實現OnBeforePopup方法。如下:
定義LifeSpanHandler類:
using CefSharp;
using CefSharp.WinForms;
namespace CefTest
{
internal class LifeSpanHandler : ILifeSpanHandler
{
//彈出前觸發的事件
public bool OnBeforePopup(IWebBrowser webBrowser, IBrowser browser, IFrame frame, string targetUrl,
string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures,
IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
{
//使用源窗口打開鏈接,取消創建新窗口
newBrowser = null;
var chromiumWebBrowser = (ChromiumWebBrowser)webBrowser;
chromiumWebBrowser.Load(targetUrl);
return true;
}
public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
}
public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
return true;
}
public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
}
}
}
調用方式:
ChromeBrowser.LifeSpanHandler = new LifeSpanHandler();
禁用右鍵
禁用右鍵的接口是IContextMenuHandler,並實現OnBeforeContextMenu 方法。如下:
定義MenuHandler類:
using CefSharp;
namespace CefTest
{
internal class MenuHandler : IContextMenuHandler
{
public void OnBeforeContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
IMenuModel model)
{
model.Clear();
}
public bool OnContextMenuCommand(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
CefMenuCommand commandId, CefEventFlags eventFlags)
{
return false;
}
public void OnContextMenuDismissed(IWebBrowser webBrowser, IBrowser browser, IFrame frame)
{
}
public bool RunContextMenu(IWebBrowser webBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
IMenuModel model, IRunContextMenuCallback callback)
{
return false;
}
}
}
調用方式:
ChromeBrowser.MenuHandler = new MenuHandler();
CefSharp應用——High DPI問題
縮放比例問題
CefSharp第一個坑:在高分辨率電腦上,顯示比例非100%,比如125%或200%時,有兩個異常:控件邊緣出現空隙,不能完全填充;按鍵等交互控件無法點擊,有偏移。
125%的效果:
100%的效果:
解決方案
(1)手動將系統顯示比例調整回100%。也可通過程序配置來完成:添加應用程序清單文件(app.manifest)
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
(2)使用CEF自帶的方法:
Cef.EnableHighDPISupport();
參考
https://www.cnblogs.com/guolixiucai/p/7081975.html
https://github.com/cefsharp/CefSharp/blob/master/CefSharp.WinForms.Example/Program.cs
CefSharp應用——程序輸出
暫不管功能實現,我們先來了解一下程序輸出了些什么。
Cef輸出
輸出目錄中包括了CEF必選和可選的類庫和資源文件(加粗的為必選),它們的主要功能如下:
│ CefSharp.dll:CefSharp基礎類庫,定義了相關接口;
│ CefSharp.Core.dll:CefSharp核心類庫;
│ CefSharp.WinForms.dll:CefSharp組件類庫,如果是其他平台,可能是CefSharp.Wpf.dll、CefSharp.OffScreen.dll
│ CefSharp.BrowserSubprocess.Core.dll:加載多進程類庫,如果缺少,瀏覽器無法正常運行。
│ CefSharp.BrowserSubprocess.exe:同上
│ cef.pak:CEF資源文件,如果缺少,可能導致某些組件顯示或使用異常。
│ cef_100_percent.pak:同上。
│ cef_200_percent.pak:同上。
│ cef_extensions.pak:擴展應用資源文件,如果缺少,Chrome擴展將無法運行。
│ chrome_elf.dll:崩潰報告類庫,如果缺少,Chrome瀏覽器將無法正常運行。
│ d3dcompiler_47.dll:Windows Vista及以后系統需要文件。
│ debug.log:調試的日志,即Console輸出。
│ devtools_resources.pak:開發者工具資源文件,如果缺少,Chrome開發者工具將無法運行。
│ icudtl.dat:支持unicode文件。
│ libcef.dll:CEF的核心庫,包括js引擎、網頁加載渲染邏輯等,Release版有111M,有點大,沒辦法。
│ libEGL.dll:Direct3D支持文件,如果缺少,HTML5在渲染2D畫布,3D CSS,WebGL時失效。
│ libGLESv2.dll:同上
│ natives_blob.bin :V8引擎快照數據,不必深究
│ snapshot_blob.bin:同上
│ v8_context_snapshot.bin:同上
│ README.txt :開源協議文件,CefSharp遵循BSD協議。
├─GPUCache: GPU緩存目錄,自動生成。
│ data_0
│ data_1
│ data_2
│ data_3
│ index
├─locales 本地化資源,如果沒有,區域設置將配置默認語言環境"en-US"
│ am.pak
│ ……
│ en-US.pak
│ ……
│ zh-CN.pak
│ zh-TW.pak
└─swiftshader 在 CPU 上進行高性能圖形渲染的類件庫,OpenGL的替代者。
如果運行時顯示異常或報缺少依賴項,請對照檢查。
開源協議
CefSharp遵循BSD協議,它的規則相當比較自由,基本上可以"為所欲為",可任意修改源碼和發布,但不可:
(1)如果再次發布的產品中包含源代碼,則需要在源代碼中必須帶有原來代碼中的BSD協議;
(2)如果再發布的只是二進制類庫/軟件,則需要在類庫/軟件的文檔和版權聲明中包含原來代碼中的BSD協議;
(3)不可以用開源代碼的作者、機構等名義來做市場推廣。
輸出目錄
一大堆文件放在根目錄下,有點亂,可以把它放在新建的CefSharp文件夾下,然后通過修改配置來讀取它們。
在App.config中添加如下內容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="CefSharp" />
</assemblyBinding>
</runtime>
</configuration>
當然也可以用代碼來實現,其中CPUCache和delug.log是運行是產生的,只能和應用程序exe在一個目錄。
參考
https://blog.csdn.net/evil_119/article/details/78751310
Readme.txt
CefSharp/49環境文件下載及文件說明
完整的CefSharp/49環境文件,支持Flash,mp3及mp4,開發者可直接調用集成,沒必要去下載源碼編譯
CefSharp/49環境文件說明及要求
-
1).NET4.0
-
2)VC++2013運行庫
-
3)libcef.dll,natives_blob.bin,snapshot_blob.bin (必須,支持mp4時只要替換這三文件)
-
4)icudtl.dat (必須,數據文件)
-
5)CefSharp.Core.dll,CefSharp.dll,
CefSharp.BrowserSubprocess.exe,CefSharp.BrowserSubProcess.Core.dll (必須) -
6)locales目錄必須有en-US.pak文件(其它語言保留中文zh-CN.pak,其它可刪除)
-
7)cef.pak(沒有這包顯示亂碼)
-
8)pepflashplayer.dll (用於支持Flash,在CefSettings指定此文件)
-
9)其它包文件(測試沒有也可運行的包)
devtools_resources.pak (開發工具資源包)
cef_extensions.pak (Cef擴展包)
cef_100_percent.pak (100%包)
cef_200_percent.pak (200%包) -
10)3D環境(沒有這些文件運行不出錯,但HTML5的3D內容如2D)
libEGL.dll,libGLESv2.dll
Xp還要求:d3dcompiler_43.dll,d3dcompiler_47.dll -
11)項目調用文件,根據自己項目用不同文件(以下文件可以考慮直接把源碼放到自己的項目中)
CefSharp.WinForms.dll (Win窗口調用)
CefSharp.Wpf.dll (WPF應用調用)
CefSharp.OffScreen.dll (離屏調用[應是不顯示窗口調用的吧])
客戶端並不需要安裝chrome瀏覽器即可運行程序。