【整理總結】代碼沉澱 - CefSharp - 比較流行的第三方內嵌瀏覽器組件

.NET (WPF and Windows Forms) bindings for the Chromium Embedded Framework

web: https://github.com/cefsharp/CefSharp

nuget: Install-Package CefSharp.Wpf

比較流行的第三方內嵌瀏覽器組件,雖然還是一如既往的坑,但是最起碼很多人踩,所以就用它了。


更多相關項目,請訪問代碼沉澱目錄

重要提示:請注意項目的版本,以官方最新版本爲準。


 

在很久很久之前,就有很多人提過在一個窗體程序內嵌入瀏覽器,於是我最後也用到了,於是就記錄一下踩得坑,留作備忘。

1. cef子進程的開始與關閉,如果你的程序出現了子進程的這種問題,請調用:

CefSharp.Cef.Shutdown();

2. 右鍵菜單問題,很多配置cefsharp都考慮到了,雖然實現起來各種麻煩。

class MyCefMenuHandler : CefSharp.IContextMenuHandler
{
    // 其它方法的實現不是重點。
    // 其它參數也不是重點。
    public void OnBeforeContextMenu(IMenuModel model)
    {
         model.Clear();
    }
}

3. 網頁語言問題,很多網站會根據請求頭的區域標識,返回對應的語言的網頁,比如微信,所以我們要標識我首選就是中文,先給我返回我認識的國語網頁。

    // 其他方法不是重點(不過實現一次接口你都想死,太多方法了!)
    // 其他參數也不是重點
    // 一定要重新覆蓋訪問頭,直接賦值沒卵用!
    public CefReturnValue OnBeforeResourceLoad(IRequest request)
    {
      var headers = request.Headers;
      headers.Set("accept-language", "zh-CN,zh;q=0.8,en;q=0.6");
      request.Headers = headers;
      return CefSharp.CefReturnValue.Continue;
    }

4. 大家可能都遇到的問題,WPF專用的CefSharp控件,不支持設計時,這你就沒法子了,我是覺得煩就後臺生成瀏覽器控件的實例,這一幫官方的開發人員也真是夠懶的,到現在了還不添加設計時支持,真是吃乾飯的。

5. 我看到exe同級目錄下那麼多dll,就蛋疼,於是就做了資源轉移,其他dll用的“Costura.Fody”,至於Cef方面的,就只能老老實實轉一大圈了。

 1 // 首先,讓Costura.Fody組件不合並CefSharp相關的資源文件,因爲非託管啥的資源還有子線程,你不可能真的都打包。
 2 // FodyWeavers.xml
 3 <Weavers>
 4   <Costura ExcludeAssemblies="CefSharp|CefSharp.Core|CefSharp.Wpf"/>
 5 </Weavers>
 6 // 接下來,我們不是把dll挪到別的目錄麼,程序啓動搜索dll,就要多一些地方,比如我放在子目錄裏。
 7 // App.Config
 8 <configuration>
 9   <runtime>
10     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
11       <probing privatePath="x86\cef" />
12     </assemblyBinding>
13   </runtime>
14 </configuration>
15 // 接下來,把cef相關的20個文件,locales目錄的53個文件全扔到x86\cef目錄裏,並修改Cef初始化配置。
16     internal static void Build()
17     {
18       string lib, browser, locales, res;
19       // Assigning file paths to varialbles
20       lib = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"x86\cef\libcef.dll");
21       browser = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"x86\cef\CefSharp.BrowserSubprocess.exe");
22       locales = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"x86\cef\locales\");
23       res = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"x86\cef\");
24       var settings = new CefSettings();
25       settings.BrowserSubprocessPath = browser;
26       settings.LocalesDirPath = locales;
27       settings.ResourcesDirPath = res;
28       Cef.Initialize(settings, true, null);
29     }
View Code

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章