Заменить элемент управления .NET WebBrowser на лучший браузер, такой как Chrome? - PullRequest
400 голосов
/ 26 апреля 2009

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

Насколько я понимаю, элемент управления WebBrowser является оберткой для 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 ]

155 голосов
/ 03 декабря 2010

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

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

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

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

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

Лицензия BSD

81 голосов
/ 26 апреля 2009

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

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

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

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

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

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

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

62 голосов
/ 03 февраля 2013

Я уже несколько дней тестирую альтернативы компоненту веб-браузера 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 * см. Ниже)

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. Распакуйте все и скопируйте все файлы в вашу папку \ Debug (или выпустите, если ваш проект готов к выпуску)
  6. Зайдите в визуальную студию дизайнера вашей формы, перейдите на панель инструментов, щелкните правой кнопкой мыши внутри -> Выбрать элементы -> Обзор -> Найти скачанный файл GeckoFX winforms dll -> OK
  7. Теперь у вас должен быть новый элемент управления GeckoWebBrowser

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

30 голосов
/ 31 декабря 2015

У меня была та же проблема, WebBrowser использовал старую версию IE, с некоторым гуглом наткнулся на следующий код, который вносит изменения в реестр и позволяет 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();
            }

VB.NET:

Imports Microsoft.Win32
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Security
Imports System.Text
Imports System.Threading.Tasks

Public Enum BrowserEmulationVersion
    [Default] = 0
    Version7 = 7000
    Version8 = 8000
    Version8Standards = 8888
    Version9 = 9000
    Version9Standards = 9999
    Version10 = 10000
    Version10Standards = 10001
    Version11 = 11000
    Version11Edge = 11001
End Enum


Public Class WBEmulator
    Private Const InternetExplorerRootKey As String = "Software\Microsoft\Internet Explorer"
    Public Shared Function GetInternetExplorerMajorVersion() As Integer

        Dim result As Integer

        result = 0

        Try
            Dim key As RegistryKey
            key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey)
            If key IsNot Nothing Then
                Dim value As Object = If(key.GetValue("svcVersion", Nothing), key.GetValue("Version", Nothing))

                Dim Version As String
                Dim separator As Integer
                Version = value.ToString()
                separator = Version.IndexOf(".")
                If separator <> -1 Then
                    Integer.TryParse(Version.Substring(0, separator), result)
                End If
            End If

        Catch ex As SecurityException
            'The user does Not have the permissions required to read from the registry key.
        Catch ex As UnauthorizedAccessException
            'The user does Not have the necessary registry rights.
        Catch

        End Try
        GetInternetExplorerMajorVersion = result
    End Function
    Private Const BrowserEmulationKey = InternetExplorerRootKey + "\Main\FeatureControl\FEATURE_BROWSER_EMULATION"

    Public Shared Function GetBrowserEmulationVersion() As BrowserEmulationVersion

        Dim result As BrowserEmulationVersion
        result = BrowserEmulationVersion.Default

        Try
            Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
            If key IsNot Nothing Then
                Dim programName As String
                Dim value As Object
                programName = Path.GetFileName(Environment.GetCommandLineArgs()(0))
                value = key.GetValue(programName, Nothing)
                If value IsNot Nothing Then
                    result = CType(Convert.ToInt32(value), BrowserEmulationVersion)
                End If
            End If
        Catch ex As SecurityException
            'The user does Not have the permissions required to read from the registry key.
        Catch ex As UnauthorizedAccessException
            'The user does Not have the necessary registry rights.
        Catch

        End Try

        GetBrowserEmulationVersion = result
    End Function
    Public Shared Function SetBrowserEmulationVersion(BEVersion As BrowserEmulationVersion) As Boolean

        Dim result As Boolean = False

        Try
            Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
            If key IsNot Nothing Then
                Dim programName As String = Path.GetFileName(Environment.GetCommandLineArgs()(0))
                If BEVersion <> BrowserEmulationVersion.Default Then
                    'if it's a valid value, update or create the value
                    key.SetValue(programName, CType(BEVersion, Integer), RegistryValueKind.DWord)
                Else
                    'otherwise, remove the existing value
                    key.DeleteValue(programName, False)
                End If
                result = True
            End If
        Catch ex As SecurityException

            ' The user does Not have the permissions required to read from the registry key.

        Catch ex As UnauthorizedAccessException

            ' The user does Not have the necessary registry rights.

        End Try

        SetBrowserEmulationVersion = result
    End Function


    Public Shared Function SetBrowserEmulationVersion() As Boolean
        Dim ieVersion As Integer
        Dim emulationCode As BrowserEmulationVersion
        ieVersion = GetInternetExplorerMajorVersion()

        If ieVersion >= 11 Then

            emulationCode = BrowserEmulationVersion.Version11
        Else

            Select Case ieVersion
                Case 10
                    emulationCode = BrowserEmulationVersion.Version10
                Case 9
                    emulationCode = BrowserEmulationVersion.Version9
                Case 8
                    emulationCode = BrowserEmulationVersion.Version8
                Case Else
                    emulationCode = BrowserEmulationVersion.Version7
            End Select
        End If

        SetBrowserEmulationVersion = SetBrowserEmulationVersion(emulationCode)
    End Function

    Public Shared Function IsBrowserEmulationSet() As Boolean
        IsBrowserEmulationSet = GetBrowserEmulationVersion() <> BrowserEmulationVersion.Default
    End Function
End Class

Вы можете использовать его как:

If Not WBEmulator.IsBrowserEmulationSet() Then
    WBEmulator.SetBrowserEmulationVersion()
End If
26 голосов
/ 24 октября 2011

Вы можете использовать реестр, чтобы установить версию 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#browser_emulation

18 голосов
/ 26 апреля 2009

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

15 голосов
/ 05 мая 2014

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

Так что просто положите:

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

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

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

Удачи.

12 голосов
/ 22 апреля 2015

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

8 голосов
/ 11 апреля 2012

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

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

6 голосов
/ 27 января 2014

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

...