Варианты встраивания Chromium вместо элемента управления IE WebBrowser с WPF/C#

Элемент управления WPF WebBrowser на основе Internet Explorer страдает некоторыми проблемами с клавиатурой и фокусировкой, а также проблемами утечки памяти. В качестве альтернативного решения этих проблем мы рассматриваем доступные варианты размещения Chromium вместо элемента управления WebBrowser в нашем проекте WPF/C#, основанном на редактировании 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

Не совсем на основе хрома и не использует движок V8, так что на самом деле это не вариант.

Есть ли другой вариант, который я мог упустить из виду?

Я был бы очень признателен, если бы кто-то поделился своим опытом с любым из вышеперечисленных вариантов для реального проекта WPF производственного качества. Были ли у вас какие-либо последствия для интеграции, лицензирования или развертывания? Спасибо.

[ИЗМЕНЕНО] Я также хотел бы поблагодарить artlung за поддержку этого вопроса, предоставив щедрое предложение за вознаграждение.

9 ответов

Решение

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

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

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

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

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

Взгляните на библиотеку 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");
        }
    }
}

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

введите описание изображения здесь

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

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

Вот еще один:

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

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

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

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

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

Вот решение.

Microsoft выпускает элемент управления WPF " Microsoft Edge WebView2 ", который предоставляет нам отличный бесплатный вариант для встраивания Chromium в Windows 10, Windows 8.1 или Windows 7. Он доступен через Nuget в виде пакета.Microsoft.Web.WebView2.

У меня была та же проблема с моим WPF RSS Reader, я изначально пошел с 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 });
    }
}

Если вы рассматриваете коммерческие решения, вы также можете взглянуть на DotNetBrowser.

Он имеет множество функций, которые вы можете использовать для глубокой интеграции (например, поддержка DOM, выполнение JavaScript, вызов объектов .NET из JavaScript, обработка сети и файлов cookie, печать веб-страниц из кода). Он основан на новейшем движке Chromium и поддерживает широкий спектр реализаций .NET, от .NET Framework 4.5 до .NET 6. Поддерживаются как WPF, так и Windows Forms.

Вот репозиторий, содержащий примеры, демонстрирующие, как его можно использовать в различных сценариях:https://github.com/TeamDev-IP/DotNetBrowser-Examples .

Он также доступен в NuGet:https://www.nuget.org/packages/DotNetBrowser/

Другие вопросы по тегам