Замена элемента управления.NET WebBrowser на лучший браузер, например, Chrome?

Есть ли относительно простой способ вставить современный браузер в приложение.NET?

Насколько я понимаю, WebBrowser control - это обертка для IE, которая не будет проблемой, за исключением того, что похоже, что это очень старая версия IE, со всем, что влечет за собой ошибки CSS, потенциальные риски безопасности (если механизм рендеринга не был ' Я могу ожидать, что проблемы переполнения буфера в zillion будут исправлены?) и другие проблемы.

Я использую Visual Studio C# (экспресс-издание - это имеет какое-то значение здесь?)

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

Я нуждаюсь:

  • Браузер, который может интегрироваться в окне моего приложения (не в отдельном окне)
  • Хорошая поддержка CSS, JS и других веб-технологий, наравне с любым современным браузером.
  • Основные функции браузера, такие как "навигация", "возврат", "перезагрузка"...
  • Либеральный доступ к коду страницы и вывод.

Я думал о Chrome, поскольку он поставляется под лицензией BSD, но я был бы так же доволен последней версией IE.

Насколько это возможно, я бы хотел, чтобы все было просто. Лучше всего было бы, если бы можно было исправить существующие WebBrowser контроль, который уже делает около 70% того, что мне нужно, но я не думаю, что это возможно.

Я нашел элемент управления ActiveX для Mozilla ( http://www.iol.ie/~locka/mozilla/control.htm), но похоже, что это старая версия, поэтому это не обязательно улучшение.

Я открыт для предложений

20 ответов

Оформить заказ CefSharp .Net bindings, проект, который я начал некоторое время назад, который, к счастью, был подхвачен сообществом и превратился в нечто замечательное.

Проект охватывает Chromium Embedded Framework и использовался в ряде крупных проектов, включая Windows-клиент Rdio, Facebook Messenger для Windows и Github для Windows.

Он имеет элементы управления браузером для WPF и Winforms и имеет множество функций и точек расширения. Будучи основанным на Chromium, он невероятно быстр.

Возьмите его из NuGet: Install-Package CefSharp.Wpf или же Install-Package CefSharp.WinForms

Ознакомьтесь с примерами и поделитесь своими мыслями / отзывами /pull-запросами: https://github.com/cefsharp/CefSharp

BSD Лицензированный

Chrome использует (ветвь) Webkit, если вы не знали, что также используется Safari. Вот несколько вопросов того же рода:

Один веб-набор не так хорош, как говорится в другом ответе, одна версия больше не работает (одна из кодов Google), а Mono - экспериментальная. Было бы неплохо, если бы кто-то попытался сделать для него достойную оболочку.NET, но это не то, что кому-то, похоже, захочется сделать - что удивительно, учитывая, что теперь у него есть поддержка HTML5 и так много других функций, что в IE(8).) двигателя не хватает.

Обновление (2014)

Существует новый проект с двойной лицензией, который позволяет вам встраивать Chrome в ваши.NET-приложения под названием Awesomium. Он поставляется с.NET API, но требует немало хаков для рендеринга (примеры рисуют окно браузера в буфер, рисуют буфер как изображение и обновляют по таймеру).

Я думаю, что это браузер, используемый Origin в Battlefield 3.

Обновление (2016)

Теперь есть DotnetBrowser, коммерческая альтернатива Awesomium. Это основано на Хроме.

Я уже несколько дней тестирую альтернативы компоненту веб-браузера C# и вот мой список:

1. Использование более новых версий IE 8,9:

Компонент веб-браузера IE7 не IE8? Как это изменить?

Плюсы:

  • Не требуется много работы, чтобы запустить его
  • некоторая поддержка HTML5/CSS3, если IE9, полная, если IE10

Минусы:

  • На целевой машине должна быть установлена ​​целевая версия IE, IE10 все еще находится в режиме предварительного просмотра на Win7

Это не требует большой работы, и вы можете получить некоторую поддержку HTML5 и CSS3, хотя в IE9 отсутствуют некоторые из лучших функций CSS3 и HTML5. Но я уверен, что вы могли бы запустить IE10 таким же образом. Проблема заключается в том, что в целевой системе должен быть установлен IE10, и, поскольку в Windows 7 он все еще находится в режиме предварительного просмотра, я бы посоветовал против него.

2. OpenWebKitSharp

OpenWebKitSharp - это оболочка.net для движка webkit, основанная на проекте WebKit.NET 0.5. WebKit - это механизм верстки, используемый Chrome/Safari

Плюсы:

  • Активно развивается
  • Поддержка HTML5/CSS3

Минусы:

  • Многие функции не реализованы
  • Не поддерживает x64 (приложение должно быть построено для x86)

OpenWebKit довольно приятный, хотя многие функции еще не реализованы, я столкнулся с несколькими проблемами при использовании его в Visual Studio, которая выбрасывает здесь нулевую ссылку на объект, а затем в режиме разработки возникают некоторые проблемы с js. Каждый, кто его использует, почти сразу заметит, что js alert ничего не делает. Такие события, как mouseup, mousedown... и т. Д. Не работают, js drag and drop содержит ошибки и т. Д.

У меня также были некоторые трудности с его установкой, так как для этого требуется установленная версия распространяемого VC, поэтому после исключения я посмотрел журнал событий, нашел версию VC и установил ее.

3. GeckoFX

Плюсы:

  • Работает на моно
  • Активно развивается
  • Поддержка HTML5/CSS3

Минусы:

  • D̶o̶e̶s̶n̶'̶t̶ ̶s̶u̶p̶p̶o̶r̶t̶ ̶x̶6̶4̶ ̶ (̶A̶p̶p̶ ̶m̶u̶s̶t̶ ̶b̶e̶ ̶b̶u̶i̶l̶t̶ ̶f̶o̶r̶ ̶x̶8̶6̶ ниже - см. Ниже - см. Ниже) ̶

GeckoFX - это кроссплатформенный веб-браузер для встраивания в приложения WinForms. Это можно использовать с.NET в Windows и с моно в Linux. Gecko - это механизм разметки, используемый Firefox.

Я наткнулся на немного информации о том, что GeckoFX активно не разрабатывается, что не соответствует действительности, конечно, это всегда одна или две версии Firefox, но это нормально, меня по-настоящему впечатлила активность и сам элемент управления. Он делает все, что мне нужно, но мне нужно было некоторое время, чтобы запустить его, вот небольшое руководство для его запуска:

  1. Загрузите GeckoFx-Windows-16.0-0.2, здесь вы можете проверить, доступен ли более новый GeckoFX
  2. Добавить ссылки на два загруженных DLL
  3. Поскольку GeckoFX является оберткой, вам нужен XulRunner, перейдите в Список версий, чтобы узнать, какая вам нужна.
  4. Теперь, когда мы знаем, какая версия XulRunner нам нужна, мы переходим к выпускам Mozilla XulRunner, идем в папку версий -> runtimes -> xulrunner-(your_version).en-US.win32.zip, в нашем случае xulrunner-16.0.en- US.win32.zip
  5. Разархивируйте все и скопируйте все файлы в ваш bin\Debug (или выпустите, если ваш проект настроен на выпуск)
  6. Зайдите в визуальный дизайн-студию вашей формы, перейдите на панель инструментов, щелкните правой кнопкой мыши внутри -> Выбрать элементы -> Обзор -> Найти загруженный файл DLL-форм winck GeckoFX -> ОК
  7. Теперь у вас должен быть новый элемент управления GeckoWebBrowser

Если вы действительно должны использовать Chrome, взгляните на этот продукт под названием Awesomium, он бесплатен для некоммерческих проектов, но лицензия для коммерческих целей составляет несколько тысяч долларов.

У меня была та же проблема, WebBrowser использовал старую версию IE, с некоторым поиском в Google я наткнулся на следующий код, который вносит изменения в реестр и позволяет WebBrowser использовать самую последнюю версию IE:

 public enum BrowserEmulationVersion
    {
        Default = 0,
        Version7 = 7000,
        Version8 = 8000,
        Version8Standards = 8888,
        Version9 = 9000,
        Version9Standards = 9999,
        Version10 = 10000,
        Version10Standards = 10001,
        Version11 = 11000,
        Version11Edge = 11001
    }
    public static class WBEmulator
    {
        private const string InternetExplorerRootKey = @"Software\Microsoft\Internet Explorer";

        public static int GetInternetExplorerMajorVersion()
        {
            int result;

            result = 0;

            try
            {
                RegistryKey key;

                key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey);

                if (key != null)
                {
                    object value;

                    value = key.GetValue("svcVersion", null) ?? key.GetValue("Version", null);

                    if (value != null)
                    {
                        string version;
                        int separator;

                        version = value.ToString();
                        separator = version.IndexOf('.');
                        if (separator != -1)
                        {
                            int.TryParse(version.Substring(0, separator), out result);
                        }
                    }
                }
            }
            catch (SecurityException)
            {
                // The user does not have the permissions required to read from the registry key.
            }
            catch (UnauthorizedAccessException)
            {
                // The user does not have the necessary registry rights.
            }

            return result;
        }
        private const string BrowserEmulationKey = InternetExplorerRootKey + @"\Main\FeatureControl\FEATURE_BROWSER_EMULATION";

        public static BrowserEmulationVersion GetBrowserEmulationVersion()
        {
            BrowserEmulationVersion result;

            result = BrowserEmulationVersion.Default;

            try
            {
                RegistryKey key;

                key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);
                if (key != null)
                {
                    string programName;
                    object value;

                    programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
                    value = key.GetValue(programName, null);

                    if (value != null)
                    {
                        result = (BrowserEmulationVersion)Convert.ToInt32(value);
                    }
                }
            }
            catch (SecurityException)
            {
                // The user does not have the permissions required to read from the registry key.
            }
            catch (UnauthorizedAccessException)
            {
                // The user does not have the necessary registry rights.
            }

            return result;
        }
        public static bool SetBrowserEmulationVersion(BrowserEmulationVersion browserEmulationVersion)
        {
            bool result;

            result = false;

            try
            {
                RegistryKey key;

                key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);

                if (key != null)
                {
                    string programName;

                    programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);

                    if (browserEmulationVersion != BrowserEmulationVersion.Default)
                    {
                        // if it's a valid value, update or create the value
                        key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord);
                    }
                    else
                    {
                        // otherwise, remove the existing value
                        key.DeleteValue(programName, false);
                    }

                    result = true;
                }
            }
            catch (SecurityException)
            {
                // The user does not have the permissions required to read from the registry key.
            }
            catch (UnauthorizedAccessException)
            {
                // The user does not have the necessary registry rights.
            }

            return result;
        }

        public static bool SetBrowserEmulationVersion()
        {
            int ieVersion;
            BrowserEmulationVersion emulationCode;

            ieVersion = GetInternetExplorerMajorVersion();

            if (ieVersion >= 11)
            {
                emulationCode = BrowserEmulationVersion.Version11;
            }
            else
            {
                switch (ieVersion)
                {
                    case 10:
                        emulationCode = BrowserEmulationVersion.Version10;
                        break;
                    case 9:
                        emulationCode = BrowserEmulationVersion.Version9;
                        break;
                    case 8:
                        emulationCode = BrowserEmulationVersion.Version8;
                        break;
                    default:
                        emulationCode = BrowserEmulationVersion.Version7;
                        break;
                }
            }

            return SetBrowserEmulationVersion(emulationCode);
        }
        public static bool IsBrowserEmulationSet()
        {
            return GetBrowserEmulationVersion() != BrowserEmulationVersion.Default;
        }
    } 

