Home > Uncategorized > Создание внебраузерных Silverlight приложений. Часть 2.

Создание внебраузерных Silverlight приложений. Часть 2.

Создание внебраузерных Silverlight приложений. Часть 1. Содержание Обновление внебраузерных приложений
Определение наличия сетевого соединения
Архитектура внебраузерных приложений
Отладка внебраузерных приложений
Совместное использование кода и сборок в Silverlight и .NET
Обновление внебраузерных Silverlight приложений В платформу Silverlight встроен асинхронный механизм обновления внебраузерных приложений. Разработчик ответственен за то, когда будет проверяться наличие обновлений для его приложения, а загрузка и установка происходят автоматически. Что требуется от разработчика. Загрузить новую версию .xap файла Silverlight приложения на сервер.
При запуске внебраузерного приложения или в любой другой момент проверить наличие обновлений.
После окончания проверки Silverlight скачает новую версию приложения, которая будет установлена автоматически при следующем запуске. Разработчик может обработать событие окончания проверки и, например, показать пользователю сообщение о необходимости перезапуска приложения.
Давайте добавим возможность обновления в существующее внебраузерное приложение. Откроем C# код страницы App.xaml. И в конструкторе класса «App» подпишемся на событие «CheckAndDownloadUpdateCompleted». this.CheckAndDownloadUpdateCompleted +=
new CheckAndDownloadUpdateCompletedEventHandler(App_CheckAndDownloadUpdateCompleted);
Данное событие окончания проверки на наличие обновлений в случае успеха срабатывает только после физической закачки новой версии на компьютер пользователя. К сожалению, нет возможности спросить у пользователя, хочет ли он скачивать и устанавливать найденное обновление. Так как в следующий раз при запуске приложения пользователь уже будет работать с новой его версией, в обработчике события «CheckAndDownloadUpdateCompleted» уведомим пользователя об этом.void App_CheckAndDownloadUpdateCompleted(object sender,
CheckAndDownloadUpdateCompletedEventArgs e)
{
if (e.UpdateAvailable)
{
MessageBox.Show("Доступно обновление. " +
"Перезапустите приложение для использования новой
версии.");
}
else if (e.Error != null && e.Error is PlatformNotSupportedException)
{
MessageBox.Show("Доступно обновление, " +
"но требуется более новая версия Silverlight.");
}
}
В реальных внебраузерных приложениях вместо MessageBox лучше использовать оповещения или какое-либо другое решение. После того как мы подписались на событие, надо собственно инициировать проверку на наличие обновлений. Нет ничего проще. Добавим следующий код в функцию «Application_Startup» класса «App». this.CheckAndDownloadUpdateAsync();
Из других классов получить текущий экземпляр класса «App» можно через свойство Application.Current. Проверка происходит асинхронно, а от разработчика больше ничего не требуется. Полный код конструктора класса «App» теперь выглядит следующим образом. public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;

this.CheckAndDownloadUpdateCompleted +=
new CheckAndDownloadUpdateCompletedEventHandler(App_CheckAndDownloadUpdateCompleted);

InitializeComponent();
}
Как видите, изменения незначительны. Как и в случае с функцией «Application_Startup», полный код которой также не должен вызвать у Вас удивления. private void Application_Startup(object sender, StartupEventArgs e)
{
this.CheckAndDownloadUpdateAsync();
this.RootVisual = new MainPage();
}
Хорошей практикой является добавление кода, проверяющего наличие обновлений, в каждое создаваемое внебраузерное приложение. Ведь без этого для использования новой версии пользователю придётся удалить старую и установить приложение заново. Определение наличия сетевого соединения Ещё одной часто возникающей задачей является определение наличия сетевого соединения. Ведь если у нас нет доступа в сеть, поведение приложения может коренным образом меняться, а часть его функциональности и вовсе оказаться недоступной. Для того чтобы просто проверить наличие сетевого соединения достаточно вызвать статическую функцию GetIsNetworkAvailable класса NetworkInterface. NetworkInterface.GetIsNetworkAvailable();
Давайте добавим в элемент LayoutRoot на странице MainPage.xaml текстовый блок, куда будем выводить информацию о сетевом соединении. <TextBlock x:Name="tbNetwork" VerticalAlignment="Top"
HorizontalAlignment="Center" FontSize="25"/>
Также напишем функцию, которая будет собственно изменять текст в текстовом блоке. void CheckNetwork()
{
if (NetworkInterface.GetIsNetworkAvailable())
{
tbNetwork.Text = "Сеть доступна";
tbNetwork.Foreground = new SolidColorBrush(Colors.Green);
}
else
{
tbNetwork.Text = "Сеть не доступна";
tbNetwork.Foreground = new SolidColorBrush(Colors.Red);
}
}
Отлично, функция у нас есть. Но когда её вызывать? Если вызвать её один раз при загрузке приложения, то мы не узнаем об изменениях, происходящих с сетевым соединением в процессе работы приложения. К счастью мы можем подписаться на событие NetworkAddressChanged класса NetworkChange, которое происходит при изменении сетевого адреса компьютера, а значит и при исчезновении/появлении сетевого соединения. В обработчике события NetworkChange вызовем функцию CheckNetwork. Кроме того вызовем функцию CheckNetwork в конструкторе класса MainPage (В листинге не приведён код предыдущих примеров). public MainPage()
{
InitializeComponent();

CheckNetwork();
NetworkChange.NetworkAddressChanged += (sender, e) => CheckNetwork();
}
Теперь запустите приложение в браузере или вне его, в условиях, когда сетевое соединение доступно. Вы увидите зелёный текст, сообщающий об этом. Теперь отключите сетевой адаптер, можете выдернуть кабель или сделать другие действия для обеспечения недоступности сети. Надпись сменится автоматически. Чего мы и добивались. Архитектура внебраузерных Silverlight приложений Разрабатывая внебраузерные Silverlight приложения полезно знать, что конкретно выполняется на компьютере у пользователя, где это хранится, а также, куда собственно инсталлируются внебраузерные приложения. Как разработчик Вы создаёте .xap файл Silverlight приложения. Очевидно, что выполняться он не может. Давайте зайдём в свойства ярлыка любого установленного внебраузерного Silverlight приложения. Можно увидеть, что на самом деле запускается файл «sllauncher.exe», расположенный в папке «C:\Program Files\Microsoft Silverlight» или «C:\Program Files (x86)\Microsoft Silverlight» на 64 битных платформах. Ему передаётся Id внебраузерного Silverlight приложения. В данном случае это «2923737553.localhost». Sllauncher.exe при запуске ищет в папке внебраузерных приложений приложение с нужным Id и запускает его внутри своего окна. Папка, куда устанавливаются внебраузерные Silverlight приложения своя для каждого пользователя. Перейдите в директорию «C:\Users\__ИМЯ_ПОЛЬЗОВАТЕЛЯ__\AppData\LocalLow\Microsoft\Silverlight», только учтите, что папка «AppData» является скрытой. Внутри директории «Silverlight» находятся две поддиректории: «is» – место для изолированных хранилищ, а также «OutOfBrowser» – место для размещения внебраузерных приложений. Внутри каждой папки внебраузерного Silverlight приложения находятся несколько файлов, необходимых для его работы. На самом деле было бы не совсем верно утверждать, что при работе внебраузерных Silverlight приложений браузер не используется, так как в окне внебраузерного приложения размещается самый настоящий Internet Explorer, в котором уже выполняется Silverlight. С помощью программы Spy++ это легко увидеть. В первом случае, это видно на рисунке, Silverlight приложение работает в браузере. Во втором случае оно работает вне его. Можно заметить, что везде присутствует «Internet Explorer_Server». Другое дело, что в случае с внебраузерными приложениями мы его не замечаем и не можем запустить в нём что-то отличное от нашего Silverlight приложения. Отладка внебраузерных приложений Мы увидели много интересных возможностей внебраузерных Silverlight приложений, научились создавать такие приложения и узнали, как они работают. Всё это, конечно, хорошо, но на данный момент может быть не совсем очевиден механизм их отладки. Ведь, отлаживая Silverlight приложения в браузере, доступа к специфическим внебраузерным возможностям нет. Поэтому хорошим решением кажется присоединение отладчика к процессу «sllauncher.exe», в котором, как мы увидели ранее, и работают внебраузерные приложения. Но данное решение не позволяет отлаживать код, выполняемый при загрузке внебраузерного Silverlight приложения. Вероятно, должен быть способ лучше. Далее я такой способ и опишу. Предположим, что Silverlight приложение создано, настроено для работы вне браузера и хостится в проекте Web приложения. Если проект Web приложения не является стартовым проектом (запускаемым при нажатии F5 в Visual Studio), сделайте его таковым.
Запустите проект.
Установите внебраузерное Silverlight приложение.
После установки внебраузерное приложение запустится. Закройте его и остановите отладку в Visual Studio.
Сделайте проект Silverlight приложения стартовым. Для этого нажмите правой кнопкой мыши на имени проекта в окне «Solution Explorer» и выберите пункт «Set as StartUp Project».
После этого в том же контекстном меню проекта Silverlight приложения выберите пункт «Properties».
В открывшемся диалоге свойств проекта перейдите на вкладку «Debug». И установите для «Start Action» значение «Installed out-of-browser application». В выпадающем списке выберите, скорее всего, единственный пункт, а именно имя установленного внебраузерного приложения.

