Silverlight-приложения вне браузера

140

Как вы уже знаете, код каждого приложения Silverlight находится в файле XAP. Надстройка браузера загружает файл ХАР с веб-сервера и выполняет его на клиентском компьютере. Начиная с этого момента снова обращаться к вебсерверу не обязательно. Весь код выполняется локально.

Таким образом, приложение Silverlight зависит от надстройки браузера, но оно не обязательно должно быть внедрено на веб-страницу. Фактически, если есть надежный способ выполнить надстройку Silverlight вне браузера, должен также существовать способ выполнить приложение Silverlight без браузера.

Это весьма важная идея, на которой основано выполнение приложения вне браузера. Для его запуска пользователь посещает веб-сайт, с помощью которого загружает и устанавливает приложение Silverlight. После установки приложение можно запускать в отдельном окне с рабочего стола или с помощью меню кнопки "Пуск". Приложение вне браузера работает почти так же, как обычное приложение Silverlight, хостируемое веб-страницей. Пользователь может даже загрузить и автоматически установить обновления на клиентском компьютере.

В Silverlight 5 добавлено несколько новых средств, доступных в приложениях с повышенной доверительностью. Теперь приложение может создавать новые окна, вызывать машинный код посредством P/Invoke, получать доступ к жесткому диску со всеми привилегиями текущего пользователя и т.п. Кроме того, приложение Silverlight 5 может выполняться с повышенным уровнем доверительности также в среде браузера, однако для этого необходима специальная конфигурация клиентской части.

Поддержка приложений вне браузера

В первую очередь необходимо понимать, что, хотя приложение Silverlight выполняется за пределами браузера, все же он неявно используется. Приложение скрывает присутствие браузера.

Специальный инструмент sllauncher.exe (в операционной системе Windows его можно найти в папке Program Files\Microsoft Silverlight\) создает изолированное окно, хостирующее элемент управления браузера. Окно браузера очищено от всех элементов управления (панелей инструментов, кнопок навигации, предпочтений и т.п.), остается лишь голая рамка.

Приложения вне браузера могут работать на всех платформах, поддерживающих Silverlight, включая Windows и Mac. На рисунке ниже показано приложение, выполняющееся вне браузера:

Приложение Silverlight, выполняемое в операционной системе

Таким образом, отсутствие браузера — не более чем иллюзия. Зачем же тогда нужен этот режим? Существует несколько причин его использования:

Приложения, выполняющиеся вне браузера, обладают теми же возможностями, что и выполняющиеся в браузере. Однако между ними есть одно существенное различие: начальное выделение дискового пространства. Каждое приложение Silverlight получает "во владение" тщательно изолированную область диска, в которой оно создает и хранит файлы.

Обычно приложение, выполняющееся в браузере, получает сначала 1 Мбайт дискового пространства (доступный объем может быть увеличен при явном запросе пользователя). В то же время приложение вне браузера получает значительно больший объем — 25 Мбайт, поэтому увеличивать доступное пространство нет необходимости почти никогда.

Создание приложения вне браузера

Чтобы выполнять приложение Silverlight вне окна браузера, пользователь должен сначала установить его локально. Однако для этого разработчик приложения должен явно разрешить установку, выполнив следующие операции:

  1. Дважды щелкните в узле Properties окна Solution Explorer. Будет выведено окно с конфигурационными параметрами приложения.

  2. Откройте вкладку Silverlight.

  3. Установите флажок Enable running application out of the browser (Включить выполнение приложения за пределами браузера).

  4. (Необязательно.) Щелкните на кнопке 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()), появляется инсталляционное окно, предлагающее подтвердить необходимость установки:

Инсталляционное окно приложения

В инсталляционном окне приведена следующая информация:

В операционной системе Mac инсталляционное окно выглядит немного иначе, соответственно особенностям платформы. Например, в нем нет флажка, задающего создание ярлыка. Вместо этого пользователь должен перетащить узел приложения в нужное место после окончания установки (так обычно устанавливаются приложения в Mac).

Важная особенность инсталляционного окна состоит в том, что оно ясно и без грозных предупреждений (чтобы неопытный пользователь не передумал) сообщает о том, что сейчас произойдет. Для установки не нужна учетная запись администратора или повышенные привилегии. Предупреждения системы безопасности не появляются ни до, ни после установки.

Сравните такое поведение с установкой стандартного приложения .NET, и вы убедитесь в том, что в Silverlight процесс установки намного более дружественный. Это сделано для того, чтобы неопытный пользователь, напуганный непонятными фразами о безопасности, не отказался устанавливать приложение.

Процедура установки размещает приложение в случайно сгенерированной папке профиля текущего пользователя. Немедленно после установки приложения оно автоматически запускается в отдельном окне. Однако текущее окно браузера остается открытым. В результате на экране отображаются два выполняющихся экземпляра приложения. Устранить эту проблему можно с помощью события InstallStateChanged.

Настройка пиктограмм

Изображение, выводимое в инсталляционном окне по умолчанию, намного лучше, чем угрожающая пиктограмма предупреждения. Однако можно задать вывод еще лучшего изображения, выбранного вами лично и соответствующего характеру приложения. Пиктограммы используются в разных местах приложения, выполняемого вне браузера:

Сначала нужно добавить изображения в проект. Каждый файл изображения должен быть сохранен в формате 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 на локальном компьютере или в локальной сети.

Пройди тесты
Лучший чат для C# программистов