Вам просто нужно создать класс и поместить в него этот код, а затем запустить следующий код при запуске программы:

 if (!WBEmulator.IsBrowserEmulationSet())
            {
                WBEmulator.SetBrowserEmulationVersion();
            }

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

Если вы настраиваете приложение для запуска в Windows 10, то теперь вы можете встроить браузер Edge в свое приложение.net с помощью https://github.com/Microsoft/WindowsCommunityToolkit.

Пример WPF:

1) Установите пакет Nuget для Windows Community Toolkit

Install-Package Microsoft.Toolkit.Win32.UI.Controls -Version 3.0.0-preview

2) Код XAML

<Window
    x:Class="WebViewTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WPF="clr-namespace:Microsoft.Toolkit.Win32.UI.Controls.WPF;assembly=Microsoft.Toolkit.Win32.UI.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WebViewTest"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid>
        <WPF:WebView x:Name="wvc" />
    </Grid>
</Window>

3) код CS:

public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();

    // You can also use the Source property here or in the WPF designer
    wvc.Navigate(new Uri("https://www.microsoft.com"));
  }
}

Пример WinForms:

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();

    // You can also use the Source property here or in the designer
    webView1.Navigate(new Uri("https://www.microsoft.com"));
  }
}

Пожалуйста, обратитесь к этой ссылке для получения дополнительной информации.

