В определенный момент мне стало некомфортно использовать стандартный контрол WebBrowser, предлагаемый Visual Studio.
Причин было несколько:
1. Использовался IE-движок, что само по себе уже сильный аргумент.
2. Кривая работа с JS.
3. Отсутствие масштабирования.
4. Если запустить на машине, где стоит IE6, то все его «достоинства» переносятся на приложение.
В итоге был начат поиск альтернативных решений.
Было рассмотрено 2 SDK. xulrunner(Mozilla) и Awesomium(Chrome)
Подключение обоих происходит примерно одинаково, но на всякий случай опишу оба.
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
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 меня во всем устроила.