Всё, можно сохранить изменения, и поставить точку останова в нужном месте Silverlight приложения.
Нажмите F5. Silverlight приложение сразу запустится вне браузера. Отладчик будет присоединён автоматически.

Совместное использование кода и сборок в Silverlight и .NET Если Вы создаёте Silverlight и WPF версию какого-либо приложения, может потребоваться использовать одни и те же сборки в обеих версиях. Или же один и тот же код должен работать как на сервере, так и на Silverlight клиенте. Вариантов, почему это может быть нужно, множество. В Silverlight присутствует возможность создать сборки, которые можно подключить и в обычных .NET приложениях. Серьёзным ограничением является то, что такие сборки могут использовать только общий для Silverlight и .NET API. Сразу хочется отметить, что пользовательский интерфейс не является порируемым из-за отличий между Silverlight и WPF. Но существуют пять общих ключевых сборок, доступных для использования на обеих платформах. Вот они. mscorlib
System
System.Core
System.ComponentModel.Composition
Microsoft.VisualBasic
Данные сборки являются базовыми и поддерживают только основные сценарии работы, но это лучше, чем отсутствие возможности портирования сборок как таковой. Также надо учитывать, что есть возможность использовать Silverlight сборки в .NET, но не наоборот. Это связано с тем, что Silverlight является подмножеством .NET, а код, созданный для подмножества некоторого API с большей долей вероятности будет работать и в версии с большими возможностями. Давайте создадим новый проект типа «Silverlight Class Library». Добавим в данный проект класс «SharedClass». public class SharedClass
{
private string _text;
public string Text
{
get
{
return _text;
}
}
public SharedClass(string text)
{
_text = String.Format("***{0}***", text);
}
}
Мы можем собрать проект и подключить получившуюся сборку в любое .NET 4.0 или Silverlight приложение. Из .NET приложения получится работать только с кодом, использующим классы пяти портируемых сборок. Класс «SharedClass» ничего лишнего не использует, поэтому создадим консольное .NET 4.0 приложение, подключим нужную сборку и протестируем работу класса «SharedClass». static void Main(string[] args)
{
SharedClass sharedClass = new SharedClass("Hello Silverlight!");
Console.WriteLine(sharedClass.Text);
}
Бывают ситуации, когда возможностей, предлагаемых портируемыми сборками оказывается недостаточно. Тогда стоит воспользоваться более сложными приёмами. Например, в .NET и Silverlight приложениях использовать одни и те же файлы исходного кода. А для кода, зависимого от платформы применять условную компиляцию. Рассмотрим это на примере. Откроем существующее Silverlight приложение и щёлкнем правой кнопкой мыши на названии решения («Solution …») в окне «Solution Explorer». В контекстном меню выберем Add -> New Solution Folder. Назовём папку «SharedCode» и добавим в неё файл с C# кодом класса «SharedClass», рассмотренным ранее. Добавим ссылку на данный файл в проект Silverlight приложения и проект ASP.NET приложения. Для этого в контекстном меню соответствующего проекта нажмём Add -> Existing Item… , выберем файл «SharedClass.cs», а вместо «Add» выберем «Add As Link». Теперь ссылка на файл присутствует в обоих проектах. Соответственно в обоих проектах можно использовать класс «SharedClass». Более того, можно добавить в данный класс код, различный для каждой платформы с помощью условной компиляции. В свойствах проекта Silverlight приложения и на вкладке «Build» определён параметр «Conditional compilation symbols». Его значение равно «SILVERLIGHT». Данный символ и будет использоваться в условии при компиляции. Добавим в класс функцию «ShowText». В случае использования данной функции в Silverlight приложении будет показано сообщение с текстом, а в ASP.NET текст будет выведен на страницу. public void ShowText()
{
#if SILVERLIGHT
System.Windows.MessageBox.Show(_text);
#else
System.Web.HttpContext.Current.Response.Write( _text);
#endif
}
Это происходи потому, что данная функция компилируется по-разному для .NET и Silverlight приложений. Более того, уже не важно классы каких сборок используются. Главное, чтобы компиляция происходила корректно.

Categories: Uncategorized Tags:
  1. No comments yet.
  1. No trackbacks yet.