Опции для встраивания Chromium вместо IE WebBrowser с WPF / C #
Основанный на Internet Explorer WPF WebBrowser контролирует некоторые проблемы с клавиатурой и фокусом, а также проблемы с утечкой памяти . В качестве альтернативного решения этих проблем мы рассматриваем доступные варианты размещения Chromium вместо управления WebBrowser в нашем проекте WPF / C #, основанном на редактировании HTML. Подобные вопросы заданы здесь ранее. Я прочитал ответы и провел собственное исследование, но я надеюсь получить еще больше отзывов от людей, которые фактически использовали любой из следующих вариантов в проектах качества продукции :
Awesomium и Awesomium.NET
Это выглядит очень уместно, но мне не нравится тот факт, что проект не является открытым исходным кодом, а полный источник недоступен. Кроме того, это может быть излишним для нашего проекта, поскольку нестандартное рендеринг не является чем-то, от чего мы действительно зависим.
- Как отформатировать число десятичных знаков в wpf с помощью стиля / шаблона?
- Как получить TreeViewItem из элемента HierarchicalDataTemplate?
- Прокрутите список в WPF в определенную строку
- Найти все элементы управления в окне WPF по типу
- Нет Main () в WPF?
Привязки Xromium Embedded Framework (CEF) и .NET для CEF
Вероятно, это лучший вариант. Проект кажется живым и активным, в настоящее время синхронизируется с Chrome v27. CEF3 использует многопроцессорную архитектуру Chrome. Похоже, что Adobe дает ему некоторое одобрение .
Google Chrome Frame
Хотя первоначальной целью было быть плагином HTML5 для IE и Firefox, он фактически работает как автономный элемент управления ActiveX, поэтому я могу обернуть его для использования с WPF. Он предоставляет достаточный API для взаимодействия с внутренней веб-страницей ( onmessage, addEventListener/removeEventListener, postMessage
). Я знаю, что Google должен прекратить работу Chrome Frame, но я предполагаю, что источники останутся в репозитории Chromium. Не составит труда обновить его с помощью последнего кода Chromium, и мы будем иметь полный контроль над этим.
Оболочка WebKit .NET
Не совсем Chromium-based и не использует двигатель V8, так что это не вариант.
Есть ли другой вариант, который я мог бы упустить?
Я был бы очень признателен, если бы кто-то поделился своим опытом с любым из вышеперечисленных вариантов реалистичного проекта WPF в сфере производства. Были ли у вас какие-либо последствия интеграции, лицензирования или развертывания? Спасибо.
[EDITED] Я также хотел бы поблагодарить artlung за то, что вы получили этот вопрос, предложив щедрое предложение.
- Изменение цвета кнопки, когда мышь закончилась
- Хорошая или плохая практика для Dialogs в wpf с MVVM?
- WPF: установка ширины (и высоты) в процентах
- Какие приложения WPF реального мира существуют?
- Неактивность и активность WPF
- Как я могу уменьшить код привязки RadioButton?
- Выполнить команду CMD из кода
- Убедитесь, что приложение не работает в течение определенного периода времени и блокирует его
Вы уже указали наиболее заметные решения для внедрения Chromium (CEF, Chrome Frame, Awesomium). Больше никаких проектов не имеет значения.
Существует еще проект Berkelium (см. Berkelium Sharp и Berkelium Managed ), но он содержит старую версию Chromium.
CEF – ваш лучший выбор – он полностью открыт и часто обновляется. Это единственный вариант, который позволяет вам вставлять последнюю версию Chromium. Теперь, когда Пер Лундберг активно работает над портированием CEF 3 на CefSharp , это лучший вариант для будущего. Существует также Xilium.CefGlue , но он обеспечивает API низкого уровня для CEF, он связывается с C API CEF. С другой стороны, CefSharp связывается с C ++ API CEF.
Adobe не является единственным крупным игроком, использующим CEF, см. Другие известные приложения, использующие CEF на странице CEF wikipedia .
Обновление Chrome Frame бессмысленно, поскольку проект был удален.
Некоторое время назад у нас был такой же вызов. Мы хотели использовать библиотеку с открытым исходным кодом CEF3, основанную на WPF и поддерживающую .NET 3.5.
Во-первых, автор CEF сам перечислил обязательство для разных языков здесь .
Во-вторых, мы продолжили связывание .NET CEF3 с открытым исходным кодом, которое называется Xilium.CefGlue, и с ним успешно справились . В тех случаях, когда что-то не работает так, как вы ожидаете, автор, как правило, очень реагирует на проблемы, открытые во встроенном трекере Bitbucket
Пока это нам хорошо. Автор обновляет свою библиотеку для поддержки последних выпусков CEF3 и исправлений ошибок на обычных базах.
Вот еще один:
http://www.essentialobjects.com/Products/WebBrowser/Default.aspx
Этот также основан на новейшем движке Chrome, но он намного проще в использовании, чем CEF. Это единственная .NET-библиотека, которую вы можете просто ссылаться и использовать.
Взгляните на библиотеку DotNetBrowser, разработанную командой, к которой я принадлежу. Он предоставляет элементы управления браузером WPF и WinForms на основе Chromium, которые довольно легко внедрить в приложение .NET. Он поддерживает все современные веб-стандарты, включая HTML5, CSS3 и JavaScript. Отображаемая страница выглядит точно так же, как в Google Chrome.
Библиотека наследует многопроцессорную архитектуру Chromium – каждая веб-страница отображается в отдельном хромовом процессе, и приложение будет продолжать работать даже после сбоя плагина или любой другой непредвиденной ошибки на веб-странице.
Вот некоторые другие полезные функции, предоставляемые DotNetBrowser: можно прослушивать события загрузки, обрабатывать сетевую активность, настраивать прокси, имитировать действия пользователя, работать с кукисами, получать доступ и изменять DOM, прослушивать события DOM, вызывать JavaScript из .NET. и наоборот, используйте веб-камеру и микрофон на веб-странице, настройте связь на базе WebRTC и многое другое .
Ознакомьтесь с API Reference для получения более подробной информации.
В приведенном ниже fragmentе кода показано, как создать браузер, вставить его в форму и загрузить URL-адрес:
using System.Windows.Forms; using DotNetBrowser; using DotNetBrowser.WinForms; namespace WinForms.DotNetBrowser { public partial class Form1 : Form { public Form1() { InitializeComponent(); BrowserView browserView = new WinFormsBrowserView(); Controls.Add((Control) browserView); browserView.Browser.LoadURL("http://www.youtube.com"); } } }
После запуска приведенного выше примера вы получите следующий результат:
Библиотека является коммерческой, однако она бесплатна для использования в проектах Open Source и Academic. Коммерческие лицензии include пакеты поддержки для разных размеров команды. Также возможно приобрести исходный код библиотеки.
Помимо собственной страницы компонент доступен как пакет NuGet и как пакет VSIX в Visual Studio Marketplace.
Я использовал Awesomium.NET. Хотя мне не нравится тот факт, что он не является открытым исходным кодом, а также тот факт, что он использует довольно старый механизм рендеринга Webkit, он действительно прост в использовании. Это единственное подтверждение, которое я могу ему дать.
ОБНОВЛЕНИЕ 2018 МОЖЕТ:
Кроме того, вы можете вставлять браузер Edge, но только нацеливать windows 10.
Вот решение.
У меня была такая же проблема с моим читателем WPF RSS, я изначально ушел с Awesomium (я думаю, версия 1.6) Awesomium замечательный. Вы получаете большой контроль за кешированием (изображения и HTML-контент), выполнение JavaScript, перехват загрузок и т. Д. Это также очень быстро. Изоляция процесса означает, что при сбое браузера это не приведет к сбою приложения.
Но он также тяжелый, даже релиз сборки добавляет около 10-15 мб (не помню точное число) и, следовательно, небольшой штраф за запуск. Затем я понял, что только проблема, с которой я столкнулся с IE браузером, заключалась в том, что она будет периодически бросать ошибки JavaScript. Но это было исправлено следующим fragmentом.
Я почти не использовал свое приложение на XP или Vista, но на Win 7 и выше он никогда не разбивался (по крайней мере, не потому, что я использовал браузер IE)
IOleServiceProvider sp = browser.Document as IOleServiceProvider; if (sp != null) { IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046"); Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E"); webBrowser; sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser); if (webBrowser != null) { webBrowser.GetType().InvokeMember("Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent }); } }