.NET (WPF and Windows Forms) bindings for the Chromium Embedded Frameworkhtml
web: https://github.com/cefsharp/CefSharpgit
nuget: Install-Package CefSharp.Wpfgithub
比較流行的第三方內嵌瀏覽器組件,雖然仍是一如既往的坑,可是最起碼不少人踩,因此就用它了。web
更多相關項目,請訪問代碼沉澱目錄瀏覽器
重要提示:請注意項目的版本,以官方最新版本爲準。微信
在好久好久以前,就有不少人提過在一個窗體程序內嵌入瀏覽器,因而我最後也用到了,因而就記錄一下踩得坑,留做備忘。ide
1. cef子進程的開始與關閉,若是你的程序出現了子進程的這種問題,請調用:網站
CefSharp.Cef.Shutdown();
2. 右鍵菜單問題,不少配置cefsharp都考慮到了,雖然實現起來各類麻煩。ui
class MyCefMenuHandler : CefSharp.IContextMenuHandler { // 其它方法的實現不是重點。 // 其它參數也不是重點。 public void OnBeforeContextMenu(IMenuModel model) { model.Clear(); } }
3. 網頁語言問題,不少網站會根據請求頭的區域標識,返回對應的語言的網頁,好比微信,因此咱們要標識我首選就是中文,先給我返回我認識的國語網頁。spa
// 其餘方法不是重點(不過實現一次接口你都想死,太多方法了!) // 其餘參數也不是重點 // 必定要從新覆蓋訪問頭,直接賦值沒卵用! 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 }