Опции для встраивания Chromium вместо IE WebBrowser с WPF/С#

Элемент управления WPF WebBrowser на основе Internet Explorer страдает некоторыми проблемами клавиатуры и фокуса и проблемами с утечкой памяти. В качестве альтернативного решения этих проблем мы рассматриваем доступные варианты размещения Chromium вместо управления WebBrowser в нашем проекте WPF/С#, основанном на редактировании HTML. Аналогичные вопросы были здесь. Я прочитал ответы и провел собственное исследование, , но я надеюсь получить дополнительную обратную связь от людей, которые действительно использовали любой из следующих вариантов в проектах качества производства:

Awesomium и Awesomium.NET

Это выглядит очень уместно, но мне не нравится тот факт, что проект не является открытым исходным кодом, а полный источник недоступен. Кроме того, это может быть излишним для нашего проекта, поскольку визуализация без экрана не является чем-то, от чего мы действительно зависим.

Chromium 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 за то, что вы дали этому вопросу толчок, предложив щедрое предложение щедрости.

Ответ 1

Вы уже перечислили наиболее заметные решения для встраивания 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.

Обновление Chrome Frame не имеет смысла, так как проект был отставной.

Ответ 2

У нас была точно такая же проблема некоторое время назад. Мы хотели использовать библиотеку с открытым исходным кодом CEF3, основанную на WPF и поддерживающую .NET 3.5.

Во-первых, автор CEF сам перечислил привязку для разных языков здесь.

Во-вторых, мы продолжили работу с привязкой .NET CEF3 с открытым исходным кодом, которая называется Xilium.CefGlue и имела хороший успех. В тех случаях, когда что-то не работает так, как вы ожидаете, автор обычно очень чувствителен к проблемам, открытым в встроенном трекер-битрейтете

До сих пор это хорошо нам помогло. Автор обновляет свою библиотеку для поддержки последних выпусков CEF3 и исправлений ошибок на регулярной основе.

Ответ 3

Вот еще один:

http://www.essentialobjects.com/Products/WebBrowser/Default.aspx

Этот также основан на новейшем движке Chrome, но он намного проще в использовании, чем CEF. Это одна .NET-библиотека, которую вы можете просто ссылаться и использовать.

Ответ 4

Взгляните на библиотеку DotNetBrowser, разработанную командой, к которой я принадлежу. Он предоставляет элементы управления браузером WPF и WinForms на основе Chromium, которые довольно легко встроить в приложение .NET. Он поддерживает все современные веб-стандарты, включая HTML5, CSS3 и JavaScript. Страница отображается так же, как в Google Chrome.

Библиотека наследует многопроцессную архитектуру Chromium - каждая веб-страница отображается в отдельном процессе Chromium, и приложение продолжает работать даже после сбоя плагина или любой другой непредвиденной ошибки на веб-странице.

Вот некоторые другие полезные функции, предоставляемые DotNetBrowser: есть возможность прослушивать события загрузки, обрабатывать сетевую активность, настраивать прокси, моделировать действия пользователя, работать с файлами cookie, получать доступ и изменять DOM, прослушивать события DOM, вызывать JavaScript из .NET и наоборот, используйте веб-камеру и микрофон на веб-странице, настройте обмен данными на основе WebRTC и многое другое.

Проверьте API Ссылка для более подробной информации.

Фрагмент кода ниже демонстрирует, как создать BrowserView, внедрить его в форму и загрузить 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");
        }
    }
}

Запустив приведенный выше пример, вы получите следующий вывод:

enter image description here

Библиотека коммерческая. Коммерческие лицензии включают пакеты поддержки для разных размеров команды. Также можно приобрести исходный код библиотеки.

Помимо собственной страницы, компонент доступен в виде пакета NuGet и пакета VSIX в Visual Studio Marketplace.

Ответ 5

Я использовал Awesomium.NET. Хотя мне не нравится тот факт, что он не с открытым исходным кодом, а также тот факт, что он использует довольно старый механизм рендеринга Webkit, он очень прост в использовании. Это о единственном одобрении, которое я могу ему дать.

Ответ 6

ОБНОВЛЕНИЕ 2018 МОЖЕТ:

Кроме того, вы можете встроить браузер Edge, но только для Windows 10.

Вот решение.

Ответ 7

У меня была такая же проблема с моим читателем WPF RSS, я изначально пошел с Awesomium (я думаю, версия 1.6) Awesomium замечательный. Вы получаете большой контроль за кешированием (изображения и HTML-контент), выполнение JavaScript, перехват загрузок и т.д. Это также очень быстро. Изоляция процесса означает, что при сбое браузера это не приведет к сбою приложения.

Но он также тяжелый, даже релиз сборки добавляет около 10-15 мб (не помню точное число) и, следовательно, небольшой штраф за запуск. Затем я понял, что только проблема, с которой я столкнулся с IE браузером, заключалась в том, что она будет периодически бросать ошибки JavaScript. Но это было исправлено с помощью следующего фрагмента.

Я почти не использовал свое приложение на 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 });
    }
}