CefSharp簡介
源於Google官方
CEF ,全稱Chromium Embedded Framework ,基於谷歌 Chromium項目的開源Web Browser控件,它的主要用途是嵌入了第三方應用以實現瀏覽器相關的功能。例如國內的360安全瀏覽器的兼容模式即IE的內核,極速模式即Chromium內核;最近微軟新推出的Microsoft Edge也是基於Chromium開源項目實現的,看起來挺簡潔的。html
CEF地址:https://bitbucket.org/chromiumembedded/git
而CefSharp是Cef的C#版本,讓Chromium瀏覽器也可嵌入WinForms 和WPF中。
github
CefSharp地址:http://cefsharp.github.io/web
CefSharp用途
關於CefSharp的用途,目前接觸到的有:redis
一、部署開發的網頁程序:我想B/S項目也不會專門造"輪子"來部署web應用程序;chrome
二、定製開發瀏覽器:國內不少瀏覽器都是基於Chromium來包裝的,如搜狗、360、QQ瀏覽器等;網頁爬蟲
三、特定的網頁處理:例如網頁爬蟲,除了可使用強大的Python來作,CefSharp也可完成;swift
四、客戶端嵌入Web應用:例如項目中開發一套B/S應用,能夠直接嵌入C/S中,沒必要重寫大量代碼。windows
以下圖所示,爲了使用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瀏覽器便可運行程序。