Варианты встраивания 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 и фильтруют использует хром мульти-процессная архитектура. Это также выглядит, как Adobe дает его некоторые утверждения.



Google Chrome Frame



в то время как первоначальная цель его должна была быть HTML5 плагин для IE и Firefox, он на самом деле работает как автономный элемент управления ActiveX тоже, так что я может обернуть его для использования с WPF. Он выставляет достаточный API для взаимодействия с внутренней веб-страницы (onmessage, addEventListener/removeEventListener, postMessage).
Я знаю, что Google-это прекратить Chrome Frame, но я предполагаю, что источники останутся в репозитории Chromium. Это не должно быть трудно обновить его с последним кодом хрома, как мы идем, и мы будем иметь полный контроль над этим.



в WebKit .Чистая обертка



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



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



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



[отредактировано]
Я также хотел бы поблагодарить artlung за то, что он дал этому вопросу импульс, предоставив щедрый щедрое предложение.

1838   7  

7 ответов:

вы уже перечислили наиболее известные решения для встраивания хрома (CEF, Chrome Frame, Awesomium). Нет больше проектов, которые имеют значение.

есть еще Berkelium (см. Berkelium Sharp и Беркулисом Управлял), но это emebeds старая версия хрома.

CEF это ваш лучший выбор - это полностью открытый исходный код и часто обновляется. Это единственный вариант, который позволяет добавьте последнюю версию Chromium. Теперь, когда Пер Лундберг активно работает над портированием CEF 3 на CefSharp, это самый лучший вариант для будущего. Есть также Xilium.CefGlue, но этот обеспечивает низкоуровневый API для CEF, он привязывается к C API CEF. CefSharp, с другой стороны, привязывается к API C++ CEF.

Adobe не является единственным крупным игроком, использующим CEF, см. другие известные приложения, использующие CEF на CEF Википедия страница.

обновление Хромированная Рама - это бессмысленно, так как проект был пенсии.

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

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

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

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

вот еще один:

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

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

посмотри DotNetBrowser библиотека, разработанная командой, к которой я принадлежу. Он предоставляет элементы управления браузером WPF и WinForms на основе хрома, которые довольно легко встроить в приложение .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.

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

ОБНОВЛЕНИЕ 2018 МАЯ:

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

вот решение.

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

но это также тяжело, даже релиз сборки добавляет около 10-15mb (не могу вспомнить точное число) и, следовательно, небольшой штраф запуска. Я тогда понял, что единственная проблема, которую я имел с управлением браузером 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 });
    }
}

Comments

    Ничего не найдено.