Silverlight-приложения вне браузера
140Silverlight 5 --- Приложения вне браузера
Как вы уже знаете, код каждого приложения Silverlight находится в файле XAP. Надстройка браузера загружает файл ХАР с веб-сервера и выполняет его на клиентском компьютере. Начиная с этого момента снова обращаться к вебсерверу не обязательно. Весь код выполняется локально.
Таким образом, приложение Silverlight зависит от надстройки браузера, но оно не обязательно должно быть внедрено на веб-страницу. Фактически, если есть надежный способ выполнить надстройку Silverlight вне браузера, должен также существовать способ выполнить приложение Silverlight без браузера.
Это весьма важная идея, на которой основано выполнение приложения вне браузера. Для его запуска пользователь посещает веб-сайт, с помощью которого загружает и устанавливает приложение Silverlight. После установки приложение можно запускать в отдельном окне с рабочего стола или с помощью меню кнопки "Пуск". Приложение вне браузера работает почти так же, как обычное приложение Silverlight, хостируемое веб-страницей. Пользователь может даже загрузить и автоматически установить обновления на клиентском компьютере.
В Silverlight 5 добавлено несколько новых средств, доступных в приложениях с повышенной доверительностью. Теперь приложение может создавать новые окна, вызывать машинный код посредством P/Invoke, получать доступ к жесткому диску со всеми привилегиями текущего пользователя и т.п. Кроме того, приложение Silverlight 5 может выполняться с повышенным уровнем доверительности также в среде браузера, однако для этого необходима специальная конфигурация клиентской части.
Поддержка приложений вне браузера
В первую очередь необходимо понимать, что, хотя приложение Silverlight выполняется за пределами браузера, все же он неявно используется. Приложение скрывает присутствие браузера.
Специальный инструмент sllauncher.exe (в операционной системе Windows его можно найти в папке Program Files\Microsoft Silverlight\) создает изолированное окно, хостирующее элемент управления браузера. Окно браузера очищено от всех элементов управления (панелей инструментов, кнопок навигации, предпочтений и т.п.), остается лишь голая рамка.
Приложения вне браузера могут работать на всех платформах, поддерживающих Silverlight, включая Windows и Mac. На рисунке ниже показано приложение, выполняющееся вне браузера:
Таким образом, отсутствие браузера — не более чем иллюзия. Зачем же тогда нужен этот режим? Существует несколько причин его использования:
Доступ к рабочему столу. Приложение вне браузера должно быть установлено. В процессе установки загружается файл XAP и добавляются ярлык на рабочий стол и пункт в меню Start (Пуск). Поэтому для запуска приложения пользователю не нужно активизировать браузер и вводить URL-адрес.
Выполнение приложения в автономном режиме. Обычно доступ к приложению Silverlight осуществляется посредством веб-страницы, расположенной в глобальной или локальной сети. В результате пользователь не может выполнить приложение, если нет сетевого соединения. В то же время, после установки приложения вне браузера его копия копируется локально и сохраняется навсегда (естественно, пока пользователь не удалит ее явно).
Поддержка непостоянных соединений. Эта причина использования режима вне браузера похожа на предыдущую, но представляет более распространенный сценарий.
Многие пользователи (особенно применяющие портативные ноутбуки и беспроводное соединение с Интернетом) не имеют постоянного соединения. С помощью режима вне браузера (и средств проверки наличия соединения) можно создать приложение, работоспособное как при наличии, так и при отсутствии соединения. Когда оно есть, приложение может обратиться к веб-службе, чтобы обновить данные и выполнить необходимые операции на сервере. Когда соединения нет, пользователь может продолжать работать с ним в автономном режиме.
Получение преимуществ режима повышенной доверительности. Важно отметить, что режим повышенной доверительности имеет ряд существенных недостатков. В большинстве реальных ситуаций приложения вне браузера создают именно для получения привилегий повышенной доверительности.
Приложения, выполняющиеся вне браузера, обладают теми же возможностями, что и выполняющиеся в браузере. Однако между ними есть одно существенное различие: начальное выделение дискового пространства. Каждое приложение Silverlight получает "во владение" тщательно изолированную область диска, в которой оно создает и хранит файлы.
Обычно приложение, выполняющееся в браузере, получает сначала 1 Мбайт дискового пространства (доступный объем может быть увеличен при явном запросе пользователя). В то же время приложение вне браузера получает значительно больший объем — 25 Мбайт, поэтому увеличивать доступное пространство нет необходимости почти никогда.
Создание приложения вне браузера
Чтобы выполнять приложение Silverlight вне окна браузера, пользователь должен сначала установить его локально. Однако для этого разработчик приложения должен явно разрешить установку, выполнив следующие операции:
Дважды щелкните в узле Properties окна Solution Explorer. Будет выведено окно с конфигурационными параметрами приложения.
Откройте вкладку Silverlight.
Установите флажок Enable running application out of the browser (Включить выполнение приложения за пределами браузера).
(Необязательно.) Щелкните на кнопке Out-of-Browser Settings (Параметры приложения вне браузера). Откроется окно, в котором можно установить дополнительные параметры выполнения:
В окне можно установить следующие дополнительные конфигурационные параметры:
- Window Title
Имя, приведенное в строке заголовка окна, в котором отображено приложение.
- Width и Height
Начальные размеры окна. После запуска приложения пользователь может изменить их путем перетаскивания границ. Если не задать ширину и высоту, будет создано окно размером 800x600 пикселей.
- Set window location manually
Если этот флажок установлен, вы сможете ввести координаты верхнего левого угла окна в пикселях. Если флажок снят, надстройка Silverlight расположит окно в центре экрана.
- Shortcut name
Имя ярлыка.
- Application description
Описательный текст, выводимый во всплывающем окне подсказки, которое появляется при наведении указателя на ярлык приложения.
- Icon settings
Настройка изображений, используемых в инсталляционном окне и ярлыках.
- Enable GPU Acceleration
Этот флажок определяет, используется ли приложением кеш видеокарты, ускоряющий выполнение в некоторых ситуациях. Установка флажка лишь разрешает использование кеша. Будет ли он фактически использоваться, определяют элементы приложения.
- Show install menu
Если этот флажок установлен, то после щелчка пользователем правой кнопкой мыши в области содержимого Silverlight отобразится инсталляционное меню приложения. Если флажок не установлен, процесс инсталляции должен запускаться программно.
- Require elevated trust when running outside the browser
Этот флажок задает присвоение приложению статуса повышенной доверительности, в результате чего оно получает дополнительные привилегии. В этом случае при инсталляции приложения пользователь получает предупреждения системы безопасности.
Введенные в окне значения сохраняются в файле OutOfBrowserSettings.xml, принадлежащем проекту Silverlight.
После выполнения указанных операций приложение получает право быть установленным локально и выполняться за пределами браузера. Однако устанавливать его не обязательно. Пользователь может выполнять его в браузере в стандартном окне Silverlight.
Установка приложения вне браузера
Существуют два способа установки. При использовании первого способа пользователь выполняет установку явно. Для этого он должен запросить входную страницу приложения, щелкнуть правой кнопкой мыши в области содержимого Silverlight и выбрать команду Install имя_приложения onto this computer (Установить приложение имя_приложения на этот компьютер):
Другой способ состоит в программном запуске процедуры установки путем вызова метода Application.Install(). Его нужно вызвать в обработчике события, реагирующем на какое-либо действие пользователя. Таким действием может быть, например, щелчок на кнопке. Метод Install() возвращает значение true, если пользователь подтвердил необходимость установки, и false — если отменил установку.
Метод Install() может создать следующую проблему: если приложение уже установлено на локальном компьютере, он генерирует исключение, даже если пользователь в данный момент выполняет приложение в браузере. Чтобы избежать появления ошибки, нужно проверить значение Application.InstallState перед вызовом метода Install(). Ниже приведен код, обрабатывающий щелчок на кнопке:
private void AppInstallButton_Click_1(object sender, RoutedEventArgs e)
{
// Проверка, установлено ли приложение
if (Application.Current.InstallState != InstallState.Installed)
{
// Установка приложения с согласия пользователя
bool install = Application.Current.Install();
if (!install)
MessageBox.Show("Установка отменена.");
else
{
AppInstallButton.IsEnabled = false;
MessageBox.Show("Приложение устанавливается ...");
}
}
else
MessageBox.Show("Приложение уже установлено");
}
Можно удалить пункт установки из меню Silverlight и принудительно установить приложение с помощью кода. Для этого снимите флажок Show install menu (Показывать меню инсталляции) в окне Out-of-Browser Settings (Параметры установки приложения вне браузера). Обычно так делают, когда нужно выполнить перед установкой другие операции, такие как сбор информации о пользователе или вызов веб-службы.
Когда приложение начинает устанавливаться (пользователем или с помощью метода Install()), появляется инсталляционное окно, предлагающее подтвердить необходимость установки:
В инсталляционном окне приведена следующая информация:
Имя приложения, указывающее на домен, в котором оно хостируется (или файл, выполняющийся локально, если сайт ASP.NET не используется).
Гиперссылка More Information (Подробнее). После щелчка на ней открывается еще одно окно браузера, и в него загружается страница сайта Silverlight, на которой описаны средства приложений вне браузера.
Два флажка позволяют создать пункт приложения в системном меню Start (Пуск) и ярлык на рабочем столе. Если снять оба флажка, кнопка ОК будет отключена, в результате чего установка станет невозможной. Важно отметить также, что пункт приложения создается в системном меню верхнего уровня, а не в подгруппе.
В операционной системе Mac инсталляционное окно выглядит немного иначе, соответственно особенностям платформы. Например, в нем нет флажка, задающего создание ярлыка. Вместо этого пользователь должен перетащить узел приложения в нужное место после окончания установки (так обычно устанавливаются приложения в Mac).
Важная особенность инсталляционного окна состоит в том, что оно ясно и без грозных предупреждений (чтобы неопытный пользователь не передумал) сообщает о том, что сейчас произойдет. Для установки не нужна учетная запись администратора или повышенные привилегии. Предупреждения системы безопасности не появляются ни до, ни после установки.
Сравните такое поведение с установкой стандартного приложения .NET, и вы убедитесь в том, что в Silverlight процесс установки намного более дружественный. Это сделано для того, чтобы неопытный пользователь, напуганный непонятными фразами о безопасности, не отказался устанавливать приложение.
Процедура установки размещает приложение в случайно сгенерированной папке профиля текущего пользователя. Немедленно после установки приложения оно автоматически запускается в отдельном окне. Однако текущее окно браузера остается открытым. В результате на экране отображаются два выполняющихся экземпляра приложения. Устранить эту проблему можно с помощью события InstallStateChanged.
Настройка пиктограмм
Изображение, выводимое в инсталляционном окне по умолчанию, намного лучше, чем угрожающая пиктограмма предупреждения. Однако можно задать вывод еще лучшего изображения, выбранного вами лично и соответствующего характеру приложения. Пиктограммы используются в разных местах приложения, выполняемого вне браузера:
Изображение 16x16 пикселей используется в пиктограмме приложения, выводимой в строке заголовка и в меню Start (Пуск).
Изображение 32x32 используется в пиктограмме ярлыка на рабочем столе и в других крупных пиктограммах.
Изображение 48x48 выводится в меню Windows 8.
Изображение 128x128 выводится в инсталляционном окне.
Сначала нужно добавить изображения в проект. Каждый файл изображения должен быть сохранен в формате PNG с правильными размерами. Чтобы лучше организовать структуру папок проекта, поместите все изображения во вложенную папку, например AppIcons.
Затем выделите каждое изображение в окне Solution Explorer (Обозреватель решений) и присвойте свойству Build Action (Операция построения) значение Content (Содержимое). Изображения будут упакованы в архив ХАР как отдельные файлы. И наконец, откройте окно Out-of-Browser Settings (Параметры приложения вне браузера), и определите соответствующие пиктограммы.
На рисунке показано инсталляционное окно с пользовательским изображением:
Удаление и обновление приложения вне браузера
Теперь, когда вы знакомы с установкой приложения вне браузера, можно рассмотреть две связанные с этим задачи: обновление и удаление приложения.
Удалить (деинсталлировать) приложение несложно. Пользователь должен щелкнуть правой кнопкой мыши в области содержимого (в окне браузера или в отдельном окне приложения вне браузера) и выбрать в контекстном меню команду Remove This Application (Удалить это приложение). Появится диалоговое окно, предлагающее подтвердить удаление. Если пользователь щелкнет на кнопке ОК, приложение и ярлык будут удалены. Удаление всегда выполняется по инициативе пользователя, потому что в классе Application соответствующего метода нет.
Обновление — более сложный процесс, чем удаление. В надстройку Silverlight встроена процедура автоматической проверки существования новой версии. Обновление выполняется путем вызова метода Application.CheckAndDownloadUpdateAsync(). Данный метод запускает асинхронный процесс, который проверяет, есть ли на веб-сервере новая версия файла ХАР. Фактический номер версии, используемый при компиляции приложения, на этот процесс не влияет.
Приведенный ниже код проверяет наличие новых версий при запуске приложения:
private void Application_Startup(object sender, StartupEventArgs e)
{
if (Application.Current.IsRunningOutOfBrowser)
{
// Проверка наличия новых версий
Application.Current.CheckAndDownloadUpdateCompleted +=
Application_CheckAndDownloadUpdateComplete;
Application.Current.CheckAndDownloadUpdateAsync();
this.RootVisual = new MainPage();
}
else
{
this.RootVisual = new MainPage();
}
}
Компания Microsoft рекомендует вызывать метод CheckAndDownloadUpdateAsync() в ответ на какое-либо действие пользователя (например, щелчок на кнопке Обновить).
Можно также задать проверку наличия новых версий при запуске приложения. Если сетевое соединение включено, веб-сервер активен и на сервере находится новый файл XAP, приложение автоматически загрузит его и сгенерирует событие Application.CheckAndDownloadUpdateCompleted.
После вызова метода CheckAndDownloadUpdateAsync() пользователь не сможет отменить обновление, так как в Silverlight нет никаких средств для этого. Кроме того, приложение может проверить наличие новых версий, только вызвав метод CheckAndDownloadUpdateAsync(), в результате чего новая версия будет установлена. Однако обновление вступает в силу только после закрытия и повторного запуска приложения.
Если нужно, чтобы пользователь перешел к новой версии немедленно, можно вывести для него сообщение в ответ на событие CheckAndDownloadUpdateCompleted:
private void Application_CheckAndDownloadUpdateComplete(object sender,
CheckAndDownloadUpdateCompletedEventArgs e)
{
if (e.UpdateAvailable)
{
MessageBox.Show("Установлена новая версия. Перезапустите приложение.");
// Здесь можно ввести код вызова пользовательского
// метода в объекте MainPage, который отключает интерфейс
}
else if (e.Error != null && e.Error is PlatformNotSupportedException)
{
MessageBox.Show("Есть новые версии приложения"
+ "однако для их применения необходима новая версия Silverlight. " +
"Посетите сайт http://silverlight.net для обновления Silverlight.");
}
}
Для тестирования процедуры обновления создайте веб-сайт ASP.NET. Он необходим, потому что Silverlight поддерживает загрузку обновленных версий только с веб-сервера. Загрузить их из локальной файловой системы невозможно. Однако протестировать процедуру обновления с помощью локального компьютера все же можно.
Программа Visual Studio создает на локальном компьютере тестирующий веб-сервер и выбирает для него случайный номер порта. Если закрыть и вновь запустить Visual Studio, она выберет для тестирующего сервера новый номер порта, однако установленное до этого приложение вне браузера продолжит применять для проверки обновлений предыдущий номер порта. Попытка обновления завершается неуспешно, причем никакие исключения не генерируются и сообщения не выводятся, пока вы вручную не удалите и не установите приложение повторно. Чтобы устранить эту проблему, можете развернуть приложение Silverlight на тестирующем сервере IIS на локальном компьютере или в локальной сети.