Примечание. Эта библиотека находится на стадии предварительного просмотра.

Вы можете использовать реестр, чтобы установить версию IE для управления веб-браузером. Перейдите по адресу: HKLM\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION и добавьте "yourApplicationName.exe" со значением browser_emulation. Чтобы увидеть значение browser_emulation, перейдите по ссылке: http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx

Я знаю, что это не "заменяющий" элемент управления WebBrowser, но у меня были некоторые ужасные проблемы с рендерингом при отображении страницы, на которой использовался BootStrap 3+ для макета и т. Д., А затем я нашел сообщение, в котором предлагалось использовать следующее. По-видимому, он специфичен для IE и говорит ему использовать для рендеринга последний вариант, найденный на клиентском компьютере (поэтому он не будет использовать IE7, как я считаю, по умолчанию)

Так что просто поставьте:

<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

где-то в головной части вашего документа.

Если, конечно, это не ваш документ, то это, очевидно, не поможет (хотя я лично считаю, что это дыра в безопасности, если вы читаете страницы, созданные не вами самими через элемент управления веб-браузера - почему бы просто не использовать веб-браузер!)

Удачи.

Взгляните на элемент управления Mono.WebBrowser - он встраивает либо Gecko (как используется Firefox), либо WebKit (как используется Safari) в WinForms (без использования ActiveX).

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

