.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 }