Pull to refresh

Как подключить сторонний браузер в приложении на C#

Reading time3 min
Views99K
image

В определенный момент мне стало некомфортно использовать стандартный контрол WebBrowser, предлагаемый Visual Studio.
Причин было несколько:
1. Использовался IE-движок, что само по себе уже сильный аргумент.
2. Кривая работа с JS.
3. Отсутствие масштабирования.
4. Если запустить на машине, где стоит IE6, то все его «достоинства» переносятся на приложение.

В итоге был начат поиск альтернативных решений.
Было рассмотрено 2 SDK. xulrunner(Mozilla) и Awesomium(Chrome)

Подключение обоих происходит примерно одинаково, но на всякий случай опишу оба.


image
1. xulrunner
шаг 1
Идем на офицальный сайт http://ftp.mozilla.org/pub/mozilla.org/xulrunner/releases/
Выбираем подходящую нам версию.
Тут хотелось бы сделать маленькое отступление. Чем позднее версия, тем она тяжелее: к примеру, 1.9v весит 21Мб., а уже 19v весит 32Мб. Помимо этого каждая следующая версия требует все больше ресурсов. Забегая вперед скажу, что это и стало основной причиной отказа от этой SDK.

По данной ссылке заходим в папку с выбранной версией, далее sdk/xulrunner-X.X.en-US.win32.sdk.zip

шаг 2
Скачиваем и распаковываем содержимое. Нас интересует из архива только папочка bin. Копируем ее в папку с приложением и переименовываем в xulrunner. Имя можно и другое, но чтобы не было различий с моим описанием, лучше имя сделать такое.

шаг 3
Для работы с этой SDK нам потребуется библиотека Skybound.GeckoFX.bin.v1.9.1.0 Ее можно скачать тут http://code.google.com/p/geckofx/
Данная библиотека работает xulrunner версии 1.9.
Если вы решили использовать более позднюю версию, то нужно искать Skybound.GeckoFX 2.0, она подходит для версий 2.0 и выше.

шаг 4
В нашем приложении добавляем в References Skybound.Gecko.dll из скачанного архива

шаг 5
Правим класс Program:
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form2());
        }
    }


Инициализируем контрол браузера:
string path = "C:\\Program Files (x86)\\xulrunner\\";   //Путь к распакованной и переименованной папке bin из архива SDK
    Skybound.Gecko.Xpcom.Initialize(path);
    webBrowser1 = new Skybound.Gecko.GeckoWebBrowser();
    webBrowser1.Parent = this.panel1;
    webBrowser1.Dock = DockStyle.Fill;
    string u = "http://www.ya.ru";

    //Загрузка выбранной страницы
    webBrowser1.Navigate(u);


По данному коду родительской панелью будет panel1

шаг 6
Чтобы выполнить программно какой-либо JavaScript пришлось идти на ухищрения, т.к. то ли функции, которые для этого по идее предназначены не дописаны в этой версии, то ли что-то еще. Но выход я нашел только такой:

webBrowser1.Navigate("javascript:ImGecko()");


Минусом является то, что нельзя получить результат обработки, только в виде alert();
Данная проблема также стала причиной того, что я начал искать замену и пришел к Awesomium

image

2. Awesomium
шаг 1
Скачиваем SDK по ссылке http://awesomium.com/
На сайте имеется две версии — стабильная(1.6.5) и тестовая(1.7). Тестовая в целом работает лучше.
Для работы нам понадобятся файлы
Awesomium.Core.dll
Awesomium.dll
Awesomium.Windows.Controls.Design.dll
Awesomium.Windows.Controls.dll
Awesomium.Windows.Forms.dll

шаг 2
Подключаем к проекту библиотеки
Awesomium.Core.dll
Awesomium.Windows.Forms.dll

шаг 3
В Toolbox кликаем правой кнопкой и выбираем Choose Items. Далее жмем browse и подключаем Awesomium.Windows.Forms.dll, после этого у нас появится новые контролы WebControl, AddressBox и т.д. Нам в первую очередь важен WebControl

шаг 4
Размещаем контрол в дизайне

шаг 5
Примеры использования различных функций.

Открытие страниц
webControl1.LoadURL("http://ya.ru"); 


Загрузка Cookies
string cookie;  // Строка с cookie которые нужно подключить
string domen; // Домен 
string[] mascook;
mascook = cookie.Split(';');

Awesomium.Core.WebCore.ClearCookies();
foreach (string cook in mascook)
     Awesomium.Core.WebCore.SetCookie("http://" + domen, cook + "; domain=" + domen, true, true);


Получение значений переменных mx и my
            Awesomium.Core.JSValue x = webControl1.ExecuteJavascriptWithResult("mx", 500);
            Awesomium.Core.JSValue y = webControl1.ExecuteJavascriptWithResult("my", 500);


500 — это таймаут.

Вызов JS функции

webControl1.CallJavascriptFunction("", "al", new Awesomium.Core.JSValue[] {});


al — это имя функции
второй параметр передает значения в фунцию. В данном случае он пустой.

Приведенные примеры работают на Awesomium 1.6.5, в версии 1.7 немного изменена архитектура и некоторые методы могут отсутствовать или вызываться по другому.

Выводы
На текущий момент во всех проектах, где нужен браузер, использую Awesomium: он и работает стабильнее и функционал побогаче. Нагрузка от него небольшая. Единственный минус — это то, что не отрабатывает клик правой кнопкой по флешу, потому нельзя поменять необходимые параметры(возможно я просто не разобрался как). В остальном данная SDK меня во всем устроила.
Tags:
Hubs:
Total votes 77: ↑67 and ↓10+57
Comments52

Articles