Я попробовал несколько вариантов Webkit, но по моему опыту ничто не сравнится с достижениями OpenWebkitSharp. Любите это любите это.. Оценки HTML5 и CSS3 настолько близки, насколько они могут добраться до Google Chrome. Очень хорошая API и модель событий. Если вы найдете "не реализованные" API, скорее всего, потому что они не реализованы в Webkit. Все остальное прекрасно работает.

OpenWebKitSharp - это оболочка.net для движка webkit, основанная на проекте WebKit.NET 0.5. Он добавляет больше функциональности к версии 0.5 и предоставляет больше методов, чем эта сборка. OpenWebKitSharp поддерживает как Cairo build (0.5), так и ночные сборки webkit (по умолчанию Nightly). В Версии 1.5 Стабильная и более ночная сборка включена и автоматически копируется после сборки. В более ранних версиях это происходит со сборкой cairo. В настоящее время OpenWebKitSharp поддерживает GTLite Navigator, быстрый, стабильный и гибкий веб-браузер.

Попробуйте EO.WebBrowser. Он новый и основан на последней версии браузера Chrome. Самое приятное в этом то, что он упаковывает все в одну DLL-библиотеку.NET, так что она не только очень проста в использовании и развертывании, но также и одна и та же DLL поддерживает как 32-битную, так и 64-битную версию, потому что это DLL-библиотека.NET.

Я использовал GeckoFX, и он мне очень помогает. Он использует движок Firefox. Единственное предостережение, с которым я когда-либо сталкивался, это то, что он генерирует событие "DocumentLoaded" один раз до того, как документ действительно полностью загружен... Я думаю, что он выбрасывает один, когда HTML загружается, а затем еще один, когда все изображения и прочее загружены. Я исправил это, просто проигнорировав первый, и до сих пор он работал прекрасно.

Вы можете найти его здесь: https://bitbucket.org/geckofx/

Как и большинство приличных библиотек, он с открытым исходным кодом.

