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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM