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

в 19:04, , рубрики: .net, Awesomium, браузеры, метки: , ,

image

В определенный момент мне стало некомфортно использовать стандартный контрол WebBrouser, предлагаемый 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
Чтобы выполнить программно какой-либо JavaScrip пришлось идти на ухищрения, т.к. то ли функции, которые для этого по идее предназначены не дописаны в этой версии, то ли что-то еще. Но выход я нашел только такой:

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: он и работает стабильнее и функционал побогаче. Нагрузка от него небольшая. Единственный минус — это то, что не отрабатывает клик правой кнопкой по флешу, потому нельзя поменять необходимые параметры(возможно я просто не разобрался как). В остальном данная SDK меня во всем устроила.

Автор: Violetdrug

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js