MozNet - это элемент управления.NET, ранее основанный на более или менее заброшенном элементе управления GeckoFX, но он находится в стадии полной разработки и имеет гораздо больше возможностей, чем GeckoFX. Вы можете найти его на сайте Se7en Soft.

Webview2 - на основе хрома (предварительная версия) теперь доступна как для winform, так и для wpf

Пожалуйста, посмотрите: https://docs.microsoft.com/en-us/microsoft-edge/webview2/

EO.BrowserControl это быстро и легко. Он имеет браузерный движок Chrome и работает с любой версией.NET

https://visualstudiogallery.msdn.microsoft.com/fcee0646-42e7-484f-b22e-f8b2ace55dd7

Примечание. Это коммерчески лицензированный продукт, и я не буду продвигать его с учетом этого. Попробовав разные вещи, я выбрал именно это.

Обновление 2016:

Есть 3 дополнительных варианта, которые я могу предложить:

1. BrowseEmAll.Cef

Компонент.Net, который можно использовать для интеграции движка Chrome в ваше приложение.Net. Основано на CefGlue, но немного быстрее на обновлениях до последней версии Chrome. Также есть коммерческая поддержка, которая может пригодиться для некоторых. Конечно, сам компонент с открытым исходным кодом.

2. BrowseEmAll.Gecko

Еще один компонент.Net, который можно использовать для интеграции движка Firefox в ваше приложение.Net. Это основано на Geckofx, но в отличие от текущей версии Geckofx, это будет работать с обычной версией Firefox. Чтобы использовать Geckofx, вам нужно собрать Firefox самостоятельно. Опять же коммерческая поддержка доступна, но сам компонент полностью с открытым исходным кодом.

3. BrowseEmAll Core API

Нужны все разные браузеры в вашем.Net приложении? Какой API-интерфейс BrowseEmAll Core вы можете интегрировать в свое приложение Chrome, Firefox, Webkit и Internet Explorer. Это коммерческий продукт, хотя будьте осторожны.

(Полное раскрытие: я работаю в этой компании, поэтому примите все, что я скажу, с долей соли)

Geckofx и Webkit.net поначалу были многообещающими, но они не шли в ногу с Firefox и Chrome соответственно, в то время как Internet Explorer улучшился, как и элемент управления Webbrowser, хотя он ведет себя как IE7 по умолчанию независимо от того, какую версию IE вы используете. есть, но это можно исправить, зайдя в реестр и изменив его на IE9, разрешив HTML5.

Проверьте элемент управления GeckoFX.

Если вы ищете хороший элемент управления на основе IE - проверьте: http://code.google.com/p/csexwb2/

Я использовал это в производстве продуктов. Это довольно хорошо и имеет хорошие демонстрационные версии, хотя, кажется, не поддерживается так же хорошо, как раньше.

Возможно, стоит взглянуть на коммерческий продукт, такой как WebKitX, здесь: https://www.webkitx.com/

Он использует Chromium Embedded Framework и отображает HTML5, WebGL, PDF и Flash в Windows XP, 7, 8, 10. Он также предоставляет 32-разрядные, а также 64-разрядные варианты управления.

Он предлагает доступ к DOM с использованием COM-объектов, подобных элементу управления IE WebBrowser:

Вы можете вызывать JavaScript по имени функции, передавая скалярные аргументы (не используя eval), а также он имеет обратные вызовы JavaScript для Angular:

Вы можете добавить свои собственные взаимодействующие COM-объекты в JavaScript:

Он поддерживает WebGL/WebAudio для игр HTML5, которые можно отключить для сред Citrix:

Я перепробовал все браузеры, которые там есть. К сожалению, единственным, кто действительно работал на меня при любых обстоятельствах, был Э.Браузер. Хотелось бы выбрать бесплатное решение, но я остановился на EO.Browser. Это довольно дорого, но в хорошем состоянии.

Обновление 2016:

Для меня единственная надежная, поддерживаемая браузерная альтернатива IE - это EO.WebBrowser. Я потратил дни и недели, пробуя другие. У всех них были некоторые проблемы, которые остановили шоу для меня в какой-то момент.

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