CefSharp-基於C#的客戶端開發框架技術棧開發全記錄

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瀏覽器便可運行程序。

相關文章
相關標籤/搜索