<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог Сергея Пугачёва &#187; OOB</title>
	<atom:link href="http://pugachev.info/archives/tag/oob/feed" rel="self" type="application/rss+xml" />
	<link>http://pugachev.info</link>
	<description>Полезное место для Silverlight разработчиков</description>
	<lastBuildDate>Thu, 24 Nov 2011 12:58:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Доверенные внебраузерные Silverlight приложения. Добавление цифровой подписи.</title>
		<link>http://pugachev.info/archives/226</link>
		<comments>http://pugachev.info/archives/226#comments</comments>
		<pubDate>Wed, 07 Apr 2010 09:18:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[OOB]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=226</guid>
		<description><![CDATA[В Silverlight 4 появилась возможность подписать .xap файл Silverlight приложения. Наибольший смысл добавление цифровой подписи имеет при разработке доверенных внебраузерных Silverlight приложений, так как в этом случае мы может сделать диалог их установки более дружественным пользователю. Для добавления цифровой подписи у Вас должны быть нужный сертификат (Code Signing Certificate), который не является бесплатным. Если сертификата [...]]]></description>
			<content:encoded><![CDATA[<p>
        В Silverlight 4 появилась возможность подписать .xap файл Silverlight приложения.<br />
        Наибольший смысл добавление цифровой подписи имеет при разработке доверенных внебраузерных<br />
        Silverlight приложений, так как в этом случае мы может сделать диалог их установки<br />
        более дружественным пользователю. Для добавления цифровой подписи у Вас должны быть<br />
        нужный сертификат (Code Signing Certificate), который не является бесплатным. Если<br />
        сертификата у Вас нет, его можно купить, например, у компании VeriSign (<a href="http://www.verisign.com/">http://www.verisign.com/</a>).<br />
        Наверное, большинство компаний, разрабатывающих ПО, нужный сертификат имеют, и что-то<br />
        ещё тут говорить бессмысленно. Но для начинающего разработчика цена сертификата<br />
        может быть весьма ощутимой.</p>
<p>
        Итак, к примеру, возьмём тестовое внебраузерное Silverlight приложение, не являющееся<br />
        доверенным. Запустим его и попытаемся установить.
    </p>
<p>    <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/bf7/01.jpg" /></p>
<p>
        Мы увидим стандартный диалог установки, в котором отображается иконка нашего приложения,<br />
        и нет никаких предупреждений от системы безопасности.
    </p>
<p>
        Теперь давайте посмотрим, что было бы в случае, если бы наше приложение являлось<br />
        доверенным внебраузерным, но не имело цифровой подписи.
    </p>
<p>    <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/7bb/02.jpg" /></p>
<p>
        Мы видим совершенно другой диалог установки, который говорит о том, что издатель<br />
        данного приложения не может быть проверен. Пользователь видит, что перед ним предупреждение<br />
        системы безопасности, и он может задуматься над тем, стоит ли вообще данное приложение<br />
        устанавливать. Кроме того, чтобы не отвлекать пользователя от основного сообщения,<br />
        галочки задающие места размещения ярлыков приложения скрыты в разделе «More options».
    </p>
<p><span id="more-226"></span></p>
<p>
        Давайте теперь подпишем наше доверенное внебраузерное Silverlight приложение. Для<br />
        этого воспользуемся программой «signtool», которая применяется и для подписи обычных<br />
        Windows приложений. Хочется отметить, что я не буду вдаваться в детали механизма<br />
        работы центров сертификации и сертификатов, а опишу весь процесс на базовом, но<br />
        достаточном для работы, уровне.
    </p>
<p>
        Так как не у всех есть нужный сертификат или же доступ к нему, для целей разработки<br />
        и тестирования Вы можете сами сгенерировать сертификат и добавить его в «Trusted<br />
        Root Certification Authorities» своего компьютера. Данным действием Вы говорите<br />
        заявляете о том, что доверяете сгенерированному сертификату. Так как всё происходит<br />
        на Вашем компьютере, прописывание самогенерированным сертификатом доверенных Silverlight<br />
        приложений не повлияет на диалог их установки на других компьютерах. Однако при<br />
        использовании домена Active Directory Вы можете добиться того, что сгенерированному<br />
        сертификату будут доверять все компьютеры домена.
    </p>
<p>
        Давайте запустим командную строку Visual Studio Command Prompt, находящуюся в подпапке<br />
        «Visual Studio Tools» папки «Microsoft Visual Studio 2010» в меню «Пуск», и создадим<br />
        новый сертификат:
    </p>
<p>
        <font color="#003562"><i>makecert -r -pe -ss PrivateCertStore -n &laquo;CN=DemoTestCert&raquo; Demo.cer</i></font>
    </p>
<p>
        Мы сгенерировали сертификат. Его можно использовать для подписи нашего Silverlight<br />
        приложения OOBSilverlightApplication.xap:
    </p>
<p>
        <font color="#003562"><i>signtool sign /v /s PrivateCertStore /n DemoTestCert OOBSilverlightApplication.xap</i></font>
    </p>
<p>
        После выполнения команд мы увидим сообщение о том, что всё прошло успешно:
    </p>
<p>    <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/0a5/03.jpg" /></p>
<p>
        Если мы сейчас попытаемся установить наше приложение, мы не увидим никакой разницы<br />
        с тем, что было ранее в случае неподписанного Silverlight приложения. Разница была<br />
        бы заметна, если бы использовался сертификат от доверенного центра сертификации,<br />
        а не сгенерированный нами.
    </p>
<p>
        Давайте запустим файл «Demo.cer» и в появившемся диалоговом окне нажмём на кнопку<br />
        установки сертификата («Install Certificate…»). В мастере установки в разделе «Certificate<br />
        Store» выберем «Trusted Root Certification Authorities».
    </p>
<p>    <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/234/04.jpg" /></p>
<p>
        Далее, нажав множество раз на кнопки «Next» и «OK», собственно установим сертификат.
    </p>
<p>
        Теперь вернёмся к Silverlight приложению и попробуем его установить.
    </p>
<p>    <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/45e/05.jpg" /></p>
<p>
        Мы увидим другой диалог установки приложения, выполненный в голубых тонах. В новом<br />
        диалоге кроме всего прочего отображается иконка нашего приложения. Бесспорно, что<br />
        такому диалогу установки пользователь будет доверять намного больше.
    </p>
<p>
        Подписывать Silverlight приложения из командной строки просто, но что делать, если<br />
        нам хочется производить данное действие автоматически из Visual Studio при каждой<br />
        перекомпиляции? Для этого зайдём в свойства проекта Silverlight приложения и откроем<br />
        вкладку «Build Events». Зададим «Post-build event command line»:
    </p>
<p>
        <font color="#003562"><i>&laquo;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe&raquo; sign /v /s<br />
            PrivateCertStore /n DemoTestCert $(TargetName).xap</i></font>
    </p>
<p>    <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/cc8/06.jpg" /></p>
<p>
        В данном случае используется полный путь до «signtool», а вместо имени .xap файла<br />
        задаётся $(TargetName).xap.
    </p>
<p>
        Теперь наше приложение будет подписанным после каждой компиляции.
    </p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/226/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>«Тихая» установка и запуск внебраузерных Silverlight приложений.</title>
		<link>http://pugachev.info/archives/221</link>
		<comments>http://pugachev.info/archives/221#comments</comments>
		<pubDate>Fri, 02 Apr 2010 12:04:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[OOB]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=221</guid>
		<description><![CDATA[Введение В Silverlight 4 RC были добавлены очень интересные и полезные для разработчиков внебраузерных Silverlight приложений возможности. Самым существенным является то, что теперь устанавливать Silverlight приложения можно не только из браузера, но и с помощью командной строки (передачи определённого набора параметров приложению sllauncher.exe) – это так называемая «тихая» установка. Данная возможность позволяет легче и быстрее [...]]]></description>
			<content:encoded><![CDATA[<h2>Введение</h2>
<p>В Silverlight 4 RC были добавлены очень интересные и полезные для разработчиков внебраузерных Silverlight приложений возможности. Самым существенным является то, что теперь устанавливать Silverlight приложения можно не только из браузера, но и с помощью командной строки (передачи определённого набора параметров приложению sllauncher.exe) – это так называемая «тихая» установка. Данная возможность позволяет легче и быстрее развёртывать внебраузерные Silverlight приложения на компьютерах организации. Также появилась возможность запускать такие приложения без установки, что в некоторых ситуациях, несомненно, может оказаться полезным.</p>
<p>Другим важным улучшением является то, что теперь у внебраузерных Silverlight приложений можно убрать стандартную рамку окна Windows, определив, таким образом, свой, полностью уникальный дизайн приложения. Надо отметить, что такая возможность доступна только для доверенных внебраузерных приложений.</p>
<p>Говоря про доверенные внебраузерные Silverlight приложения нельзя не упомянуть то, что теперь есть возможность такие приложения подписывать (добавить цифровую подпись). Это важно с точки зрения безопасности, а также приятнее пользователю, который в случае подписанного доверенного внебраузерного Silverlight приложения увидит более дружественный диалог установки, чем в случае доверенного, но не подписанного.</p>
<p>Но обо всём по порядку.</p>
<h2>«Тихая» установка и запуск внебраузерных Silverlight приложений.</h2>
<p>Итак, установить и/или запустить внебраузерное Silverlight приложение можно даже не открывая браузер. Единственным ограничением является то, что Silverlight на компьютере пользователя должен быть уже установлен. Важно отметить то, что сейчас по лицензионному соглашению распространять Silverlight вмести со своим приложением нельзя. Вы можете открыть пользователю страницу загрузки Silverlight или сделать что-то ещё такого рода.</p>
<p>Давайте возьмём готовый .xap файл (в моём случае это «slapp.xap») внебраузерного приложения. Откроем командную строку и запустим «sllauncher.exe», который располагается в папке «C:\Program Files\Microsoft Silverlight» на 32 битных ОС или в папке «C:\Program Files (x86)\Microsoft Silverlight» в случае 64 битной системы.</p>
<p>Для того чтобы просто запустить внебраузерное Silverlight приложение передадим «sllauncher.exe» следующие параметры:</p>
<p><em><span style="color: #003562;">C:\Program Files (x86)\Microsoft Silverlight&gt;sllauncher.exe /emulate:c:\sloob\slapp.xap /origin:http://your_site.com/sl/slapp.xap</span></em><br />
<span id="more-221"></span><br />
В данном случае «emulate» указывает на то, что приложение мы хотим запустить. Далее идёт путь к .xap файлу, a параметр «origin» указывает базовый адрес. Благодаря чему нет разницы, было ли приложение скачено и установлено с этого адреса или же, оно было запущено или установлено с локального диска. Данный адрес особенно важен для обновления внебраузерных приложений, так как по нему осуществляется поиск новых версий.</p>
<p>После выполнения команды внебраузерное Silverlight приложение запустится. Теперь давайте установим его в систему, чтобы наше приложение можно было запускать так же, как и любое другое внебраузерное Silverlight приложение:</p>
<p><em><span style="color: #003562;">C:\Program Files (x86)\Microsoft Silverlight&gt;sllauncher.exe /install:c:\sloob\slapp.xap /origin:http://your_site.com/sl/slapp.xap /shortcut:desktop+startmenu</span></em><em> </em></p>
<p><em> </em><em><img src="http://www.gotdotnet.ru/upload/blog/wizardbox/080/01.jpg" border="0" alt="" /></p>
<p></em></p>
<p>Теперь вместо параметра «emulate» у нас параметр «install», кроме того добавился параметр «shortcut», указывающий на то, где разместить ярлыки внебраузерного Silverlight приложения. В данном случае ярлыки появятся в меню Пуск и на рабочем столе. При этом само внебраузерное приложение запущено не будет.</p>
<p>Также Вы можете добавить параметр «overwrite», при задании которого, в случае если приложение уже было установлено, оно будет перезаписано. Это не обязательный параметр, но в большинстве случаев его стоит использовать.</p>
<p>Удалить установленное приложение также просто:</p>
<p><em><span style="color: #003562;">C:\Program Files (x86)\Microsoft Silverlight&gt;sllauncher.exe /uninstall /origin:http://your_site.com/sl/slapp.xap</span></em></p>
<h2>Заключение</h2>
<p>В данной части я рассказал про «тихую» установку внебраузерных Silverlight приложений. В следующих частях я расскажу про добавление цифровой подписи и настройку рамки окна</p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/221/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание внебраузерных Silverlight приложений. Часть 2.</title>
		<link>http://pugachev.info/archives/214</link>
		<comments>http://pugachev.info/archives/214#comments</comments>
		<pubDate>Tue, 09 Mar 2010 10:59:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[OOB]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=214</guid>
		<description><![CDATA[Создание внебраузерных Silverlight приложений. Часть 1. Содержание Обновление внебраузерных приложений Определение наличия сетевого соединения Архитектура внебраузерных приложений Отладка внебраузерных приложений Совместное использование кода и сборок в Silverlight и .NET Обновление внебраузерных Silverlight приложений В платформу Silverlight встроен асинхронный механизм обновления внебраузерных приложений. Разработчик ответственен за то, когда будет проверяться наличие обновлений для его приложения, а [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pugachev.info/archives/204" rel="nofollow">Создание внебраузерных Silverlight приложений. Часть 1.</a><br />
<h2>Содержание</h2>
<ul>
<li><a href="http://pugachev.info/archives/214#txt1" rel="nofollow">Обновление внебраузерных приложений</a></li>
<li><a href="http://pugachev.info/archives/214#txt2" rel="nofollow">Определение наличия сетевого соединения</a></li>
<li><a href="http://pugachev.info/archives/214#txt3" rel="nofollow">Архитектура внебраузерных приложений</a></li>
<li><a href="http://pugachev.info/archives/214#txt4" rel="nofollow">Отладка внебраузерных приложений</a></li>
<li><a href="http://pugachev.info/archives/214#txt5" rel="nofollow">Совместное использование кода и сборок в Silverlight и .NET</a></li>
</ul>
<h2><a name="txt1" rel="nofollow">Обновление внебраузерных Silverlight приложений</a></h2>
<p>В платформу Silverlight встроен асинхронный механизм обновления внебраузерных приложений. Разработчик ответственен за то, когда будет проверяться наличие обновлений для его приложения, а загрузка и установка происходят автоматически. Что требуется от разработчика.</p>
<ol>
<li>Загрузить новую версию .xap файла Silverlight приложения на сервер.</li>
<li>При запуске внебраузерного приложения или в любой другой момент проверить наличие обновлений.</li>
<li>После окончания проверки Silverlight скачает новую версию приложения, которая будет установлена автоматически при следующем запуске. Разработчик может обработать событие окончания проверки и, например, показать пользователю сообщение о необходимости перезапуска приложения.</li>
</ol>
<p>Давайте добавим возможность обновления в существующее внебраузерное приложение. Откроем C# код страницы App.xaml. И в конструкторе класса &#171;App&#187; подпишемся на событие &#171;CheckAndDownloadUpdateCompleted&#187;.</p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">this</span>.CheckAndDownloadUpdateCompleted +=
<span style="color: Blue">new</span> CheckAndDownloadUpdateCompletedEventHandler(App_CheckAndDownloadUpdateCompleted);
</pre>
</p></div>
<p>Данное событие окончания проверки на наличие обновлений в случае успеха срабатывает только после физической закачки новой версии на компьютер пользователя. К сожалению, нет возможности спросить у пользователя, хочет ли он скачивать и устанавливать найденное обновление. </p>
<p>Так как в следующий раз при запуске приложения пользователь уже будет работать с новой его версией, в обработчике события &#171;CheckAndDownloadUpdateCompleted&#187; уведомим пользователя об этом.</p>
<p><span id="more-214"></span>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">void</span> App_CheckAndDownloadUpdateCompleted(<span style="color: Blue">object</span> sender,
CheckAndDownloadUpdateCompletedEventArgs e)
{
    <span style="color: Blue">if</span> (e.UpdateAvailable)
    {
        MessageBox.Show(<span>&quot;Доступно обновление. &quot;</span> +
            <span>&quot;Перезапустите приложение для использования новой
                версии.&quot;</span>);
    }
    <span style="color: Blue">else</span> <span style="color: Blue">if</span> (e.Error != <span style="color: Blue">null</span> &amp;&amp; e.Error <span style="color: Blue">is</span> PlatformNotSupportedException)
    {
        MessageBox.Show(<span>&quot;Доступно обновление, &quot;</span> +
            <span>&quot;но требуется более новая версия Silverlight.&quot;</span>);
    }
}
</pre>
</p></div>
<p>В реальных внебраузерных приложениях вместо MessageBox лучше использовать оповещения или какое-либо другое решение. </p>
<p>После того как мы подписались на событие, надо собственно инициировать проверку на наличие обновлений. Нет ничего проще. Добавим следующий код в функцию &#171;Application_Startup&#187; класса &#171;App&#187;.</p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">this</span>.CheckAndDownloadUpdateAsync();
</pre>
</p></div>
<p>Из других классов получить текущий экземпляр класса &#171;App&#187; можно через свойство Application.Current. Проверка происходит асинхронно, а от разработчика больше ничего не требуется. Полный код конструктора класса &#171;App&#187; теперь выглядит следующим образом. </p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">public</span> App()
{
    <span style="color: Blue">this</span>.Startup += <span style="color: Blue">this</span>.Application_Startup;
    <span style="color: Blue">this</span>.Exit += <span style="color: Blue">this</span>.Application_Exit;
    <span style="color: Blue">this</span>.UnhandledException += <span style="color: Blue">this</span>.Application_UnhandledException;

    <span style="color: Blue">this</span>.CheckAndDownloadUpdateCompleted +=
    <span style="color: Blue">new</span> CheckAndDownloadUpdateCompletedEventHandler(App_CheckAndDownloadUpdateCompleted);

    InitializeComponent();
}
</pre>
</p></div>
<p>Как видите, изменения незначительны. Как и в случае с функцией &#171;Application_Startup&#187;, полный код которой также не должен вызвать у Вас удивления.</p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">private</span> <span style="color: Blue">void</span> Application_Startup(<span style="color: Blue">object</span> sender, StartupEventArgs e)
{
    <span style="color: Blue">this</span>.CheckAndDownloadUpdateAsync();
    <span style="color: Blue">this</span>.RootVisual = <span style="color: Blue">new</span> MainPage();
}
</pre>
</p></div>
<p>Хорошей практикой является добавление кода, проверяющего наличие обновлений, в каждое создаваемое внебраузерное приложение. Ведь без этого для использования новой версии пользователю придётся удалить старую и установить приложение заново. </p>
<h2><a name="txt2" rel="nofollow">Определение наличия сетевого соединения</a></h2>
<p>Ещё одной часто возникающей задачей является определение наличия сетевого соединения. Ведь если у нас нет доступа в сеть, поведение приложения может коренным образом меняться, а часть его функциональности и вовсе оказаться недоступной. </p>
<p>Для того чтобы просто проверить наличие сетевого соединения достаточно вызвать статическую функцию GetIsNetworkAvailable класса NetworkInterface.</p>
<div style="color: Black; background-color: White">
<pre>NetworkInterface.GetIsNetworkAvailable();
</pre>
</p></div>
<p>Давайте добавим в элемент LayoutRoot на странице MainPage.xaml текстовый блок, куда будем выводить информацию о сетевом соединении. </p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">&lt;</span><span>TextBlock</span> <span style="color: Red">x:Name</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">tbNetwork</span><span style="color: Black">&quot;</span> <span style="color: Red">VerticalAlignment</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">Top</span><span style="color: Black">&quot;</span>
<span style="color: Red">HorizontalAlignment</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">Center</span><span style="color: Black">&quot;</span> <span style="color: Red">FontSize</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">25</span><span style="color: Black">&quot;</span><span style="color: Blue">/&gt;</span>
</pre>
</p></div>
<p>Также напишем функцию, которая будет собственно изменять текст в текстовом блоке.</p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">void</span> CheckNetwork()
{
    <span style="color: Blue">if</span> (NetworkInterface.GetIsNetworkAvailable())
    {
        tbNetwork.Text = <span>&quot;Сеть доступна&quot;</span>;
        tbNetwork.Foreground = <span style="color: Blue">new</span> SolidColorBrush(Colors.Green);
    }
    <span style="color: Blue">else</span>
    {
        tbNetwork.Text = <span>&quot;Сеть не доступна&quot;</span>;
        tbNetwork.Foreground = <span style="color: Blue">new</span> SolidColorBrush(Colors.Red);
    }
}
</pre>
</p></div>
<p>Отлично, функция у нас есть. Но когда её вызывать? Если вызвать её один раз при загрузке приложения, то мы не узнаем об изменениях, происходящих с сетевым соединением в процессе работы приложения. К счастью мы можем подписаться на событие NetworkAddressChanged класса NetworkChange, которое происходит при изменении сетевого адреса компьютера, а значит и при исчезновении/появлении сетевого соединения. В обработчике события NetworkChange вызовем функцию CheckNetwork. Кроме того вызовем функцию CheckNetwork в конструкторе класса MainPage (В листинге не приведён код предыдущих примеров). </p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">public</span> MainPage()
{
    InitializeComponent();

    CheckNetwork();
    NetworkChange.NetworkAddressChanged += (sender, e) =&gt; CheckNetwork();
}
</pre>
</p></div>
<p>Теперь запустите приложение в браузере или вне его, в условиях, когда сетевое соединение доступно.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/0b3/10.png" border="0"/>
<p>Вы увидите зелёный текст, сообщающий об этом. Теперь отключите сетевой адаптер, можете выдернуть кабель или сделать другие действия для обеспечения недоступности сети.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/255/11.png" border="0"/>
<p>Надпись сменится автоматически. Чего мы и добивались. </p>
<h2><a name="txt3" rel="nofollow">Архитектура внебраузерных Silverlight приложений</a></h2>
<p>Разрабатывая внебраузерные Silverlight приложения полезно знать, что конкретно выполняется на компьютере у пользователя, где это хранится, а также, куда собственно инсталлируются внебраузерные приложения. Как разработчик Вы создаёте .xap файл Silverlight приложения. Очевидно, что выполняться он не может. </p>
<p>Давайте зайдём в свойства ярлыка любого установленного внебраузерного Silverlight приложения.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/56a/12.png" border="0"/>
<p>Можно увидеть, что на самом деле запускается файл &#171;sllauncher.exe&#187;, расположенный в папке &#171;C:\Program Files\Microsoft Silverlight&#187; или &#171;C:\Program Files (x86)\Microsoft Silverlight&#187; на 64 битных платформах. Ему передаётся Id внебраузерного Silverlight приложения. В данном случае это &#171;2923737553.localhost&#187;. Sllauncher.exe при запуске ищет в папке внебраузерных приложений приложение с нужным Id и запускает его внутри своего окна. Папка, куда устанавливаются внебраузерные Silverlight приложения своя для каждого пользователя. </p>
<p>Перейдите в директорию &#171;C:\Users\__ИМЯ_ПОЛЬЗОВАТЕЛЯ__\AppData\LocalLow\Microsoft\Silverlight&#187;, только учтите, что папка &#171;AppData&#187; является скрытой. Внутри директории &#171;Silverlight&#187; находятся две поддиректории: &#171;is&#187; &#8211; место для изолированных хранилищ, а также &#171;OutOfBrowser&#187; &#8211; место для размещения внебраузерных приложений. </p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/365/13.png" border="0"/>
<p>Внутри каждой папки внебраузерного Silverlight приложения находятся несколько файлов, необходимых для его работы. </p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/0a4/14.png" border="0"/>
<p>На самом деле было бы не совсем верно утверждать, что при работе внебраузерных Silverlight приложений браузер не используется, так как в окне внебраузерного приложения размещается самый настоящий Internet Explorer, в котором уже выполняется Silverlight. С помощью программы Spy++ это легко увидеть.</p>
<p>В первом случае, это видно на рисунке, Silverlight приложение работает в браузере.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/2d5/15.png" border="0"/>
<p>Во втором случае оно работает вне его.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/9c4/16.png" border="0"/>
<p>Можно заметить, что везде присутствует &#171;Internet Explorer_Server&#187;. Другое дело, что в случае с внебраузерными приложениями мы его не замечаем и не можем запустить в нём что-то отличное от нашего Silverlight приложения.</p>
<h2><a name="txt4" rel="nofollow">Отладка внебраузерных приложений</a></h2>
<p>Мы увидели много интересных возможностей внебраузерных Silverlight приложений, научились создавать такие приложения и узнали, как они работают. Всё это, конечно, хорошо, но на данный момент может быть не совсем очевиден механизм их отладки. Ведь, отлаживая Silverlight приложения в браузере, доступа к специфическим внебраузерным возможностям нет. Поэтому хорошим решением кажется присоединение отладчика к процессу &#171;sllauncher.exe&#187;, в котором, как мы увидели ранее, и работают внебраузерные приложения. Но данное решение не позволяет отлаживать код, выполняемый при загрузке внебраузерного Silverlight приложения. Вероятно, должен быть способ лучше.</p>
<p>Далее я такой способ и опишу.</p>
<p>Предположим, что Silverlight приложение создано, настроено для работы вне браузера и хостится в проекте Web приложения.</p>
<ol>
<li>Если проект Web приложения не является стартовым проектом (запускаемым при нажатии F5 в Visual Studio), сделайте его таковым.</li>
<li>Запустите проект.</li>
<li>Установите внебраузерное Silverlight приложение.</li>
<li>После установки внебраузерное приложение запустится. Закройте его и остановите отладку в Visual Studio.</li>
<li>Сделайте проект Silverlight приложения стартовым. Для этого нажмите правой кнопкой мыши на имени проекта в окне &#171;Solution Explorer&#187; и выберите пункт &#171;Set as StartUp Project&#187;.</li>
<li>После этого в том же контекстном меню проекта Silverlight приложения выберите пункт &#171;Properties&#187;.</li>
<li>В открывшемся диалоге свойств проекта перейдите на вкладку &#171;Debug&#187;. И установите для &#171;Start Action&#187; значение &#171;Installed out-of-browser application&#187;. В выпадающем списке выберите, скорее всего, единственный пункт, а именно имя установленного внебраузерного приложения. <br />
<img src="http://www.gotdotnet.ru/upload/blog/wizardbox/11f/18.png" border="0"/></li>
<li>Всё, можно сохранить изменения, и поставить точку останова в нужном месте Silverlight приложения.</li>
<li>Нажмите F5. Silverlight приложение сразу запустится вне браузера. Отладчик будет присоединён автоматически. <br />
<img src="http://www.gotdotnet.ru/upload/blog/wizardbox/42a/19.png" border="0"/></li>
</ol>
<h2><a name="txt5" rel="nofollow">Совместное использование кода и сборок в Silverlight и .NET</a></h2>
<p>Если Вы создаёте Silverlight и WPF версию какого-либо приложения, может потребоваться использовать одни и те же сборки в обеих версиях. Или же один и тот же код должен работать как на сервере, так и на Silverlight клиенте. Вариантов, почему это может быть нужно, множество. </p>
<p>В Silverlight присутствует возможность создать сборки, которые можно подключить и в обычных .NET приложениях. Серьёзным ограничением является то, что такие сборки могут использовать только общий для Silverlight и .NET API. Сразу хочется отметить, что пользовательский интерфейс не является порируемым из-за отличий между Silverlight и WPF. Но существуют пять общих ключевых сборок, доступных для использования на обеих платформах. Вот они.</p>
<ul>
<li>mscorlib</li>
<li>System</li>
<li>System.Core</li>
<li>System.ComponentModel.Composition</li>
<li>Microsoft.VisualBasic</li>
</ul>
<p>Данные сборки являются базовыми и поддерживают только основные сценарии работы, но это лучше, чем отсутствие возможности портирования сборок как таковой. </p>
<p>Также надо учитывать, что есть возможность использовать Silverlight сборки в .NET, но не наоборот. Это связано с тем, что Silverlight является подмножеством .NET, а код, созданный для подмножества некоторого API с большей долей вероятности будет работать и в версии с большими возможностями. </p>
<p>Давайте создадим новый проект типа &#171;Silverlight Class Library&#187;. Добавим в данный проект класс &#171;SharedClass&#187;.</p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">public</span> <span style="color: Blue">class</span> SharedClass
{
    <span style="color: Blue">private</span> <span style="color: Blue">string</span> _text;
    <span style="color: Blue">public</span> <span style="color: Blue">string</span> Text
    {
        <span style="color: Blue">get</span>
        {
            <span style="color: Blue">return</span> _text;
        }
    }
    <span style="color: Blue">public</span> SharedClass(<span style="color: Blue">string</span> text)
    {
        _text = String.Format(<span>&quot;***{0}***&quot;</span>, text);
    }
}
</pre>
</p></div>
<p>Мы можем собрать проект и подключить получившуюся сборку в любое .NET 4.0 или Silverlight приложение.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/47f/20.png" border="0"/>
<p>Из .NET приложения получится работать только с кодом, использующим классы пяти портируемых сборок. Класс &#171;SharedClass&#187; ничего лишнего не использует, поэтому создадим консольное .NET 4.0 приложение, подключим нужную сборку и протестируем работу класса &#171;SharedClass&#187;.</p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">static</span> <span style="color: Blue">void</span> Main(<span style="color: Blue">string</span>[] args)
{
    SharedClass sharedClass = <span style="color: Blue">new</span> SharedClass(<span>&quot;Hello Silverlight!&quot;</span>);
    Console.WriteLine(sharedClass.Text);
}
</pre>
</p></div>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/21e/23.png" border="0"/>
<p>Бывают ситуации, когда возможностей, предлагаемых портируемыми сборками оказывается недостаточно. Тогда стоит воспользоваться более сложными приёмами. Например, в .NET и Silverlight приложениях использовать одни и те же файлы исходного кода. А для кода, зависимого от платформы применять условную компиляцию. Рассмотрим это на примере.</p>
<p>Откроем существующее Silverlight приложение и щёлкнем правой кнопкой мыши на названии решения (&#171;Solution …&#187;) в окне &#171;Solution Explorer&#187;. В контекстном меню выберем Add -&gt; New Solution Folder. Назовём папку &#171;SharedCode&#187; и добавим в неё файл с C# кодом класса &#171;SharedClass&#187;, рассмотренным ранее.</p>
<p>Добавим ссылку на данный файл в проект Silverlight приложения и проект ASP.NET приложения. Для этого в контекстном меню соответствующего проекта нажмём Add -&gt; Existing Item… , выберем файл &#171;SharedClass.cs&#187;, а вместо &#171;Add&#187; выберем &#171;Add As Link&#187;.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/f84/21.png" border="0"/>
<p>Теперь ссылка на файл присутствует в обоих проектах.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/8c8/22.png" border="0"/>
<p>Соответственно в обоих проектах можно использовать класс &#171;SharedClass&#187;. Более того, можно добавить в данный класс код, различный для каждой платформы с помощью условной компиляции. В свойствах проекта Silverlight приложения и на вкладке &#171;Build&#187; определён параметр &#171;Conditional compilation symbols&#187;. Его значение равно &#171;SILVERLIGHT&#187;. Данный символ и будет использоваться в условии при компиляции.</p>
<p>Добавим в класс функцию &#171;ShowText&#187;. В случае использования данной функции в Silverlight приложении будет показано сообщение с текстом, а в ASP.NET текст будет выведен на страницу. </p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">public</span> <span style="color: Blue">void</span> ShowText()
{
<span style="color: Blue">#if</span> SILVERLIGHT
    System.Windows.MessageBox.Show(_text);
<span style="color: Blue">#else</span>
    System.Web.HttpContext.Current.Response.Write( _text);
<span style="color: Blue">#endif</span>
}
</pre>
</p></div>
<p>Это происходи потому, что данная функция компилируется по-разному для .NET и Silverlight приложений. Более того, уже не важно классы каких сборок используются. Главное, чтобы компиляция происходила корректно. </p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/214/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Создание внебраузерных Silverlight приложений. Часть 1.</title>
		<link>http://pugachev.info/archives/204</link>
		<comments>http://pugachev.info/archives/204#comments</comments>
		<pubDate>Mon, 08 Mar 2010 12:05:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[OOB]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=204</guid>
		<description><![CDATA[Введение Как Вы, наверное, знаете, Silverlight приложения могут работать не только внутри, но и вне браузера (OOB, Out-of-Browser). При этом внебраузерные Silverlight приложения фактически устанавливаются на компьютер пользователя и запускаются с него, а не по сети, как в случае с традиционными Silverlight приложениями, что позволяет внебраузерным приложениям работать и в условиях отсутствия сетевого соединения. Ярлык [...]]]></description>
			<content:encoded><![CDATA[<h2><a name="txt1" rel="nofollow">Введение</a></h2>
<p>Как Вы, наверное, знаете, Silverlight приложения могут работать не только внутри, но и вне браузера (OOB, Out-of-Browser). При этом внебраузерные Silverlight приложения фактически устанавливаются на компьютер пользователя и запускаются с него, а не по сети, как в случае с традиционными Silverlight приложениями, что позволяет внебраузерным приложениям работать и в условиях отсутствия сетевого соединения. Ярлык такого приложения при установке располагаться в меню &#171;Пуск&#187; и/или на рабочем столе (всё зависит от выбора пользователя), оно отображается в диалоге установки и удаления программ операционной системы наравне с обычными Windows приложениями. Если же внебраузерное приложение ещё и является доверенным (trusted), то оно получает доступ к некоторым ресурсам компьютера за пределами традиционной для Silverlight приложений песочницы (sandbox). Например, доверенное приложение может обращаться к части файловой системы компьютера, а не только к изолированному хранилищу (isolated storage), сетевым ресурсам, не требуя обязательного наличия на сервере файла кросс доменной политики (cross domain policy file), а также доверенное внебраузерное Silverlight приложение может взаимодействовать с COM (Component Object Model) объектами, такими, как, например, объекты автоматизации Microsoft Office. И, конечно же, это далеко не полный список дополнительных возможностей доверенных внебраузерных приложений. </p>
<p>Также стоит сказать, что каждое Silverlight приложение может работать вне браузера, если это явным образом разрешил разработчик, поставив всего одну галочку в свойствах проекта в Visual Studio или написав несколько строк на XML, если Visual Studio по каким-то причинам не используется. Поставить галочку просто, но таким образом нельзя получить всех преимуществ работы вне браузера. Ведь для внебраузерных приложений доступны многие программные интерфейсы (API – Application programming interface), не доступные в браузере. Это и оповещения (notifications), и управление параметрами окна внебраузерного приложения, элементы управления WebBrowser и HTMLBrush, а также широчайшие возможности доверенных внебраузерных приложений, о которых упоминалось выше. </p>
<p><img src="http://www.gotdotnet.ru/upload/blog/wizardbox/729/01.png" border="0"/> <br />
<i>Silverlight клиент для Facebook</i></p>
<p>Многие web разработчики не любят создавать настольные приложения, в том числе и по причине трудности их обновления. Действительно, если мы имеем web приложение, то в большинстве случаев все пользователи работают с последней его версией. Более того, версия у всех одна и та же. В случае же с настольными приложениями мы получаем трудности не только с их обновлением, но ещё и с их установкой. </p>
<p>Внебраузерные Silverlight приложения – это попытка привнести достоинства web приложений в мир настольных. Silverlight практически полностью берёт на себя заботы по обновлению внебраузерных приложений, и во многих случаях разработчику задумываться об этом почти не надо. Требуется написать буквально одну строчку кода, а дальше всё происходит автоматически. В дополнение к обновлению, установку и удаление внебраузерных приложений также полностью берёт на себя платформа. </p>
<p>Надо отметить, что любые Silverlight приложения, в том числе внебраузерные, одинаково хорошо работают как на Windows, так и на MacOS X. При этом обе платформы официально поддерживаются компанией Microsoft и все возможности внебраузерных приложений доступны на каждой из них. Единственной зависимой от платформы возможностью является взаимодействие с COM объектами, которые присутствуют только в Windows. </p>
<p>Кроме того существует проект Moonlight, который обеспечивает работу Silverlight приложений на операционной системе Linux. Это проект с открытым исходным кодом, разрабатываемый компанией Novell при некоторой поддержке со стороны Microsoft. Наблюдается небольшое отставание Moonlight от официальной версии Silverlight, поэтому, если Вы хотите, чтобы Ваши приложения работали и на Linux тоже, не забудьте их протестировать на совместимость с Moonlight. </p>
<p><span id="more-204"></span><br />
<h2><a name="txt2" rel="nofollow">Создание внебраузерного приложения</a></h2>
<p>Давайте создадим простое внебраузерное приложение (все примеры далее используют Silverlight четвёртой версии, если не оговаривается иное). </p>
<p>Итак, нам понадобится Visual Studio 2010. Запустим её и создадим новый проект. </p>
<ul>
<li>Выберем File -&gt; New -&gt; Project -&gt; Visual C# -&gt; Silverlight.</li>
<li>Тип проекта &#171;Silverlight Application&#187;.</li>
<li>Назовём проект &#171;OOBSilverlightApplication&#187;.</li>
<li>Нажмём на кнопку &#171;OK&#187; и в открывшемся диалоге &#171;New Silverlight Application&#187; оставим все параметры без изменений.</li>
<li>Очередной раз, нажав на кнопку &#171;OK&#187;, мы создадим проект Silverlight приложения и проект web приложения &#171;OOBSilverlightApplication.Web&#187;, которое собственно предназначено для хостинга Silverlight приложения. Создавать web приложение имеет смысл практически всегда, кроме случаев, когда Вы не разрабатываете серверную часть для Вашего внебраузерного Silverlight приложения, или внебраузерное приложение взаимодействует только с уже существующими сторонними сервисами.</li>
</ul>
<p>Для многих может показаться странным то, что в Visual Studio нет отдельного типа проекта внебраузерного Silverlight приложения. На самом деле это связано с тем, что Silverlight приложение в принципе не может быть только внебраузерным. Оно всегда в первый раз запускается в браузере. А уже из браузера пользователь может установить приложение себе на компьютер. </p>
<p>Интерфейс приложения в браузере и вне его может быть практически одинаковым, но бывают и ситуации (часто такое происходит с доверенными внебраузерными приложениями), когда в браузере отображается только одна кнопка &#171;установить&#187; и, возможно, некоторое текстовое описание, а вся функциональность доступна исключительно вне браузера. При этом физически приложение представляет собой единственный .xap файл. Разработчик может определить окружение, в котором происходит запуск и в связи с этим коренным образом изменить интерфейс и поведение приложения.</p>
<p>Ну что же, вернёмся в Visual Studio. Давайте изменим цвет фона страницы &#171;MainPage.xaml&#187; для того чтобы наше приложение можно было легко идентифицировать. Сделаем это, заменив в строке &lt;Grid x:Name=&quot;LayoutRoot&quot; Background=&quot;White&quot;&gt; значение цвета фона с &#171;White&#187; на &#171;AliceBlue&#187;. </p>
<p>Также добавим в менеджер размещения (layout manager) Grid с именем &#171;LayoutRoot&#187;, чей фон мы только что меняли, кнопку, при нажатии на которую пользователь сможет установить приложение. </p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">&lt;</span><span>Button</span> <span style="color: Red">x:Name</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">btnInstall</span><span style="color: Black">&quot;</span> <span style="color: Red">Content</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">Установить приложение</span><span style="color: Black">&quot;</span> <span style="color: Red">Width</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">150</span><span style="color: Black">&quot;</span>
<span style="color: Red">Height</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">50</span><span style="color: Black">&quot;</span><span style="color: Blue">/&gt;</span>
</pre>
</p></div>
<p>Двойным щелчком по кнопке в визуальном дизайнере создадим обработчик события нажатия данной кнопки. В обработчике напишем код, вызывающий диалог установки приложения в случае, если оно ещё не было установлено.</p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">private</span> <span style="color: Blue">void</span> btnInstall_Click(<span style="color: Blue">object</span> sender, RoutedEventArgs e)
{
    <span style="color: Blue">if</span> (Application.Current.InstallState == InstallState.NotInstalled)
    {
        Application.Current.Install();
    }
}
</pre>
</p></div>
<p>Учтите только, что с помощью значения свойства Application.Current.InstallState нельзя проверить запущено приложение в браузере или вне его. Для этого существует другое свойство Application.Current.IsRunningOutOfBrowser. Используя его, поменяем цвет фона нашего приложения на оранжевый, в случае, если приложение работает вне браузера. Сделать это проще всего в конструкторе страницы MainPage.</p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">public</span> MainPage()
{
    InitializeComponent();

    <span style="color: Blue">if</span> (Application.Current.IsRunningOutOfBrowser)
    {
        LayoutRoot.Background = <span style="color: Blue">new</span> SolidColorBrush(Colors.Orange);
    }
}
</pre>
<p>Кроме того, добавим в конструктор страницы MainPage код, который при изменении состояния установки приложения будет показывать  сообщение об этом.</p>
<div style="color: Black; background-color: White">
<pre>Application.Current.InstallStateChanged += (sender, e) =&gt;
{ MessageBox.Show(Application.Current.InstallState.ToString()); };
</pre>
</p></div>
<p>Сейчас мы можем запустить наше приложение, но при нажатии на кнопку, получим исключение (exception) &#171;Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))&#187;. Это происходит, так как мы не указали, что приложение вообще может работать вне браузера. </p>
<ol>
<li>Для того чтобы оно могло так работать, в контекстном меню проекта &#171;OOBSilverlightApplication&#187; в окне &#171;Solution Explorer&#187; выберем пункт &#171;Properties&#187;.</li>
<li>В появившемся диалоге на первой вкладке (&#171;Silverlight&#187;) установим галочку &#171;Enable running application out of browser&#187;. В принципе, для корректной работы вне браузера больше ничего не требуется. Однако всегда следует задать базовые настройки внебраузерного приложения. <br />
<img src="http://www.gotdotnet.ru/upload/blog/wizardbox/d39/02.png" border="0"/></li>
<li>Нажмём на кнопку &#171;Out-of-Browser Settings…&#187; и в появившемся диалоговом окне установим
<ul>
<li>Заголовок окна внебраузерного приложения (Window Title): &#171;Тестовое приложение&#187;.</li>
<li>Текст ярлыка внебраузерного приложения (Shortcut name): &#171;Тест&#187;.</li>
<li>Описание приложения (Application Description): &#171;Описание&#187;.</li>
</ul>
<p>
<img src="http://www.gotdotnet.ru/upload/blog/wizardbox/09e/03.png" border="0"/> </li>
</ol>
<p>Если Вы хотите, чтобы Ваше внебраузерное приложение было доверенным, установите галочку &#171;Require elevated trust when running outside the browser&#187;. При этом пользователю будет показан другой диалог установки, предупреждающей о том, что приложение имеет доступ к ресурсам компьютера и может нанести ему вред.</p>
<p>Диалоговое окно &#171;Out-of-Browser Settings&#187; на самом деле редактирует файл &#171;OutOfBrowserSettings.xml&#187;, расположенный в папке &#171;Properties&#187; проекта Silverlight приложения и создаваемый при первой установке галочки &#171;Enable running application out of browser&#187;. После наших изменений в настройках файл &#171;OutOfBrowserSettings.xml&#187; выглядит следующим образом.</p>
<div style="color: Black; background-color: White">
<pre><span style="color: Blue">&lt;</span><span>OutOfBrowserSettings</span> <span style="color: Red">ShortName</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">Тест</span><span style="color: Black">&quot;</span> <span style="color: Red">EnableGPUAcceleration</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">False</span><span style="color: Black">&quot;</span>
<span style="color: Red">ShowInstallMenuItem</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">True</span><span style="color: Black">&quot;</span><span style="color: Blue">&gt;</span>
  <span style="color: Blue">&lt;</span><span>OutOfBrowserSettings.Blurb</span><span style="color: Blue">&gt;</span>Описание<span style="color: Blue">&lt;/</span><span>OutOfBrowserSettings.Blurb</span><span style="color: Blue">&gt;</span>
  <span style="color: Blue">&lt;</span><span>OutOfBrowserSettings.WindowSettings</span><span style="color: Blue">&gt;</span>
    <span style="color: Blue">&lt;</span><span>WindowSettings</span> <span style="color: Red">Title</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">Тестовое приложение</span><span style="color: Black">&quot;</span> <span style="color: Blue">/&gt;</span>
  <span style="color: Blue">&lt;/</span><span>OutOfBrowserSettings.WindowSettings</span><span style="color: Blue">&gt;</span>
  <span style="color: Blue">&lt;</span><span>OutOfBrowserSettings.SecuritySettings</span><span style="color: Blue">&gt;</span>
    <span style="color: Blue">&lt;</span><span>SecuritySettings</span> <span style="color: Red">ElevatedPermissions</span><span style="color: Blue">=</span><span style="color: Black">&quot;</span><span style="color: Blue">NotRequired</span><span style="color: Black">&quot;</span> <span style="color: Blue">/&gt;</span>
  <span style="color: Blue">&lt;/</span><span>OutOfBrowserSettings.SecuritySettings</span><span style="color: Blue">&gt;</span>
  <span style="color: Blue">&lt;</span><span>OutOfBrowserSettings.Icons</span> <span style="color: Blue">/&gt;</span>
<span style="color: Blue">&lt;/</span><span>OutOfBrowserSettings</span><span style="color: Blue">&gt;</span>
</pre>
</p></div>
<p>Теперь давайте запустим приложение. Для его установки нажмите на кнопку &#171;Установить приложение&#187; или кликните правой кнопкой мыши в любом его месте и выберете в контекстном меню пункт &#171;Install Тест onto this computer…&#187;. Благодаря данному пункту меню пользователь может установить приложение даже, если мы удалим созданную нами кнопку. Естественно и сам пункт меню можно скрыть, сняв галочку &#171;Show install menu&#187; в окне &#171;Out-of-Browser Settings&#187;.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/e0b/04.png" border="0"/>
<p>После нажатия на кнопку или соответствующий пункт меню перед нами появится диалоговое окно установки приложения. В данном случае иконка приложения стандартная, так как свою иконку мы не задали. </p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/592/05.png" border="0"/>
<p>Если бы производилась установка доверенного приложения, то диалоговое окно выглядело бы по-другому.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/089/05a.png" border="0"/>
<p>Выберем опцию добавления ярлыка приложения на рабочий стол (Desktop) и нажмём на кнопку &#171;OK&#187; или &#171;Install&#187; в зависимости от типа приложения. Отобразится несколько сообщений о смене состояния установки, что происходит благодаря написанному нами коду, и приложение запустится вне браузера. Весь процесс установки завершается практически мгновенно.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/1cc/06.png" border="0"/>
<p>Как Вы видите, цвет фона вне браузера отличается от цвета фона в браузере, как мы того и хотели. Ярлык нашего приложения доступен в меню Пуск.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/09d/07.png" border="0"/>
<p>А также на рабочем столе.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/eca/08.png" border="0"/>
<p>Кроме того оно отображается в диалоге установки и удаления программ операционной системы.</p>
<p> <img src="http://www.gotdotnet.ru/upload/blog/wizardbox/2ec/09.png" border="0"/>
<p>Вообще, если говорить про удаление внебраузерного Silverlight приложения, то пользоваться диалогом установки и удаления операционной системы не обязательно. Когда приложение установлено, то и в браузере и вне его в контекстном меню Сильверлайта вместо пункта &#171;Install Тест onto this computer…&#187; отображается пункт &#171;Remove this application…&#187;. Удаление, как и установка, происходит почти мгновенно.</p>
<h2><a name="txt3" rel="nofollow">Заключение</a></h2>
<p>Как Вы видите создавать и использовать внебраузерные Silverlight приложения максимально просто. Надо отметить только, что в случае MacOS X ярлыки внебраузерных приложений располагаются в других местах, а диалоги выглядят в соответствии с оформлением операционной системы. Сами же приложения ведут себя и работают точно также.</p>
<p>Разработчикам стоит учитывать, что системные администраторы с помощью групповых политик могут запретить установку и/или запуск доверенных внебраузерных приложений. Это может быть оправдано с точки зрения политики безопасности организации. Поэтому не стоит требовать расширенных прав &#171;на всякий случай&#187;. Если Вам достаточно возможностей обычных внебраузерных приложений – создавайте обычные, а не доверенные внебраузерные приложения. </p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/204/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Отладка внебраузерных Silverlight приложений</title>
		<link>http://pugachev.info/archives/174</link>
		<comments>http://pugachev.info/archives/174#comments</comments>
		<pubDate>Tue, 26 Jan 2010 16:12:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[OOB]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=174</guid>
		<description><![CDATA[В Silverlight 4 возможности, доступные для внебраузерных приложений, увеличились многократно. Чего стоит только поддержка взаимодействия с COM объектами и доступа к файловой системе в доверенном сценарии. Но, когда разработчики начинают создавать внебраузерные приложения, для многих не совсем очевиден механизм их отладки. Ведь, отлаживая приложения в браузере, доступа к специфическим внебраузерным возможностям нет. Поэтому хорошим решением [...]]]></description>
			<content:encoded><![CDATA[<p>В Silverlight 4 возможности, доступные для внебраузерных приложений, увеличились многократно. Чего стоит только поддержка взаимодействия с COM объектами и доступа к файловой системе в доверенном сценарии. Но, когда разработчики начинают создавать внебраузерные приложения,  для многих не совсем очевиден механизм их отладки. Ведь, отлаживая приложения в браузере, доступа к специфическим внебраузерным возможностям нет. Поэтому хорошим решением кажется присоединение отладчика к процессу <strong>«sllauncher.exe»</strong>, в котором работают внебраузерные приложения. Но данное решение не позволяет отлаживать код, выполняемый при загрузке. Вероятно должен быть способ получше.</p>
<p>Далее я такой способ и опишу. </p>
<p>Предположим, что Silverlight приложение создано, настроено для работы вне браузера и хостится в проекте Web приложения.</p>
<ol>
<li>Если проект Web приложения не является стартовым проектом (запускаемым при нажатии F5 в Visual Studio), сделайте его таковым.</li>
<li>Запустите проект.</li>
<li>Установите внебраузерное Silverlight приложение.<br /><img src="http://pugachev.info/wp-content/uploads/2010/01/01.jpg"/></li>
<li>После установки внебраузерное приложение запустится. Закройте его и остановите отладку в Visual Studio.</li>
<li>Сделайте проект Silverlight приложения стартовым. Для этого нажмите правой кнопкой мыши на имени проекта в окне <strong>«Solution Explorer»</strong> и выберите пункт <strong>«Set as StartUp Project»</strong>.</li>
<li>После этого в том же контекстном меню проекта Silverlight приложения выберите пункт <strong>«Properties»</strong></li>
<li>В открывшемся окне свойств проекта перейдите на вкладку <strong>«Debug»</strong>.  И установите для <strong>«Start Action»</strong> значение <strong>«Installed out-of-browser application»</strong>. В выпадающем списке выберите, скорее всего, единственный пункт, а именно имя установленного внебраузерного приложения.<br /><img src="http://pugachev.info/wp-content/uploads/2010/01/03.jpg"/></li>
<li>Всё, можно сохранить изменения, и поставить точку останова в нужном месте Silverlight приложения.<br /><img src="http://pugachev.info/wp-content/uploads/2010/01/04.jpg"/></li>
<li>Нажмите F5. Silverlight приложение сразу запустится вне браузера. Отладчик будет присоединён автоматически.</li>
</ol>
<p><a href="http://johnpapa.net/silverlight/10-steps-to-debug-silverlight-out-of-browser-applications-without-attaching/">Оригинал на английском</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/174/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

