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

158

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

noseratio
источник

Ответы:

124

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

Чарек Томчак
источник
Вы также забыли сказать, что половина вещей не будет работать ... например, очистка файлов cookie, кэш-память ... настройка прокси и т. Д. Просто используйте Awesomium и сохраните свои данные, не тратя время.
4
Хе-хе, хороший ответ Czarek, спасибо за кредит. :) (не видел это до сих пор)
Per Lundberg
4
Конечно, стоит отметить: в любом проекте с открытым исходным кодом могут явно отсутствовать некоторые вещи. Ни Xilium.CefGlue, ни CefSharp не являются исключениями из этого правила. Хорошая вещь о материалах с открытым исходным кодом заключается в том, что вы действительно можете потратить (достаточно низкое) количество времени на изучение небольшой проблемы и включить в нее исправление. Мы видим это время от времени с CefSharp, и это довольно опрятно.
По Лундбергу
1
Поправьте меня, если я ошибаюсь, но не требует ли CefSharp библиотеки DLL объемом более 50 МБ? Это приводит к гигантской установке установки. Libcef.dll указана в качестве основной зависимости и это 38MB
Krafty
2
@Krafty Установочные установки позволяют упаковать его, используя алгоритмы, такие как 7z, и это приводит к уменьшению размера с 55 МБ до 17 МБ. Размер CefSharp невелик по сравнению с Google Chrome, который имеет 152 МБ в распакованном виде и 40 МБ в упакованном виде.
Чаре Томчак
11

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

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

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

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

Артем
источник
2
Это на самом деле точка зрения (с другой стороны, в данном случае это CefSharp) - CefSharp 4.0 только через несколько месяцев из-за проблем с поддержкой 3.5 с более новыми наборами инструментов VS. (VS2010 + не может поддерживать старые фреймворки с C ++ / CLI, что немного грустно, потому что заставляет нас использовать .NET 4 или действительно старую версию Visual Studio ...)
Per Lundberg
8

Вот еще один:

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

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

Джейсон
источник
Поддержка тоже фантастическая.
huseyint
3
Кажется, на этом сайте отсутствует основная информация - какая версия Chrome включена?
Чаре Томчак
2
О-о, не бесплатно. НЕ БЕСПЛАТНО. О чем думали эти парни? :)
dkellner
Здесь следует сразу заявить, что, хотя есть пробная версия, она не бесплатна.
Евилан
8

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

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

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

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

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

Владимир
источник
1
выглядит корректно, и я встроил пробную версию в мое приложение. Единственная проблема заключается в том, что это коммерческий продукт, а лицензия не очень дешевая. В противном случае, выглядит солидно для меня.
ДоронГ
К сожалению, DotNetBrowser не является бесплатным! : /
Дениз
4

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

Мин Слогар
источник
1
Не могли бы вы рассказать, насколько велика была ваша база пользователей для этого проекта?
Носовое отношение
Я никогда не разворачивал проект, поэтому база пользователей была нулевой. Я сам экспериментировал только с вариантами.
Мин Слогар
2
Я месяцами страдал, поддерживая приложение C # на основе Awesomium; это может качаться для игр C ++, но в C # их управление браузером совершенно ошибочно. Сложное развертывание (вам нужен их странный установщик для добавления материала в GAC), ошибочное поведение (иногда оно запускается с черным экраном, пользователь должен перезапустить приложение вручную) и его медленная скорость (веб-страницы НЕ отображаются при загрузке вроде как зависает, пока страница полностью / наполовину загружена, и инициализация на медленной машине занимает 5-10 секунд)
TheFlash
5
Я наконец-то пошел с CefSharp, и результаты были потрясающими. <100 мс инициализации (т. Е. Моментальная инициализация) и никаких «ошибок». Материал просто работает. Как это должно. Также CefSharp НЕ нужно добавлять в GAC, поэтому не нужно вносить изменения в установщик. Просто скопируйте ваши файлы и уходите. Я упоминал, что CEF / CefSharp лучше, чем каждая библиотека Mozilla / WebKit C #, которую я тестировал? Ох, и ради всего святого, не используйте IE. Оно работает. Да, так и есть, но у него нет функций, и он работает очень плохо (скорость).
TheFlash
1
@RobinRodricks Точно мой опыт тоже. Я почти отказался от подхода, но потом я нашел CefSharp :-) (И кого сейчас волнует пара МБ больше, когда драйверы принтера выходят на DVD :-)?)
Ксан-Кун Кларк-Дэвис,
4

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

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

Вот решение.

Рахул
источник
2

У меня была та же проблема с моим 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 });
    }
}
Самир Вартак
источник
Спасибо за ответ. Так вы в конце концов вернулись к IE из Awesomium?
Носовое отношение
Да, я сделал. и я был счастлив. Я использую ClickOnce, поэтому развертываемое приложение было крошечным и не зависало при запуске!
Самир Вартак
Спасибо, я проголосовал за ваш ответ. Кстати, есть еще один способ получить внутренний IWebBrowser2интерфейс.
Носовое отношение
Прохладно. элементы управления Activex работают в WPF? Спасибо за
предварительное
Извините, не читал ссылочную ссылку внимательно. Да, это образец XAML, и он работает. Спасибо.
Самир Вартак
1

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

scottheckel
источник
Это отличный вариант, хотя сейчас 2020 год, и сегодня я бы искал кроссплатформенное решение, например, Chromely .
noseratio
1
Я думаю, это зависит от того, хотите ли вы добавить немного веб-контента в настольное приложение или настольное приложение, созданное как веб-приложение. Я думаю, что вы бы использовали WebView2 только в том случае, если в настольном приложении было немного веб-контента.
scottheckel