<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2814402786100989215</atom:id><lastBuildDate>Mon, 20 Feb 2012 11:23:34 +0000</lastBuildDate><category>Tools</category><category>multithreading</category><category>Visual Studio</category><category>Vista</category><category>other</category><category>debugging</category><category>Visual Studio .Net</category><category>Outlook</category><category>tips and tricks</category><category>programming</category><title>Будни программиста</title><description>"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете".
(с) Макконнелл, "Совершенный код".</description><link>http://andybor.blogspot.com/</link><managingEditor>noreply@blogger.com (Андрей Бороздин)</managingEditor><generator>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/andybor" /><feedburner:info uri="andybor" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>andybor</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-3949521922702193174</guid><pubDate>Thu, 02 Feb 2012 09:18:00 +0000</pubDate><atom:updated>2012-02-02T12:19:44.670+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><title>Сильный пароль, который хорошо запомнить? Легко!</title><description>&lt;p&gt;У меня есть простой способ, который позволяет придумать сильный пароль, который легко запомнить и (что еще более важно :)) легко вспомнить через время.  &lt;/p&gt;&lt;p&gt;Суть метода в следующем. Берем какое-нибудь четверостишие или несколько строк из хорошо знакомого стихотворения и затем трансформируем текст в пароль по следующему алгоритму:  &lt;/p&gt;&lt;ol&gt; &lt;li&gt;Для формирования пароля используем первые буквы слов. Лучше с учетом регистра.  &lt;/li&gt;&lt;li&gt;Для русскоязычного текста используем транслитерацию.  &lt;/li&gt;&lt;li&gt;Для обозначения переносов строк используем специальные символы &lt;strong&gt;_ – = # % ^ *&lt;/strong&gt;.  &lt;/li&gt;&lt;li&gt;Заменяем буквы похожие на цифры – цифрами или специальными символами  &lt;ul&gt; &lt;li&gt;A - @  &lt;/li&gt;&lt;li&gt;S - $  &lt;/li&gt;&lt;li&gt;O - 0  &lt;/li&gt;&lt;li&gt;L – 1  &lt;/li&gt;&lt;li&gt;B -6  &lt;/li&gt;&lt;li&gt;I - &amp;amp;&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;Для слов отрицания используем символ &lt;strong&gt;!&lt;/strong&gt; или &lt;strong&gt;~&lt;/strong&gt;.  &lt;/li&gt;&lt;li&gt;Знаки препинания можно сохранить, а можно исключить.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Пункты 1 и 2 должны выполняться первыми, остальные – в произвольном порядке.  &lt;/p&gt;&lt;p&gt;А теперь от слов к делу – рассмотрим пример. В качестве примера возьмем вот такую фразу  &lt;/p&gt;&lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Прошла зима, настало лето — спасибо Путину за это!&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Выполнив пункты 1 и 2 получим следующий текст:  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pznl-sPze!&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;Пунктов 3 и 5 у нас нет. После пунктов 4 и 6 получим итоговый пароль:  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pzn1-$Pz!&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;Теперь проверим качество пароля, например, при помощи &lt;a href="http://www.passwordmeter.com/" target="_blank"&gt;Password Meter&lt;/a&gt;:  &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-Bmk5eFUApc0/TypUzgOO-II/AAAAAAAAAL8/w9-3hfahgoo/s1600-h/clip_image002%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh4.ggpht.com/-d0vYLbeGHzs/TypU0AFZk3I/AAAAAAAAAMA/3GmR0gZmRYc/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800" width="581" height="163" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;А вот с использованием &lt;a href="https://www.microsoft.com/security/pc-security/password-checker.aspx" target="_blank"&gt;Password Checker&lt;/a&gt; от Майкрософт пароль получил среднюю оценку.  &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-FUlcd9GEAys/TypU00AqHtI/AAAAAAAAAMM/VAleRozntk8/s1600-h/clip_image004%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh6.ggpht.com/-Zugi0-9XWDg/TypU1pmJBbI/AAAAAAAAAMQ/A9csYfFbk5s/clip_image004_thumb%25255B1%25255D.jpg?imgmax=800" width="556" height="241" /&gt;&lt;/a&gt;.  &lt;/p&gt;&lt;p&gt;Попробуем еще раз. Теперь возьмем текст подлиннее:  &lt;/p&gt;&lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Наша Таня громко плачет:&lt;br /&gt;Уронила в речку мячик.&lt;br /&gt;- Тише, Танечка, не плачь:&lt;br /&gt;Не утонет в речке мяч.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Выполнив пункты 1, 2 и 5 получим следующий текст:  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;nTgp&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Yvrm&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;TT!p&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;!yvrm&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Выполнив пункт 3 получим:  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;nTgp_Yvrm-TT!p=!yvrm&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;Пункта 4 у нас нет и по этому итоговый пароль следующий:  &lt;/p&gt;&lt;p&gt;&lt;b&gt;nTgp&lt;/b&gt;&lt;b&gt;_Yrvrm&lt;/b&gt;&lt;b&gt;-TT&lt;/b&gt;&lt;b&gt;!p&lt;/b&gt;&lt;b&gt;-!yvrm&lt;/b&gt;.  &lt;/p&gt;&lt;p&gt;Несмотря на то, что в пароле не оказалось цифр, в этот раз Рassword Сhecker оказался более благосклонным:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-n7f9BUtATDA/TypU2WyvF6I/AAAAAAAAAMc/fQ2VacHUmRA/s1600-h/clip_image006%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://lh6.ggpht.com/-CEM75zADd38/TypU3NyjqQI/AAAAAAAAAMg/L-MJnN-p5qc/clip_image006_thumb%25255B1%25255D.jpg?imgmax=800" width="605" height="172" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;И на последок. Не используйте приведенные здесь примеры паролей.    &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-3949521922702193174?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/VPFPgr6ye90/blog-post.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-d0vYLbeGHzs/TypU0AFZk3I/AAAAAAAAAMA/3GmR0gZmRYc/s72-c/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2012/02/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-5133924872317271344</guid><pubDate>Fri, 01 Jul 2011 08:00:00 +0000</pubDate><atom:updated>2011-07-01T11:04:16.551+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Outlook</category><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><title>Как востановить поврежденный файл данных Outlook</title><description>&lt;p&gt;Однажды, после неудачной синхронизации со смартфоном (я в это время еще игрался с Search Folders) Outlook меня порадовал вот таким сообщением: &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-ADyI0qtHknQ/Tg1-eufWilI/AAAAAAAAALA/7slg3EXcTkA/s1600-h/clip_image002%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/-5PIKn8hRI2I/Tg1-fcG0OBI/AAAAAAAAALE/J2_1j3f1bQ4/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800" width="593" height="279" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Признаюсь, меня чуть кондратий не хватил – у меня там и почта и митинги и таски.  &lt;/p&gt;&lt;p&gt;Как ни странно, но никакие рестарты (а именно это и советуется в сообщении об ошбике ;)) ему не помогли.  &lt;/p&gt;&lt;p&gt;Традиционый совет, который я нашел в интернете, в подобном случае – запусить запустить Outlook c командой &lt;b&gt;/&lt;span&gt;&lt;span&gt;resetnavpane&lt;/span&gt;&lt;/span&gt;&lt;/b&gt; тоже к результату не привел. Что вобщем-то и логично. Поскольку проблема не в кривом размещении окон, а в поврежденном файле данных Outlook. Какой-либо другой команды по рестарту Outlook c востановлением у Outlook тоже не обнаружилось (официальный список команд &lt;a href="http://office.microsoft.com/en-us/outlook-help/command-line-switches-HP001003110.aspx" target="_blank"&gt;здесь&lt;/a&gt;). &lt;/p&gt;&lt;p&gt;После целенаправленных поисков по востановлению файла данных Outlook нашел &lt;a href="http://support.microsoft.com/kb/934545" target="_blank"&gt;ссылку&lt;/a&gt; на &lt;b&gt;Inbox Repair Tool (&lt;span&gt;&lt;span&gt;Scanpst.exe&lt;/span&gt;&lt;/span&gt;)&lt;/b&gt;.  &lt;/p&gt;&lt;p&gt;Хоть название утилилты не особо вселяло надежду (у меня грохнулся не просто Inbox, а весь файл с почтой, календарем и пр.), програму я нашел и запустил. У меня она располагается здесь "C:\Program Files (x86)\Microsoft Office\Office12\&lt;span&gt;&lt;span&gt;SCANPST.EXE&lt;/span&gt;&lt;/span&gt;". &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-bynce0xbz1k/Tg1-f3knw3I/AAAAAAAAALI/_uvtYJ_dwHA/s1600-h/clip_image004%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh6.ggpht.com/-fgCbqLkGKUk/Tg1-gp86f9I/AAAAAAAAALM/4csBAOVy-FA/clip_image004_thumb%25255B1%25255D.jpg?imgmax=800" width="535" height="351" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Файл сканировался больше часа (а что ж вы хотели пару гигов то ;)) и к моему счатью ему помогло.  &lt;/p&gt;&lt;p&gt;Пару выводов из всей этой истории: &lt;/p&gt;&lt;p&gt;1. Совет в сообщении об ошибке 'Microsoft Office Outlook' must be restarted – что мертвому припарка. Лучще бы сразу советовали запустить сканирование &lt;b&gt;&lt;span&gt;&lt;span&gt;Scanpst.exe&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;, если поврежден файл данных.  &lt;/p&gt;&lt;p&gt;2. Inbox Repair Tool стоит переназвать. Что-то вроде Outlook Data File Repair Tool куда больше соответсвует действительности. &lt;/p&gt;&lt;p&gt;3. Такую ценную утилиту стоит выноить в Start Menu. &lt;/p&gt;&lt;p&gt;4. Ну и последнее. Не настраивайте Search Folders во время синхронизации с Outlook ;).   &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-5133924872317271344?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/JrYMDVPuZe0/outlook.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-5PIKn8hRI2I/Tg1-fcG0OBI/AAAAAAAAALE/J2_1j3f1bQ4/s72-c/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2011/07/outlook.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-5580679204647861543</guid><pubDate>Wed, 22 Jun 2011 11:14:00 +0000</pubDate><atom:updated>2011-06-22T14:32:33.126+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Использование C# кода и объектов расширения (extension objects) в XSLT-процессоре .NET Framework</title><description>В .NET реализована спецификация XSLT 1.0 и его возможностей за частую не хватает. Например, отсутствует использование регулярных выражений, нет кодирования строк для использования в URL и т. д.  В то же время .NET Framework позволяет обойти ограничения за счет таких средств как:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;параметры XSL трансформации;&lt;/li&gt;&lt;li&gt;встраивание кода на JavaScript, VB.NET, C# и других языках;&lt;/li&gt;&lt;li&gt;использование объектов расширения (extension objects.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;В этой статье я хочу остановиться только на 2-х способах, которые сам регулярно использую, внедрение кода на С# и объекты расширения. Чтобы примеры были более конкретными, допустим, что у нас есть XML файл в котором содержатся данные для формирования линки на поиск в Bing. Вот пример такого XML файла:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Чтобы примеры были более конкретными, допустим, что у нас есть XML файл в котором содержатся данные для формирования линки на поиск в &lt;a href="http://www.bing.com/"&gt;Bing&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Вот пример такого XML файла:&lt;ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;!--?&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;xml&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;version&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;encoding&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue"&gt; ?&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;queries&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;query&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;title&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;A &lt;/span&gt;&lt;span style="color:red"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:blue"&gt; B&lt;/span&gt;"&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;term&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;A &lt;/span&gt;&lt;span style="color:red"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:blue"&gt; B&lt;/span&gt;"&lt;span style="color:blue"&gt;/&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span lang="RU" style="font-size:9.5pt;font-family:Consolas;color:blue;mso-ansi-language:RU; mso-no-proof:yes"&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515;mso-no-proof:yes"&gt;queries&lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="font-size:9.5pt;font-family:Consolas;color:blue;mso-ansi-language:RU; mso-no-proof:yes"&gt;&lt;span lang="RU" style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-ansi-language:RU;mso-no-proof:yes"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/ol&gt;Если в такого рода задаче не кодировать параметры для URL, то специальные символы (как &amp;amp;) не будут закодированы и URL будет распознан не верно либо может сформироваться невалидный URL.&lt;br /&gt;Ниже приведен пример поиска по запросу из XML файла без кодирования параметров&lt;br /&gt;&lt;ol&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-fpgkWx7ZcVc/TgHOgGXrgZI/AAAAAAAAAKw/sGbtVwDZevk/s1600-h/clip_image002%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/-FQDaW5Lu1T4/TgHOgljTsvI/AAAAAAAAAK0/XYTUzmwpKPg/clip_image002_thumb%25255B2%25255D.jpg?imgmax=800" width="632" height="195" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;/ol&gt;А здесь правильный вариант&lt;br /&gt;&lt;ol&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-xk76QL3nGzA/TgHOhCuB1vI/AAAAAAAAAK4/PU5WALTcwk4/s1600-h/clip_image004%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh3.ggpht.com/--QtTI-HUHWc/TgHOiMTFwaI/AAAAAAAAAK8/z1iCvJvs_qI/clip_image004_thumb%25255B2%25255D.jpg?imgmax=800" width="633" height="196" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;/ol&gt;В первом случае символ &amp;amp; не был закодирован и не распознан, как часть строки поиска. Во втором случае &amp;amp; был закодирован и Bing распознал его.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ниже приведены примеры, как можно добавить кодировние URL внедрением C# кода и с использованием объектов расширения. Фрагменты C# кода и XSLT на которые надо обратить внимание, выделены жирным и увеличенным шрифтом.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 13px; font-weight: bold; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; font-weight: bold; "&gt;Пример XSLT с внедрением С# кода&lt;/span&gt;&lt;br /&gt;&lt;ol&gt; &lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;!--?&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;xml&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;version&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;encoding&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue"&gt;?&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;version&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;1.0&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;xmlns:xsl&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;http://www.w3.org/1999/XSL/Transform&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;xmlns:msxsl&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;urn:schemas-microsoft-com:xslt&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:blue; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;xmlns:utility&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;urn:utility-scripts&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;exclude-result-prefixes&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;msxsl&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:output&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;method&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;html&lt;/span&gt;"&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;indent&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;yes&lt;/span&gt;"&lt;span style="color:blue"&gt;/&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:template&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;match&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;query&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:element&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;a&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:attribute&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;href&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;                &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:value-of&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;select&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;concat('http://bing.com/search?q=', &lt;/span&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt;utility:EncodeUrl(@term))&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;/&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:attribute&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:value-of&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;select&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;@title&lt;/span&gt;"&lt;span style="color:blue"&gt;/&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:element&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;br&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; /&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:template&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span class="Apple-style-span"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:blue; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;msxsl:script&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;language&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;C#&lt;/span&gt;"&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;implements-prefix&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;utility&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span class="Apple-style-span"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:blue; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;msxsl:assembly&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;name&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;system.web&lt;/span&gt;"&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span class="Apple-style-span"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:blue; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&lt;!--[CDATA[&lt;/span--&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:gray;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span class="Apple-style-span"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:gray; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;public string EncodeUrl(string rawUrl) {&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span class="Apple-style-span"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:gray; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;return System.Web.HttpUtility.UrlEncode(rawUrl);&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span class="Apple-style-span"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:gray; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;}&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span class="Apple-style-span"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:gray; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt;]]&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span class="Apple-style-span"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:blue; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;msxsl:script&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt; &lt;/ol&gt;&lt;span class="Apple-style-span" style="font-size: 13px; font-weight: bold; "&gt;Пример с использованием объектов расширения&lt;/span&gt;&lt;br /&gt;XSLT:&lt;br /&gt;&lt;ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;!--?&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;xml&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;version&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;encoding&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue"&gt;?&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;version&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;xmlns:xsl&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;http://www.w3.org/1999/XSL/Transform&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;xmlns:msxsl&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;urn:schemas-microsoft-com:xslt&lt;/span&gt;"&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span class="Apple-style-span"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;color:blue; mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;xmlns:utility&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;mso-no-proof:yes"&gt;&lt;span class="Apple-style-span"&gt;"&lt;span style="color:blue"&gt;urn:utility-scripts&lt;/span&gt;"&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;mso-no-proof:yes"&gt;exclude-result-prefixes&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;msxsl&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:output&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;method&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;html&lt;/span&gt;"&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;indent&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;yes&lt;/span&gt;"&lt;span style="color:blue"&gt;/&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:template&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;match&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;query&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:element&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;a&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:attribute&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;href&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;                &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:value-of&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;select&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;concat('http://bing.com/search?q=', &lt;/span&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt; font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span class="Apple-style-span"&gt;utility:EncodeUrl(@term)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;)&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;/&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:attribute&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:value-of&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red;mso-no-proof:yes"&gt;select&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;"&lt;span style="color:blue"&gt;@title&lt;/span&gt;"&lt;span style="color:blue"&gt;/&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:element&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#A31515;mso-no-proof:yes"&gt;br&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt; /&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;xsl:template&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span lang="RU" style="font-size:9.5pt;font-family:Consolas;color:blue;mso-ansi-language:RU; mso-no-proof:yes"&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#2B91AF;mso-no-proof:yes"&gt;xsl&lt;/span&gt;&lt;span lang="RU" style="font-size:9.5pt; font-family:Consolas;color:#2B91AF;mso-ansi-language:RU;mso-no-proof:yes"&gt;:&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#2B91AF;mso-no-proof:yes"&gt;stylesheet&lt;/span&gt;&lt;span lang="RU" style="font-size:9.5pt;font-family:Consolas;color:blue;mso-ansi-language: RU;mso-no-proof:yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/ol&gt;Вызывающий C# код:&lt;br /&gt;&lt;ol&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span lang="RU" style="font-size:9.5pt;font-family:Consolas;mso-ansi-language:RU;mso-no-proof: yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;mso-no-proof:yes"&gt;class&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;mso-no-proof:yes"&gt; &lt;span style="color:#2B91AF"&gt;Program&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue"&gt;string&lt;/span&gt;[] args)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&lt;span style="color:#2B91AF"&gt;XslCompiledTransform&lt;/span&gt; xsltAndExtObjTransform = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XslCompiledTransform&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;xsltAndExtObjTransform.Load(&lt;span style="color:#A31515"&gt;"..\\..\\XsltAndExtObj.xslt"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;mso-no-proof: yes"&gt;&lt;span class="Apple-style-span"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&lt;span style="color:#2B91AF"&gt;XsltArgumentList&lt;/span&gt; arguments = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XsltArgumentList&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;mso-no-proof: yes"&gt;&lt;span class="Apple-style-span"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;arguments.AddExtensionObject(&lt;span style="color:#A31515"&gt;"urn:utility-scripts"&lt;/span&gt;, &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Program&lt;/span&gt;());&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&lt;span style="color:blue"&gt;using&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;StreamWriter&lt;/span&gt; writer = &lt;span style="color:#2B91AF"&gt;File&lt;/span&gt;.CreateText(&lt;span style="color:#A31515"&gt;"XsltAndExtObj.html"&lt;/span&gt;))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="mso-bidi-font-size:9.5pt;font-family:Consolas;mso-no-proof: yes"&gt;&lt;span class="Apple-style-span"&gt;&lt;span style="mso-spacerun:yes"&gt;                &lt;/span&gt;xsltAndExtObjTransform.Transform(&lt;span style="color:#A31515"&gt;"..\\..\\Data.xml"&lt;/span&gt;, arguments, writer);&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; EncodeUrl(&lt;span style="color:blue"&gt;string&lt;/span&gt; rawUrl)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;&lt;span style="color:blue"&gt;return&lt;/span&gt; System.Web.&lt;span style="color:#2B91AF"&gt;HttpUtility&lt;/span&gt;.UrlEncode(rawUrl);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;mso-no-proof:yes"&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="font-size: 9.5pt;font-family:Consolas;mso-ansi-language:RU;mso-no-proof:yes"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span lang="RU" style="font-size:9.5pt;font-family:Consolas;mso-ansi-language:RU;mso-no-proof: yes"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h4&gt;&lt;/h4&gt; &lt;h4&gt;&lt;br /&gt;&lt;/h4&gt; &lt;/ol&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;Заключение&lt;/span&gt;&lt;br /&gt;Описанные методы дают огромные возможности для расширения возможностей XSLT, но нужно помнить, что есть и плата – это потеря некоторой переносимости кода. Такой XSLT не возможно без переработки использовать в среде отличной от .NET – таких как Java или PHP и т. д.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Если же сравнивать межу собой внедрение c# кода и объекты расширения, то предпочтительней использовать объекты расширения. Их проще разрабатывать – есть подсветка синтаксиса и синтаксические ошибки выявляются на этапе компиляции проекта . Проще сопровождать – можно (и нужно) написать unit-test для проверки логических ошибок. Ну и на конец объект расширения можно будет использовать повторно (и не только в XSLT).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Удобство в использовании объектов расширения в том, что весь код, необходимый для их работы находится в том же XSLT файле. Без каких либо дополнительных усилий и зависимостей, XSLT c объектами расширения можно использовать в другой трансформации, другом .NET проекте.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;В завершение статьи, тем кого заинтересовала данная тема хочу посоветовать посмотреть соответствующий &lt;a href="http://msdn.microsoft.com/en-us/library/wxaw5z5e.aspx"&gt;раздел&lt;/a&gt; MSDN, где достаточно подробно описаны возможности расширения XSLT.&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-5580679204647861543?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/FwxSEZLBaMY/c-extension-objects-xslt-net-framework.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-FQDaW5Lu1T4/TgHOgljTsvI/AAAAAAAAAK0/XYTUzmwpKPg/s72-c/clip_image002_thumb%25255B2%25255D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2011/06/c-extension-objects-xslt-net-framework.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-1299315346071127192</guid><pubDate>Tue, 07 Jun 2011 09:37:00 +0000</pubDate><atom:updated>2011-06-07T12:43:03.781+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Эрик Гамма переходит на работу в Майкрософт</title><description>&lt;p style="margin-top: 0in; margin-right: 0in; margin-bottom: 0in; margin-left: 0in; "&gt;&lt;span lang="ru" style="font-family: Calibri; font-size: 11pt; "&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Как пишет в своем &lt;a href="http://blogs.msdn.com/b/jasonz/archive/2011/06/06/welcome-erich-gamma-to-the-visual-studio-team.aspx"&gt;блоге&lt;/a&gt; Janson Zanders, признанный эксперт в области разработки программного обеспечения, соавтор книги Design Patterns, один из разработчиков JUnit и Eclipse -- &lt;a href="http://ru.wikipedia.org/wiki/%D0%AD%D1%80%D0%B8%D0%BA_%D0%93%D0%B0%D0%BC%D0%BC%D0%B0"&gt;Эрик Гамма&lt;/a&gt; присоединится к команде разработчиков Visual Studio  и возглавит Visual Studio development lab в Цюрихе. Подробнее &lt;a href="http://blogs.msdn.com/b/jasonz/archive/2011/06/06/welcome-erich-gamma-to-the-visual-studio-team.aspx"&gt;здесь&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Calibri; font-size: 15px; "&gt;&lt;span lang="ru"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-1299315346071127192?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/lFbHd28CUbw/blog-post.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>3</thr:total><feedburner:origLink>http://andybor.blogspot.com/2011/06/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-3486639265237228904</guid><pubDate>Mon, 06 Jun 2011 08:31:00 +0000</pubDate><atom:updated>2011-06-07T14:00:47.932+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>Незаменимых нет? (или чем заменить .NET Reflector)</title><description>&lt;p&gt;Многие знают, что с июня месяца рефлектор стал платным. За неделю до этого события я решил подыскать себе бесплатную альтернативу. Выбирал среди ILSpy, JetBrains dotPeek и Telerik JustDecompile. Около недели я ими пользовался, и свои наблюдения я фиксировал в файлике. Таким образом, у меня появилась небольшая статья, которая, возможно, кому-нибудь облегчит выбор.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;С основной задачей – декомпиляцией кода все приложения справляются достаточно хорошо. Поэтому следующим шагом стал выбор наиболее удобной в использовании замены рефлектора и развитость «второстепенного» функционала.&lt;/p&gt;&lt;p&gt;Наиболее важные для меня критерий выбора декомпилятора были следующие:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Удобство работы&lt;/li&gt;&lt;li&gt;Скорость работы (загрузка, поиск типа, декомпиляция)&lt;/li&gt;&lt;li&gt;Функционал&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Analyze &lt;/li&gt;&lt;li&gt;Декомпиляция в Visual Basic&lt;/li&gt;&lt;li&gt;Search MSDN&lt;/li&gt;&lt;li&gt;Поиск типа, метода, строки.&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p&gt;Естественно, поскольку, удобство работы, это очень нечеткий критерий, то и вывод мой, что мой вывод будет субъективным.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;По скорости работы особых нареканий у меня тоже не оказалось. Точнее все работают приблизительно одинаково медленно ;), разве что Telerik JustDecompile грузится немого медленей других.&lt;/p&gt;&lt;p&gt;А вот по развитости второстепенного функционала продукты отличаются довольно сильно.&lt;/p&gt;&lt;p&gt;К сожалению, на текущий момент ни один из декомпиляторов не поддерживают следующие операции:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Поиск строки&lt;/li&gt;&lt;li&gt;Поиск выбранного типа в MSDN&lt;/li&gt;&lt;li&gt;Поиск выбранного типа в Bing&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Однако, что поскольку разработка этих продуктов началась сравнительно недавно (февраль 2011) и еще идет полным ходом, функционал может существенно измениться. Поэтому ниже я привожу версии продуктов, между которыми я выбирал.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Далее я приведу скриншоты декомпиляторово и их краткое описание (отличие).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="http://wiki.sharpdevelop.net/ILSpy.ashx" target="_blank"&gt;ILSpy&lt;/a&gt; билд 1.0.0.822&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-R4WgoMHbBsw/TeyRMkq62GI/AAAAAAAAAKE/EvlFkpjLd9E/s1600-h/image%25255B14%25255D.png"&gt;&lt;img style="BACKGROUND-IMAGE: none; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-uOkvsoF_MQQ/TeyRNRlW6bI/AAAAAAAAAKI/WmX4JbXFnsA/image_thumb%25255B8%25255D.png?imgmax=800" width="612" height="379" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Очень похож на.NET Reflector. Умеет декомпилировать в &lt;b&gt;C#&lt;/b&gt; и &lt;b&gt;IL&lt;/b&gt;. Есть приятная функция, которой нет в рефлекторе и в других декомпиляторах – при декомпиляции кода показывает комментарии, что очень удобно.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Единственный из продуктов, который позволяет пометить сразу несколько сборок для удаления.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="http://www.telerik.com/products/decompiling.aspx" target="_blank"&gt;Telerik JustDecompile Beta&lt;/a&gt; билд&lt;/b&gt;&lt;b&gt; 2011.1.516.2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-I7IbJxLkEBI/TeyRNwp_tiI/AAAAAAAAAKM/5AXeBNQFbC0/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="BACKGROUND-IMAGE: none; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-NZGXY52QJWM/TeyROmLfiWI/AAAAAAAAAKQ/JFNrDu_Pe7U/image_thumb%25255B3%25255D.png?imgmax=800" width="613" height="456" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Минусы начинаются со скачивания инсталлятора – при скачивании требует регистрации. У меня регистрация была, но в противном случае я бы его не стал скачивать.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Интересное совпадение, пока я писал эту статью JustDecompile показал мне уведомление, что есть обновленние, но что бы его скачать надо было опять вводить регистрационные данные. Лень мне стало их искать и обновление не стал скачивать.&lt;br /&gt;Переборщили они с этим.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Немного не типичный интерфейс пользователя из-за чего создается впечатление что у программы Из рассматриваемых продуктов единственный, который на текущий момент умеет декомпилировать в &lt;b&gt;C#&lt;/b&gt; и &lt;b&gt;Visual Basic .NET&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Функция Analyze здесь называется Find Usages. Есть проблемы с поиском типов. Почему-то не всегда находит типы, так же не всегда при поиске типов фокус ввода в поле ввода. Мелочь, а неприятно.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="http://www.jetbrains.com/decompiler" target="_blank"&gt;JetBrains dotPeek&lt;/a&gt; билд 1.0.0.1219&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Наиболее глючный и в то же время наиболее функциональный продукт. Регулярно (но не так часто чтобы надоесть) показывает диалог с просьбой отправить детали ошибки. Несколько раз сталкивался с таким багом. Открываю, например, исходники StringBuilder, затем выбираю интерфейс, который он реализует и исходный текст StringBuilder’а пропадает и больше не появляется. Ниже наглядная демонстрация бага.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-ZenK3smCTI8/TeyRPe2CyYI/AAAAAAAAAKU/uR4_uy0JPJE/s1600-h/image%25255B13%25255D.png"&gt;&lt;img style="BACKGROUND-IMAGE: none; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-VzfUzErqLiA/TeyRPzgQTZI/AAAAAAAAAKY/N-TIaKfRdvM/image_thumb%25255B7%25255D.png?imgmax=800" width="615" height="376" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Из существенных ограничений – умеет только декомпилировать в C#.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Для тех, кто пользуется решарпером интерфейс и горячие клавиши будут знакомы. Жаль, но не работает как в решарпере поиск элемента по заглавным буквам. Отличается и немного терминология. Т.е. нет команды Analyze, но есть Find Usages и Find Usages Advanced.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Нет панели инструментов с кнопками навигации (как-то привык я к нему в рефлекторе), чтобы перемещаться по коду вперед-назад надо выбирать пункта Navigate главного меню, что откровенно говоря не удобно. К счастью для этих команд горячие клавиши такие же как и в студии по дефолту.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Автоматически не выделяется текущий тип в дереве (но есть специальная команда ;)).&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Как видно из скриншота каждый тип открывается в новой вкладке. Вкладки можно перемещать и прикреплять аналогично тому как это делается в студии.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Из интересных новшеств подметил, что dotPeek умеет подгружать с сайта Майросовт реальный исходный код (как это делает студия), но у меня почему-то это не сработало (возможно, тоже какой-то дефект).&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Выводы&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Меньше всех понравился JustDecompile. Оставлю только на случай если понадобится декомпиляция в Visual Basic .NET. Между ILSpy и dotPeek окончательный выбор я так пока не сделал. Я хоть и пользусь решарпером и нравится мне продвинутая функциональнось dotPeek, но как-то в большинстве случаев ILSpy пользоваться удобней. Возможно, сказывается привычка к .NET Reflector, а ILSpy больше всего на него похож. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-3486639265237228904?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/nHDNharqHHg/net-reflector.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-uOkvsoF_MQQ/TeyRNRlW6bI/AAAAAAAAAKI/WmX4JbXFnsA/s72-c/image_thumb%25255B8%25255D.png?imgmax=800" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://andybor.blogspot.com/2011/06/net-reflector.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-2244280499493195841</guid><pubDate>Fri, 13 May 2011 14:59:00 +0000</pubDate><atom:updated>2011-05-14T11:45:19.754+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><title>Офисный фитнес</title><description>&lt;p&gt;Пятница навеяла. &lt;/p&gt; &lt;p&gt;Один из краеугольных камней таймменеджмента – это отдых. Отдыхать надо регуляно и правильно &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh5.ggpht.com/_wH1VzXDaKGc/Tc1HNJVjFoI/AAAAAAAAAKA/x0Of45f_7uM/wlEmoticon-smile%5B2%5D.png?imgmax=800"&gt;. Правильный отдых для программистов – это не чтение новостей и блогов под кружку чая или кофе (как многие из нас любят делать), а какая-либо физическая нагрузка. &lt;/p&gt; &lt;p&gt;Я стараюсь поступать так. Накапливаю мелкие задачи, чтобы выполнить во время отыха: занести справку в бухгалтерию, отнести админам диск, распечатать что-либо на принтере (принтер в другой комнате). Но любимый мой способ отдыха – это ходьба по лестнице. Поднимаюсь на 7-9 этажей, спускаюсь, и т.п, Темп и количество этажей зависят от настроения.  &lt;p&gt;Заметил интересный побочный эфект. Во время ходьбы по лестницевспоминается что-то что хотел бы сделать, но нигде не записал, приходят интересные идеи (но как правило не связанные с работой &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh5.ggpht.com/_wH1VzXDaKGc/Tc1HNJVjFoI/AAAAAAAAAKA/x0Of45f_7uM/wlEmoticon-smile%5B2%5D.png?imgmax=800"&gt;). Всем хорошего отдыха!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-2244280499493195841?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/9pZOwHwTqLI/blog-post.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_wH1VzXDaKGc/Tc1HNJVjFoI/AAAAAAAAAKA/x0Of45f_7uM/s72-c/wlEmoticon-smile%5B2%5D.png?imgmax=800" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://andybor.blogspot.com/2011/05/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-950609656034690499</guid><pubDate>Fri, 08 Apr 2011 14:21:00 +0000</pubDate><atom:updated>2011-04-08T17:25:53.662+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><title>Если хочешь что-то спрятать – положи на видном месте</title><description>&lt;p&gt;В продолжение темы залоченных файлов. Совершенно случайно обратил внимание что оказывается стандартный диалог&lt;strong&gt; File In Use&lt;/strong&gt; показывает имя процесса, который держит файл. Жаль что не позволяет его разлочить и не работает для каталогов.  &lt;p&gt;Ниже скриншот с моего прошлого поста &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_wH1VzXDaKGc/TZ8Z2HaX_iI/AAAAAAAAAJ4/asQ3wsTO26I/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_wH1VzXDaKGc/TZ8Z2ukrlaI/AAAAAAAAAJ8/mFMuCWqULfY/image_thumb%5B1%5D.png?imgmax=800" width="644" height="384"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-950609656034690499?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/tlNG3IW1CSY/blog-post.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_wH1VzXDaKGc/TZ8Z2ukrlaI/AAAAAAAAAJ8/mFMuCWqULfY/s72-c/image_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2011/04/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-7357543396925739186</guid><pubDate>Thu, 03 Feb 2011 17:02:00 +0000</pubDate><atom:updated>2011-02-03T19:07:00.099+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>Как узнать, кто заблокировал файл или папку</title><description>&lt;p&gt;Я регулярно пользуюсь утилитами Sysinternals и хочу поделиться одним из cпособов как при помощи Process Explorer выяснить какой процес заблокировал досуп к файлу или папке.  &lt;/p&gt;&lt;p&gt;Использовать утилиты очень удобно – они бесплатны, не требуют инсталяции и могут быть запущены без предварительного скачивания из интернета (см &lt;a href="http://live.sysinternals.com/"&gt;http://live.sysinternals.com/&lt;/a&gt;). Последние 2 пункта делают их очень удобными при траблшутинге на серверах. &lt;/p&gt;&lt;p&gt;Итак, как же узнать, кто держит тот или иной файл или папку.  &lt;/p&gt;&lt;p&gt;Для скриншотов я смоделировал такую ситуацию нарочно, открыв в ворде файл "D:\temp\Doc1.docx" и пытаясь его в это же время удалить в проводнике. При попытке удалить файл получаю следуюющее сообщение &lt;/p&gt;&lt;p&gt;&lt;a href="https://lh5.googleusercontent.com/_wH1VzXDaKGc/TUrfk8vn4QI/AAAAAAAAAJc/WQ8RUvSMTtU/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_wH1VzXDaKGc/TUrflaj18lI/AAAAAAAAAJg/68D619DZi9I/image_thumb%5B1%5D.png?imgmax=800" width="478" height="286" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Поищем этот документ в Process Explorer: Find-&amp;gt;Find Handle or DLL… &lt;/p&gt;&lt;p&gt;В появившемя окне вводим имя заблокированного файла и жмем Search &lt;/p&gt;&lt;p&gt;&lt;a href="https://lh5.googleusercontent.com/_wH1VzXDaKGc/TUrgUmJgQ_I/AAAAAAAAAJk/brLev_8oGco/s1600-h/image%5B7%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://lh6.googleusercontent.com/_wH1VzXDaKGc/TUrgVLmznQI/AAAAAAAAAJo/Qd_x6QKF98Y/image_thumb%5B3%5D.png?imgmax=800" width="605" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Двойной клик на найденном файле и вы переходите в дерево процессов. &lt;/p&gt;&lt;p&gt;В нижем списке выбираете ваш файл (он подсвечен серым) и в контекстном меню выбираете команду Close Handle. Соглашаетесь с предупреждением, что приложение может упасть и все. Файл разблокирован и может быть спокойно удален. &lt;/p&gt;&lt;p&gt;Есть еще один способ сделать то же самое – воспользваться утилитой Unlocker. Она тоже бесплатна и ее можно скачать с сайта разработчика &lt;a href="http://cedrick.collomb.perso.sfr.fr/unlocker/"&gt;http://cedrick.collomb.perso.sfr.fr/unlocker/&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Утилита требует инсталяции . После инсталяции, в проводнике, в контекстном меню появится пунк Unlocker.  &lt;/p&gt;&lt;p&gt;Выделяете в проводнике проблемный файл, выбираете команду Unlocker и в появившемся окне видно какой процесс заблокировал файл. Кнопка Unblock разблокирует файл и можно его будет спокойно удалить.  &lt;/p&gt;&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/_wH1VzXDaKGc/TUrgVhNKezI/AAAAAAAAAJs/xDw7nU6T2z0/s1600-h/image%5B11%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_wH1VzXDaKGc/TUrgWPuJu3I/AAAAAAAAAJw/wRGPvVFpPbw/image_thumb%5B5%5D.png?imgmax=800" width="552" height="168" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Это конечно проще чем с Process Explorer :). Еще один плюс – если файл нельзя удалить сразу, например какой-нибудь системный файл, то Unlocker может предложить его удалить во время перезагузки системы.     &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-7357543396925739186?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/1RbVH85VWYQ/blog-post.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_wH1VzXDaKGc/TUrflaj18lI/AAAAAAAAAJg/68D619DZi9I/s72-c/image_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://andybor.blogspot.com/2011/02/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-2503887524365468502</guid><pubDate>Sat, 22 Jan 2011 13:09:00 +0000</pubDate><atom:updated>2011-01-22T15:13:29.913+02:00</atom:updated><title>И снова здравствуйте!</title><description>&lt;p&gt;Друзья!  &lt;/p&gt;&lt;p&gt;Более двух лет в блоге не было ни одного сообщения. Как верно заметил BrigOS, в одном из комментариев, по сути блог был мертв и его можно было удалить из RSS ридера. Но блог не умер, он просто спал и набирался сил. &lt;/p&gt;&lt;p&gt;За два года много изменилось – айфоны и айпэды захватили мир, а Live Search стал Bing. Изменилась и моя жизнь – у меня родился сын (и ему уже почти 2 года ;)), немного изменились и мои увлечения. Что бы успевать больше я стал верным адептом тайм-менеджмента и появилось время для ведения блога. Более того, появилось большое желание снова его вести. Возможно, немного изменится тематика блога – по мимо чисто програмистских тем, мне хочется поделисться опытом применения тайм-менеджмента в собственной жизни, появятся отзывы на прочитанные книги. Планируемая периодичность обновления блога – раз в 2 недели.  &lt;/p&gt;&lt;p&gt;До следующей встречи!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-2503887524365468502?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/FZKjP209Edg/blog-post.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>2</thr:total><feedburner:origLink>http://andybor.blogspot.com/2011/01/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-4375650028726170847</guid><pubDate>Sun, 28 Dec 2008 14:26:00 +0000</pubDate><atom:updated>2008-12-28T16:27:35.265+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><category domain="http://www.blogger.com/atom/ns#">other</category><title>Поиск слов по шаблону в Lingvo</title><description>&lt;p&gt;У многих кто изучает английский язык и активно пользуются&amp;#160; ПК стоит Lingvo. По крайней мере я и все мои знакомые пользуются именно этим словарем. Функции, которой мне нахватало был поиск слова по шаблону. Недавно, пролистывая брошюрку, которая идет с коробочной версией лингво обнаружил что такая функция есть и причем уже достаточно давно. Функция поиска по шаблону (в справке она называется поиск по маске) поддерживает известные символы подстановки “&lt;strong&gt;*&lt;/strong&gt;” и “&lt;strong&gt;?&lt;/strong&gt;” – любые буквы в любом количестве и одна любая буква соответственно.&lt;/p&gt;  &lt;p&gt;Работает такой поиск следующим образом. В строку поиска надо ввести интересующий шаблон, например “&lt;strong&gt;he*o”&lt;/strong&gt; и нажать &lt;strong&gt;Ctrl+F3&lt;/strong&gt;. Программа запустит поиск по всем активным словарям и выведет окно с подходящими словами и словосочетаниями.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_wH1VzXDaKGc/SVeMgUSt_LI/AAAAAAAAAHY/R0KKjKb8h2U/s1600-h/Search%20by%20Mask%20Result%5B6%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Search by Mask Result" border="0" alt="Search by Mask Result" src="http://lh3.ggpht.com/_wH1VzXDaKGc/SVeMhh6dZ3I/AAAAAAAAAHc/_Hol0oaYqWw/Search%20by%20Mask%20Result_thumb%5B4%5D.jpg?imgmax=800" width="385" height="250" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-4375650028726170847?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/jIjKz5mRxZg/lingvo.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_wH1VzXDaKGc/SVeMhh6dZ3I/AAAAAAAAAHc/_Hol0oaYqWw/s72-c/Search%20by%20Mask%20Result_thumb%5B4%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/12/lingvo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-7626298075278441786</guid><pubDate>Thu, 18 Dec 2008 19:28:00 +0000</pubDate><atom:updated>2008-12-18T21:40:11.129+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><category domain="http://www.blogger.com/atom/ns#">other</category><title>Интеллект Live Search</title><description>Давно знал, что поисковик &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt; может быть использован как простой калькулятор, но вот вчера с удивлением обнаружил, что майкрософтовский &lt;a href="http://www.live.com/"&gt;Live Search&lt;/a&gt; умеет решать уравнения. И что поразило меня еще больше, что нелинейные уравнение ему тоже по зубам. Вот парочка примеров (кликабельно):     &lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://search.live.com/results.aspx?q=x%2b(x%2b1)%3d93&amp;amp;FORM=ZGLE15"&gt;x+(x+1)=93&lt;/a&gt;  (этот пример приведен в справке &lt;a href="http://www.live.com/"&gt;Live Search&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://search.live.com/results.aspx?q=x%5E3%3D9&amp;amp;form=QBRE"&gt;x^3=9&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://search.live.com/results.aspx?q=x%5E2%2B2*x%3D13&amp;amp;form=QBRE"&gt;x^2+2*x=13&lt;/a&gt;  &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://search.live.com/results.aspx?q=sin%28x%29%3D0.9&amp;amp;form=QBRE"&gt;Sin(x)=0.9&lt;/a&gt;  &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;Единственный недостаток, что расширенным интеллектом обладает только англоязычная версия поисковика.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-7626298075278441786?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/wyQnbgPPmxM/live-search.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/12/live-search.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-6526262421207212415</guid><pubDate>Sat, 23 Aug 2008 13:12:00 +0000</pubDate><atom:updated>2008-08-23T16:20:12.955+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>Sysinternals Desktops v1.0</title><description>«Широко известный в узких кругах» пакет утилит Sysinternals Suit пополнился еще одним приложением – Desktops v1.0. Эта утилита решает проблему переполненности панели задач и позволяет создавать до 4 виртуальных рабочих столов и работать раздельно с приложениями на каждом из них. Например, разрабатывать приложение в одном и просматривать почту и писать отчет в другом. Между приложениями на разных десктопах удобно переносить данные, так как они имеют один общий буфер обмена. Переключаться между десктопами можно по горячим клавишам или при помощи иконки в трэе.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wH1VzXDaKGc/SLAOF4GqleI/AAAAAAAAAFk/NyGSsfqlF8k/s1600-h/Desktop2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_wH1VzXDaKGc/SLAOF4GqleI/AAAAAAAAAFk/NyGSsfqlF8k/s400/Desktop2.JPG" alt="" id="BLOGGER_PHOTO_ID_5237701860754363874" border="0" /&gt;&lt;/a&gt;В целом с приложением удобно работать, хотя есть определенные ограничения. Некоторые сочетания клавиш, например, Ctrl+Shif+ Esc (запуск Windows Task Manager) работают только в первом рабочем столе, (там, где была утилита запущена), не смотря на то, в каком рабочем столе такое сочетание клавиш было нажато, приложение запустится в первом.&lt;br /&gt;Скачать утилиту можно &lt;a href="http://technet.microsoft.com/ru-ru/sysinternals/cc817881%28en-us%29.aspx"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-6526262421207212415?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/F6-EiDtPboU/sysinternals-desktops-v10.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_wH1VzXDaKGc/SLAOF4GqleI/AAAAAAAAAFk/NyGSsfqlF8k/s72-c/Desktop2.JPG" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/08/sysinternals-desktops-v10.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-5290034585302691707</guid><pubDate>Wed, 06 Aug 2008 11:31:00 +0000</pubDate><atom:updated>2008-08-09T11:40:04.377+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Vista</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Определение Integrity Level для процесса на c#</title><description>В Windows Vista появился дополнительный механизм защиты – &lt;a href="http://msdn.microsoft.com/en-us/library/bb625957.aspx"&gt;Integrity Levels&lt;/a&gt;. В зависимости от его уровня различаются и возможности приложения по работе с защищенными ресурсами системы. Поэтому актуальной задачей является определение значения Integrity Level процесса. В MSDN есть пример по определению Integrity Level  текущего процесса для неуправляемого кода (статья &lt;a href="http://msdn.microsoft.com/en-us/library/bb625966.aspx#"&gt;Appendix D: Getting the Integrity Level for an Access Token&lt;/a&gt;). Ниже я привел подобный код на C#. Я постарался сохранить стиль кода с оригиналом, что бы их было проще сравнивать. Так же, на мой взгляд, в оригинальном примере есть ошибка в определении уровней High и System. Поэтому я заменил фрагмент кода&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:78%;"&gt;else if (dwIntegrityLevel &amp;gt;= SECURITY_MANDATORY_HIGH_RID) &lt;br /&gt;{ &lt;br /&gt;    // High Integrity&lt;br /&gt;    ... &lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;на&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:78%;"&gt;else if (dwIntegrityLevel &amp;gt;= SECURITY_MANDATORY_HIGH_RID &amp;amp;&amp;amp; &lt;br /&gt;          dwIntegrityLevel &amp;lt; SECURITY_MANDATORY_SYSTEM_RID) &lt;br /&gt;{ &lt;br /&gt;    // High Integrity &lt;br /&gt;    ... &lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;А вот и пример консольного приложения, которое определяет свой текущий Integrity Level.&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:78%;"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;using System.Security.Principal;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;&lt;br /&gt;namespace IntegrityLevel&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            ShowProcessIntegrityLevel();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static void ShowProcessIntegrityLevel()&lt;br /&gt;        {&lt;br /&gt;            IntPtr hProcess = Process.GetCurrentProcess().Handle;&lt;br /&gt;            IntPtr hToken;&lt;br /&gt;            if (!OpenProcessToken(hProcess, &lt;br /&gt;                    TokenAccessLevels.MaximumAllowed,&lt;br /&gt;                    out hToken))&lt;br /&gt;            {&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                uint dwLengthNeeded;&lt;br /&gt;                if (GetTokenInformation(hToken,&lt;br /&gt;                        TOKEN_INFORMATION_CLASS.TokenIntegrityLevel,&lt;br /&gt;                        IntPtr.Zero,&lt;br /&gt;                        0,&lt;br /&gt;                        out dwLengthNeeded))&lt;br /&gt;&lt;br /&gt;                uint dwError = (uint)Marshal.GetLastWin32Error();&lt;br /&gt;                if (dwError == ERROR_INSUFFICIENT_BUFFER)&lt;br /&gt;                {&lt;br /&gt;                    IntPtr pTIL = Marshal.AllocHGlobal((int)dwLengthNeeded);&lt;br /&gt;                    try&lt;br /&gt;                    {&lt;br /&gt;                        if (!GetTokenInformation(hToken, &lt;br /&gt;                                                 TOKEN_INFORMATION_CLASS.TokenIntegrityLevel, &lt;br /&gt;                                                 pTIL, &lt;br /&gt;                                                 dwLengthNeeded, &lt;br /&gt;                                                 out dwLengthNeeded))&lt;br /&gt;                        {&lt;br /&gt;                            return;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        TOKEN_MANDATORY_LABEL TIL = &lt;br /&gt;                            (TOKEN_MANDATORY_LABEL)Marshal.PtrToStructure(pTIL, &lt;br /&gt;                                typeof(TOKEN_MANDATORY_LABEL));&lt;br /&gt;&lt;br /&gt;                        IntPtr SubAuthorityCount = GetSidSubAuthorityCount(TIL.Label.Sid);&lt;br /&gt;&lt;br /&gt;                        IntPtr IntegrityLevelPtr = GetSidSubAuthority(TIL.Label.Sid, &lt;br /&gt;                            Marshal.ReadByte(SubAuthorityCount) - 1);&lt;br /&gt;&lt;br /&gt;                        int dwIntegrityLevel = Marshal.ReadInt32(IntegrityLevelPtr);&lt;br /&gt;&lt;br /&gt;                        if (dwIntegrityLevel == SECURITY_MANDATORY_LOW_RID)&lt;br /&gt;                        {&lt;br /&gt;                            // Low Integrity&lt;br /&gt;                            Console.WriteLine("Low Process");&lt;br /&gt;                        }&lt;br /&gt;                        else if (dwIntegrityLevel &amp;gt;= SECURITY_MANDATORY_MEDIUM_RID &amp;&amp;&lt;br /&gt;                             dwIntegrityLevel &amp;lt; SECURITY_MANDATORY_HIGH_RID)&lt;br /&gt;                        {&lt;br /&gt;                            // Medium Integrity&lt;br /&gt;                            Console.WriteLine("Medium Process");&lt;br /&gt;                        }&lt;br /&gt;                        else if (dwIntegrityLevel &amp;gt;= SECURITY_MANDATORY_HIGH_RID &amp;&amp;&lt;br /&gt;                             dwIntegrityLevel &amp;lt; SECURITY_MANDATORY_SYSTEM_RID)&lt;br /&gt;                        {&lt;br /&gt;                            // High Integrity&lt;br /&gt;                            Console.WriteLine("High Integrity Process");&lt;br /&gt;                        }&lt;br /&gt;                        else if (dwIntegrityLevel &amp;gt;= SECURITY_MANDATORY_SYSTEM_RID)&lt;br /&gt;                        {&lt;br /&gt;                            // System Integrity&lt;br /&gt;                            Console.WriteLine("System Integrity Process");&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    finally&lt;br /&gt;                    {&lt;br /&gt;                        Marshal.FreeHGlobal(pTIL);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                CloseHandle(hToken);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // interop&lt;br /&gt;        const uint ERROR_INSUFFICIENT_BUFFER = 122;&lt;br /&gt;        const long SECURITY_MANDATORY_LOW_RID = 0x00001000L;&lt;br /&gt;        const long SECURITY_MANDATORY_MEDIUM_RID = 0x00002000L;&lt;br /&gt;        const long SECURITY_MANDATORY_HIGH_RID = 0x00003000L;&lt;br /&gt;        const long SECURITY_MANDATORY_SYSTEM_RID = 0x00004000L;&lt;br /&gt;&lt;br /&gt;        enum TOKEN_INFORMATION_CLASS&lt;br /&gt;        {&lt;br /&gt;            TokenUser = 1,&lt;br /&gt;            TokenGroups = 2,&lt;br /&gt;            TokenPrivileges = 3,&lt;br /&gt;            TokenOwner = 4,&lt;br /&gt;            TokenPrimaryGroup = 5,&lt;br /&gt;            TokenDefaultDacl = 6,&lt;br /&gt;            TokenSource = 7,&lt;br /&gt;            TokenType = 8,&lt;br /&gt;            TokenImpersonationLevel = 9,&lt;br /&gt;            TokenStatistics = 10,&lt;br /&gt;            TokenRestrictedSids = 11,&lt;br /&gt;            TokenSessionId = 12,&lt;br /&gt;            TokenGroupsAndPrivileges = 13,&lt;br /&gt;            TokenSessionReference = 14,&lt;br /&gt;            TokenSandBoxInert = 15,&lt;br /&gt;            TokenAuditPolicy = 16,&lt;br /&gt;            TokenOrigin = 17,&lt;br /&gt;            TokenElevationType = 18,&lt;br /&gt;            TokenLinkedToken = 19,&lt;br /&gt;            TokenElevation = 20,&lt;br /&gt;            TokenHasRestrictions = 21,&lt;br /&gt;            TokenAccessInformation = 22,&lt;br /&gt;            TokenVirtualizationAllowed = 23,&lt;br /&gt;            TokenVirtualizationEnabled = 24,&lt;br /&gt;            TokenIntegrityLevel = 25,&lt;br /&gt;            TokenUIAccess = 26,&lt;br /&gt;            TokenMandatoryPolicy = 27,&lt;br /&gt;            TokenLogonSid = 28,&lt;br /&gt;            MaxTokenInfoClass = 29&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;        struct TOKEN_MANDATORY_LABEL&lt;br /&gt;        {&lt;br /&gt;            public SID_AND_ATTRIBUTES Label;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;        struct SID_AND_ATTRIBUTES&lt;br /&gt;        {&lt;br /&gt;            public IntPtr Sid;&lt;br /&gt;            public int Attributes;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [DllImport("kernel32.dll", SetLastError = true)]&lt;br /&gt;        [return: MarshalAs(UnmanagedType.Bool)]&lt;br /&gt;        static extern bool CloseHandle(IntPtr hObject);&lt;br /&gt;&lt;br /&gt;        [DllImport("advapi32.dll", SetLastError = true)]&lt;br /&gt;        [return: MarshalAs(UnmanagedType.Bool)]&lt;br /&gt;        static extern bool OpenProcessToken(IntPtr ProcessHandle,&lt;br /&gt;            TokenAccessLevels DesiredAccess,&lt;br /&gt;            out IntPtr TokenHandle);&lt;br /&gt;&lt;br /&gt;        [DllImport("advapi32.dll", SetLastError = true)]&lt;br /&gt;        static extern bool GetTokenInformation(IntPtr TokenHandle,&lt;br /&gt;            TOKEN_INFORMATION_CLASS TokenInformationClass,&lt;br /&gt;            IntPtr TokenInformation,&lt;br /&gt;            uint TokenInformationLength,&lt;br /&gt;            out uint ReturnLength);&lt;br /&gt;&lt;br /&gt;        [DllImport("kernel32.dll")]&lt;br /&gt;        static extern IntPtr LocalAlloc(uint uFlags, UIntPtr uBytes);&lt;br /&gt;&lt;br /&gt;        [DllImport("advapi32.dll", SetLastError = true)]&lt;br /&gt;        static extern IntPtr GetSidSubAuthority(IntPtr pSid, int nSubAuthority);&lt;br /&gt;&lt;br /&gt;        [DllImport("advapi32.dll", SetLastError = true)]&lt;br /&gt;        static extern IntPtr GetSidSubAuthorityCount(IntPtr pSid);&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-5290034585302691707?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/vqeNMPG5VV0/integrity-level-c.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/08/integrity-level-c.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-92108783000951906</guid><pubDate>Fri, 18 Jul 2008 12:18:00 +0000</pubDate><atom:updated>2011-07-11T15:43:52.697+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Взаимодействие процессов по IpcChannel</title><description>&lt;span style="font-size:+0;"&gt;Недавно столкнулся с необходимостью организовать взаимодействие двух .NET процессов в рамках одного компьютера. Немного покумекав, решил для этих целей воспользоваться «родной» для платформы .NET технологией – &lt;a href="http://msdn.microsoft.com/en-us/library/72x4h507%28VS.80%29.aspx"&gt;Remoting&lt;/a&gt;. Первоначально в качестве канала для «общения» процессов планировал выбрать протокол TCP (&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.tcp.tcpchannel.aspx"&gt;TcpChannel&lt;/a&gt;), но затем обнаружил что во втором фреймворке появился новый канал ремоутинга, который идеально подходит для мой задачи – &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.ipc.ipcchannel.aspx"&gt;&lt;span style="font-size:+0;"&gt;IpcChannel&lt;/span&gt;&lt;/a&gt;. Этот канал использует в своей работе именованные каналы (named pipes) и был разработан специально для организации взаимодействия нескольких процессов в рамках одного компьютера и согласно &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.ipc%28VS.80%29.aspx"&gt;MSDN&lt;/a&gt;, работает намного быстрее TCP и HTTP. Использование технологии Remoting крайне просто и ниже я привел пример сервера и клиента взаимодействующих по каналу IpcChannel.&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt;&lt;/span&gt;Ниже приведен код для сервера.&lt;br /&gt;&lt;pre&gt;class ServerHost&lt;br /&gt;{&lt;br /&gt;   static void Main( string[] args )&lt;br /&gt;   {&lt;br /&gt;       IDictionary settings = new Hashtable();&lt;br /&gt;       settings["portName"] = "IPC_Test";&lt;br /&gt;       settings["exclusiveAddressUse"] = false;&lt;br /&gt;&lt;br /&gt;       IChannel channel = new IpcChannel(settings, null, null);&lt;br /&gt;       ChannelServices.RegisterChannel(channel, false);&lt;br /&gt;       RemotingConfiguration.RegisterWellKnownServiceType(&lt;br /&gt;           typeof( GreetingService ),&lt;br /&gt;           "GreetingService",&lt;br /&gt;       WellKnownObjectMode.Singleton );&lt;br /&gt;&lt;br /&gt;       Console.WriteLine("Server started. Press ENTER to shutdown.");&lt;br /&gt;       Console.ReadLine();&lt;br /&gt;       ChannelServices.UnregisterChannel( channel );&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Далее идет код для клиента этого сервера&lt;br /&gt;&lt;pre&gt;class ClientApp&lt;br /&gt;{&lt;br /&gt;   static void Main( string[] args )&lt;br /&gt;   {&lt;br /&gt;       IGreetingService service = (IGreetingService)Activator.GetObject(&lt;br /&gt;           typeof( IGreetingService ),&lt;br /&gt;           "ipc://IPC_Test/GreetingService" );&lt;br /&gt;&lt;br /&gt;       Console.WriteLine(service.GetGreeting("IPC Tester"));&lt;br /&gt;       Console.ReadLine();&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;И наконец, пример интерфейса и реализация сервиса, который используемых как клиентом, так и сервером.&lt;br /&gt;&lt;pre&gt;public interface IGreetingService&lt;br /&gt;{&lt;br /&gt;   string GetGreeting(string userName);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class GreetingService: MarshalByRefObject, IGreetingService&lt;br /&gt;{&lt;br /&gt;   public string GetGreeting( string userName )&lt;br /&gt;   {&lt;br /&gt;       return "Hello, " + userName;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;Обратите внимание на установку параметра &lt;span style="FONT-WEIGHT: bold"&gt;exclusiveAddressUse &lt;/span&gt;в &lt;span style="FONT-WEIGHT: bold"&gt;false&lt;/span&gt;. В MSDN есть предупреждение, что установка его в false позволит нескольким серверам использовать одни и тот же порт, что может привести к брешам в безопасности такой архитектуры, однако если его не установить в false используемый сервером порт может быть недоступным еще около 1 секунды после завершения работы сервера.&lt;br /&gt;Ниже приведен еще один пример реализации хоста сервера, но настройка ремоутинга произведена посредством конфигурационного файла.&lt;br /&gt;&lt;pre&gt;class ConfigServerHost&lt;br /&gt;{&lt;br /&gt;   static void Main( string[] args )&lt;br /&gt;   {&lt;br /&gt;       RemotingConfiguration.Configure( "ConfigServerHost.exe.config", false );&lt;br /&gt;&lt;br /&gt;       Console.WriteLine( "Server started. Press ENTER to shutdown" );&lt;br /&gt;       Console.ReadLine();&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;И наконец, app.config, который после компиляции проекта преврацается в ConfigServerHost.exe.config&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;system.runtime.remoting&amp;gt;&lt;br /&gt;  &amp;lt;application name="IPC Sample"&amp;gt;&lt;br /&gt;    &amp;lt;service&amp;gt;&lt;br /&gt;      &amp;lt;wellknown mode="Singleton" type="ServerHost.GreetingService, ServerHost" objectUri="GreetingService" /&amp;gt;&lt;br /&gt;    &amp;lt;/service&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;channels&amp;gt;&lt;br /&gt;      &amp;lt;channel ref="ipc" portName="IPC_Test" exclusiveAddressUse="false" /&amp;gt;&lt;br /&gt;    &amp;lt;/channels&amp;gt;&lt;br /&gt;  &amp;lt;/application&amp;gt;&lt;br /&gt;&amp;lt;/system.runtime.remoting&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-92108783000951906?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/xK7wPDEX9pU/ipcchanel.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/07/ipcchanel.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-5908336516952963542</guid><pubDate>Sat, 12 Jul 2008 18:35:00 +0000</pubDate><atom:updated>2008-07-12T21:40:43.107+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>«Незаметный» запуск внешних процессов</title><description>Иногда возникает необходимость запустить внешний процесс, получить от него какие-либо данные (либо просто дать ему возможность отработать) и затем его закрыть. В .NET Framework для этих целей служит класс &lt;span style="font-weight: bold;"&gt;System.Diagnostics.Process&lt;/span&gt; и с этим классом запуск процессов весьма прост. Однако внешний процесс становится виден пользователю (часто это можно наблюдать при работе инсталляторов), что, вообще-то говоря, нежелательно. А вот чтобы запустить внешний процесс незаметно для пользователя, надо в классе настроек запуска процесса &lt;span style="font-weight: bold;"&gt;ProcessStartInfo &lt;/span&gt;свойству &lt;span style="font-weight: bold;"&gt;WindowStyle &lt;/span&gt;присвоить значение &lt;span style="font-weight: bold;"&gt;ProcessWindowStyle.Hidden&lt;/span&gt;. Но, как гласит русская народная пословица, лучше один раз увидеть, чем сто раз услышать, и поэтому ниже представлен небольшой пример «незаметного» запуска процессов. Приведенный фрагмент кода запускает утилиту Reg.exe (Console Registry Tool for Windows) и делает бэкап ветки реестра HKEY_CLASSES_ROOT\mailto в файл.             &lt;br /&gt;       &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;static&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main()&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;{&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color: teal;"&gt;ProcessStartInfo&lt;/span&gt; startInfo = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ProcessStartInfo&lt;/span&gt;();&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;startInfo.FileName = &lt;span style="color: maroon;"&gt;"reg"&lt;/span&gt;;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;startInfo.Arguments = &lt;span style="color: maroon;"&gt;@"save HKEY_CLASSES_ROOT\mailto c:\mailto.reg"&lt;/span&gt;;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;startInfo.WindowStyle = &lt;span style="color: teal;"&gt;ProcessWindowStyle&lt;/span&gt;.Hidden;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color: teal;"&gt;Process&lt;/span&gt;.Start(startInfo);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;"&gt;}&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-5908336516952963542?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/QggkFQGbsKA/blog-post.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/07/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-5097249784216085194</guid><pubDate>Mon, 07 Jul 2008 07:53:00 +0000</pubDate><atom:updated>2008-12-11T08:22:31.125+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>P/Invoke Interop Assistant</title><description>Команда CLR Interop недавно выпустила новый инструмент под названием &lt;a href="http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120"&gt;P/Invoke Interop Assistant&lt;/a&gt;. Как можно догадаться из названия, он умеет генерировать код на С# и VB.NET для вызова native функций в .net приложениях. На рисунке ниже представлено главное окно P/Invoke Interop Assistant.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wH1VzXDaKGc/SHHL7u6q4VI/AAAAAAAAAFM/doloFgWGig8/s1600-h/func_search.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_wH1VzXDaKGc/SHHL7u6q4VI/AAAAAAAAAFM/doloFgWGig8/s400/func_search.JPG" alt="" id="BLOGGER_PHOTO_ID_5220177670165946706" border="0" /&gt;&lt;/a&gt;Если сравнивать его с другим популярным инструментом подобного рода – &lt;a href="http://www.pinvoke.net/"&gt;PInvoke.net&lt;/a&gt;, то в целом они очень похожи, хотя и есть некоторые отличия. На рисунке ниже изображено главное окно PInvoke.net.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wH1VzXDaKGc/SHHMERrB5-I/AAAAAAAAAFU/s93FS60RFYs/s1600-h/func_search2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_wH1VzXDaKGc/SHHMERrB5-I/AAAAAAAAAFU/s93FS60RFYs/s400/func_search2.JPG" alt="" id="BLOGGER_PHOTO_ID_5220177816934541282" border="0" /&gt;&lt;/a&gt;P/Invoke Interop Assistant реализован отдельным инструментом и более функционален: в нем реализован контекстный поиск, есть генерация для типов и что особенно удобно есть генерация кода констант. Однако большая функциональность делает его несколько более сложным в использовании.&lt;br /&gt;PInvoke.net существенно проще в использовании, и интегрируется в студию (в главном меню появляется пункт PInvoke.net). Ко всему прочему, PInvoke.net генерирует более простой код.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-5097249784216085194?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/9YjMPgr6QiQ/pinvoke-interop-assistant.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_wH1VzXDaKGc/SHHL7u6q4VI/AAAAAAAAAFM/doloFgWGig8/s72-c/func_search.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/07/pinvoke-interop-assistant.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-3076215779614867307</guid><pubDate>Wed, 02 Jul 2008 08:19:00 +0000</pubDate><atom:updated>2008-12-11T08:22:31.756+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><category domain="http://www.blogger.com/atom/ns#">debugging</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio .Net</category><title>Отладка с исходниками .NET Framework в VS 2005 или краткое руководство по NetMassDownloader</title><description>Многие знают, что Microsoft открыла существенную часть исходного кода .NET Framework 2.0. Автоматическое скачивание исходников и отладочных файлов из интернета стало доступно с VS 2008 (&lt;a href="http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx"&gt;здесь&lt;/a&gt; можно прочитать подробнее) Однако воспользоваться удобством отладки с исходным кодом можно и на VS 2005. Kerem Kusmezer и John Robbins написали приложение, которое скачивает на вашу машину все исходники и файлы для отладки для нужных вам сборок .NET 2.0. (Для справки: Джон Роббинс – известный эксперт в области отладки приложений и автор большого количества книг на эту тему под Windows и .NET, второго чела не знаю :)). Этой утилитой удобно пользоваться и при работе на VS 2008, поскольку она автоматически скачивает все исходники и файлы отладки, и затем вам не потребуется постоянный коннект с интернетом при отладке.&lt;br /&gt;&lt;br /&gt;Итак, ближе к делу. Называется утилита &lt;span style="font-weight: bold;"&gt;NetMassDownloader&lt;/span&gt;, а скачать ее можно &lt;a href="http://www.codeplex.com/NetMassDownloader"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Далее: краткая инструкция, как скачать исходники .NET 2.0. и файлы отладки, как настроить 2005 студию и пару советов от меня. Описание от авторов, как работать с утилитой, можно найти на CodePlex (на странице загрузки &lt;a href="http://www.codeplex.com/NetMassDownloader"&gt;NetMassDownloader&lt;/a&gt;) или на &lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2008/02/05/download-all-the-net-reference-source-code-at-once-with-net-mass-downloader.aspx"&gt;блоге&lt;/a&gt; Джеффри Роббинса).&lt;br /&gt;&lt;br /&gt;Чтобы скачать исходники и отладочные файлы, запустите NetMassDownloader со следующими параметрами:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;NetMassDownloader.exe –d C:\Windows\Microsoft.NET\Framework\v2.0.50727 –output c:\.NETSource&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Как можно догадаться из параметров, &lt;span style="font-weight: bold;"&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727&lt;/span&gt; – это путь, где установлены библиотеки фреймворка, а &lt;span style="font-weight: bold;"&gt;c:\.NETSource&lt;/span&gt; – путь, куда надо сохранить исходники и файлы отладки.&lt;br /&gt;&lt;br /&gt;После того, как исходники скачаны (у меня их размер составил около 130Mb, так что наберитесь терпения), можно перейти к настройке студии. В окне &lt;span style="font-weight: bold;"&gt;Options &lt;/span&gt;(&lt;span style="font-weight: bold;"&gt;Tools&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;Options&lt;/span&gt;) найдите узел &lt;span style="font-weight: bold;"&gt;Debugging&lt;/span&gt;, раскройте его и откройте свойства узла &lt;span style="font-weight: bold;"&gt;Symbols&lt;/span&gt;. В списке &lt;span style="font-weight: bold;"&gt;Symbol file (.pdb) locations&lt;/span&gt; добавьте каталог, куда были скачаны исходники. Пример того, как это сделано у меня, на рисунке ниже.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wH1VzXDaKGc/SGs88x23h1I/AAAAAAAAAEs/zjHCzMiYxxE/s1600-h/VS2005Options-Debugging-Symbols.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_wH1VzXDaKGc/SGs88x23h1I/AAAAAAAAAEs/zjHCzMiYxxE/s400/VS2005Options-Debugging-Symbols.jpg" alt="" id="BLOGGER_PHOTO_ID_5218331608112138066" border="0" /&gt;&lt;/a&gt;Далее, в том же узле &lt;span style="font-weight: bold;"&gt;Debugging &lt;/span&gt;откройте свойства узла &lt;span style="font-weight: bold;"&gt;General &lt;/span&gt;и снимите флаг с опции &lt;span style="font-weight: bold;"&gt;Require source files to exactly match the original version&lt;/span&gt; (см. рисунок ниже).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wH1VzXDaKGc/SGs9YEoPEGI/AAAAAAAAAE0/L0KM7yYSwCg/s1600-h/VS2005Options-Debugging-General.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_wH1VzXDaKGc/SGs9YEoPEGI/AAAAAAAAAE0/L0KM7yYSwCg/s400/VS2005Options-Debugging-General.jpg" alt="" id="BLOGGER_PHOTO_ID_5218332077007507554" border="0" /&gt;&lt;/a&gt;Если вы ранее уже скачивали pdb-файлы фреймворка, то их надо удалить, т.к. есть вероятность, что он возьмет их, а не те, что вы скачали при помощи &lt;span style="font-weight: bold;"&gt;NetMassDownloader&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Чтобы проверить, всё ли у вас работает, создайте новый проект,  например,  WindowsApplication, в конструкторе формы поставьте брейкпоинт (до вызова InitializeComponent) и запускайте отладку. Как только отладчик остановится на конструкторе вашей формы, нажимайте F11. Затем появится диалог, чтобы вы указали, где находится код файла Form.cs. В моем случае это следующий путь:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;c:\.NetSource\RedBits\ndp\fx\src\WinForms\Managed\System\WinForms\Form.cs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;После этого у вас в IDE должен открыться исходный код класса Form.cs.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wH1VzXDaKGc/SGs9nqOI96I/AAAAAAAAAE8/nKgCIKvUosU/s1600-h/Breakpoint.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_wH1VzXDaKGc/SGs9nqOI96I/AAAAAAAAAE8/nKgCIKvUosU/s400/Breakpoint.jpg" alt="" id="BLOGGER_PHOTO_ID_5218332344796641186" border="0" /&gt;&lt;/a&gt;В дальнейшем, для этого сеанса работы студия будет автоматически находить исходники. Если вас напрягает искать первый файл с исходником, то можно каталог исходников добавить в свойства проекта:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wH1VzXDaKGc/SGs93ePI8uI/AAAAAAAAAFE/ZaEfNG6UlGo/s1600-h/SolutionOptions.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wH1VzXDaKGc/SGs93ePI8uI/AAAAAAAAAFE/ZaEfNG6UlGo/s400/SolutionOptions.jpg" alt="" id="BLOGGER_PHOTO_ID_5218332616457515746" border="0" /&gt;&lt;/a&gt;Ну вот и все, легкой вам отладки!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-3076215779614867307?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/EskuvNpU14w/net-framework-vs-2005-netmassdownloader.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_wH1VzXDaKGc/SGs88x23h1I/AAAAAAAAAEs/zjHCzMiYxxE/s72-c/VS2005Options-Debugging-Symbols.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/07/net-framework-vs-2005-netmassdownloader.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-3178019789686283221</guid><pubDate>Fri, 27 Jun 2008 15:31:00 +0000</pubDate><atom:updated>2008-06-27T18:33:42.120+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">other</category><title>Знаете ли вы, что…</title><description>… среди блогов MSDN появился блог Сары Форд, переведенный на &lt;a href="http://blogs.msdn.com/rusaraford"&gt;русский&lt;/a&gt; (за что огромное спасибо Виталию Зайко). Сара Форд (ее оригинальный блог &lt;a href="http://blogs.msdn.com/saraford"&gt;здесь&lt;/a&gt;) работает в инженером по тестированию Visual Studio, а так же ведет блог по различным How-to и Did you know по использованию различных версий студии. Сара экстремально активный блогер, каждый день она как правило публикует по статье, так что скучать не придется :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-3178019789686283221?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/LkJ1HYoiRlU/blog-post_27.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>1</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/06/blog-post_27.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-2472352590750354794</guid><pubDate>Thu, 19 Jun 2008 17:58:00 +0000</pubDate><atom:updated>2008-06-19T21:08:25.910+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Shell Extension Handlers на .NET</title><description>Вчера разбирался с  Shell Extension-ами нашего проекта. Мне предстояло сделать что-бы контекстное меню для определённой иконки на десктопе формировалось динамически. Решил погуглить на счет примера реализации системного интерфейса &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;IContextMenu&lt;/span&gt; на .net и вот какую вешь обнаружил. Оказывается Майкрософт крайне не рекомендует реализовывать Shell Extension Handler-ы на .net, и особенно те которые могут загружаться в процессы (in-process shell extensions). Вот &lt;a href="http://forums.msdn.microsoft.com/en-US/netfxbcl/thread/1428326d-7950-42b4-ad94-8e962124043e/"&gt;ссылка&lt;/a&gt; на на оригинальное сообщение Jesse &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Kaplan&lt;/span&gt;, (одного из &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;CLR&lt;/span&gt; Program Manager), а ниже мой вольный перевод его слов:   &lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;К сожалению, единственный способ реализовать их – это неуправляемый С++ . Создание расширителей оболочки, которые загружаются в процесс (in-process shell extensions), это в действительности очень опасная вешь, поскольку таким образом вы можете внедрить управляемый код (и .NET Framework) в каждое приложение на машине, у которого есть стандартный Windows-диалог для открытия файлов.   &lt;br /&gt;&lt;br /&gt;Проблемы возникают из-за того что только одна версия .NET Framework может быть загружена в процесс (другие компоненты предназначенные для совместного использования как java и &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;msxml&lt;/span&gt; имеют те же свойства и как следствие те же ограничения).   &lt;br /&gt;&lt;br /&gt;Если вы напишете ваш расширитель оболочки на .NET Framework 2.0 , а приложение написанное на .NET Framework 1.1 создаст стандартный диалог для открытия файлов ваш расширитель сгенерирует ошибку, так как не сможет работать на младшей версии. Все может стать еще даже хуже если ваш расширитель загрузится в процесс раньше другого приложения на .net. Наличие вашего расширителя может привести к тому что приложению придётся  работать на версии рантайма, на которую оно не было рассчитано и оно упадёт.     Из-за всех этих проблем мы настоятельно рекомендуем не использовать исполняющие среды и библиотеки, которые поддерживают загрузку только единственной версии в процесс (такие как .NET Framework, java, or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;msxml&lt;/span&gt;) для разработки расширителей оболочки.     &lt;/blockquote&gt;&lt;br /&gt;Вот такие дела. Тем не менее, если все таки кому-то надо реализовывать расширители оболочки, то хороший пример находится совсем рядом:  &lt;span style="font-weight: bold;"&gt;VS2003Dir\&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;SDK&lt;/span&gt;\v1.1\Samples\Technologies\&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Interop&lt;/span&gt;\Applications\&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;ShellCmd&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;&lt;br /&gt;где &lt;span style="font-weight: bold;"&gt;VS2003Dir&lt;/span&gt; – это каталог, где установлена 2003 студия.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-2472352590750354794?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/QghqADR4SjY/shell-extension-handlers-net.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>4</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/06/shell-extension-handlers-net.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-7476882839441201570</guid><pubDate>Thu, 19 Jun 2008 09:29:00 +0000</pubDate><atom:updated>2008-06-19T12:36:56.887+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><title>Как стать экспертом</title><description>На днях искал как поставить ударение над символом, при наборе текста в ворде. Попробовал метод научного тыка, но не нашел. Решил погулить и наткнулся на замечательный сайт  полезных советов по ворду -- &lt;a href="http://wordexpert.ru/"&gt;WordExpert.ru&lt;/a&gt;. Уверен, что у каждого время от времени возникают подобные вопросы, поэтому надеюсь, что ссылка окажется полезной.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-7476882839441201570?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/329gvd_QRqQ/blog-post_19.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>0</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/06/blog-post_19.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-3890068059542700527</guid><pubDate>Mon, 16 Jun 2008 07:16:00 +0000</pubDate><atom:updated>2008-12-11T08:22:34.690+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>GUI Шпионы (информация к размышлению)</title><description>В этой статье я попытался сделать краткий обзор инструментов, которые помогают исследовать пользовательский интерфейс Windows-приложений, и с которыми мне в той или иной мере доводилось работать самому. Для иллюстрации работы инструментов я буду использовать простую форму с кнопкой и пустым (и по этому невидимым в рантайме) PictureBox. Вот как эта форма выглядит в дизайн-тайме (первый) и в рантайме (второй).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wH1VzXDaKGc/SFYVVzRe73I/AAAAAAAAADE/2JwJSR-hVLU/s1600-h/test_form_small.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_wH1VzXDaKGc/SFYVVzRe73I/AAAAAAAAADE/2JwJSR-hVLU/s400/test_form_small.jpg" alt="" id="BLOGGER_PHOTO_ID_5212377083012902770" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYVeLgGn0I/AAAAAAAAADM/EAfaZNaxCcI/s1600-h/test_form_runtime_small.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYVeLgGn0I/AAAAAAAAADM/EAfaZNaxCcI/s400/test_form_runtime_small.jpg" alt="" id="BLOGGER_PHOTO_ID_5212377226955628354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Итак, встречайте: &lt;span style="font-weight: bold;"&gt;Spy ++, The Customiser, Managed Spy &lt;/span&gt;и&lt;span style="font-weight: bold;"&gt; WfSpy&lt;/span&gt;. Первые два инструмента рассчитаны на работу с native Win32 приложениями, так как были созданы до появления технологии .NET, однако работу свою выполняют хорошо и с managed-приложениями. Естественно, всех свойств и событий для .NET контролов они не покажут, но наиболее важные, такие как: координаты, размеры, текст, доступность (enable/disable) - будут.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Spy ++ (Microsoft, Win32)     &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Пожалуй, самый известный в своем роде. Этим инструментом я пользуюсь постоянно и по сей день, поскольку это самый надежный инструмент из перечисленных. Не так давно у него появился младший брат &lt;span style="font-weight: bold;"&gt;Remote Spy&lt;/span&gt; – ориентированный на работу с приложениями, написанными для мобильных устройств.Но это уже совсем другая история. &lt;span style="font-weight: bold;"&gt;Spy++&lt;/span&gt; уже много лет входит в состав Visual Studio. Однако через меню кнопки &lt;span style="font-weight: bold;"&gt;Пуск (Start)&lt;/span&gt; вы его, скорее всего, не найдете и поэтому рекомендую самостоятельно поискать в каталоге установки студии через обычный файловый поиск &lt;span style="font-weight: bold;"&gt;spyxx.exe&lt;/span&gt;. У меня он находится здесь &lt;span style="font-weight: bold;"&gt;VSDir\Common7\Tools&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;VSDir&lt;/span&gt; – каталог, где установлена студия).  На рисунке ниже представлено главное окно &lt;span style="font-weight: bold;"&gt;Spy++&lt;/span&gt;, как оно выглядит сразу же после старта.&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wH1VzXDaKGc/SFYV_uWpSdI/AAAAAAAAADU/fXicJQykrHk/s1600-h/spyxx_main_win.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wH1VzXDaKGc/SFYV_uWpSdI/AAAAAAAAADU/fXicJQykrHk/s400/spyxx_main_win.jpg" alt="" id="BLOGGER_PHOTO_ID_5212377803246881234" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;Инструмент умеет показывать информацию о запущенных процессах, созданных окнах, потоках. Но работает только в режиме readonly – показывает различные свойства перечисленных объектов системы, но менять не дает, в отличие от &lt;span style="font-weight: bold;"&gt;The Customiser&lt;/span&gt; или &lt;span style="font-weight: bold;"&gt;Managed Spy&lt;/span&gt;. Позволяет так же отслеживать события, которые приходят к интересующему окну.     Чтобы начать исследовать какую-нибудь сложную форму или контрол, вызовите команду &lt;span style="font-weight: bold;"&gt;Find Window &lt;/span&gt;из меню &lt;span style="font-weight: bold;"&gt;Spy&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYWvBgeaHI/AAAAAAAAADk/_CEmdiElazY/s1600-h/spyxx_find_win.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYWvBgeaHI/AAAAAAAAADk/_CEmdiElazY/s400/spyxx_find_win.jpg" alt="" id="BLOGGER_PHOTO_ID_5212378615842236530" border="0" /&gt;&lt;/a&gt;В появившемся диалоге наведите курсор на иконку окна с прицелом и перетащите ее на интересующее окно или контрол.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wH1VzXDaKGc/SFYWeut3zqI/AAAAAAAAADc/r-EV0k7i6BU/s1600-h/spyxx_call_find_win.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_wH1VzXDaKGc/SFYWeut3zqI/AAAAAAAAADc/r-EV0k7i6BU/s400/spyxx_call_find_win.jpg" alt="" id="BLOGGER_PHOTO_ID_5212378335920246434" border="0" /&gt;&lt;/a&gt;Затем нажмите OK. В результате появится диалог со свойствами выбранного объекта. Пример такого окна ниже.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYXEZwpeJI/AAAAAAAAADs/PDl91W6ekiY/s1600-h/spyxx_result_win.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYXEZwpeJI/AAAAAAAAADs/PDl91W6ekiY/s400/spyxx_result_win.jpg" alt="" id="BLOGGER_PHOTO_ID_5212378983129774226" border="0" /&gt;&lt;/a&gt;С этого диалога на закладке &lt;span style="font-weight: bold;"&gt;Windows &lt;/span&gt;можно быстро перейти к родительскому окну, на закладке &lt;span style="font-weight: bold;"&gt;Process &lt;/span&gt;можно быстро перейти к родительскому процессу или потоку исследуемого окна. Если нажать кнопку &lt;span style="font-weight: bold;"&gt;Synchronize&lt;/span&gt;, выбранный объект будет найден в дереве окон, которое отображается в центральной части главного окна.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wH1VzXDaKGc/SFYXjgumoLI/AAAAAAAAAD0/-0385bzXmR8/s1600-h/spyxx_result_win3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_wH1VzXDaKGc/SFYXjgumoLI/AAAAAAAAAD0/-0385bzXmR8/s400/spyxx_result_win3.jpg" alt="" id="BLOGGER_PHOTO_ID_5212379517576192178" border="0" /&gt;&lt;/a&gt;Закроем окно свойств и перейдем к дереву окон. В контекстном меню узла дерева есть несколько команд, но расскажу только о &lt;span style="font-weight: bold;"&gt;Highlight&lt;/span&gt;. Эта команда позволяет подсветить мерцающей рамкой контрол или окно, соответствующее узлу дерева. Разумеется, чтобы ее увидеть, надо чтобы окно, в котором находится выбранный контрол, находилось в области видимости.&lt;br /&gt;Ну, вот вкратце и все. У инструмента еще много возможностей и кого он заинтересует, найдет их самостоятельно.  Дополнительное описание &lt;span style="font-weight: bold;"&gt;Spy++&lt;/span&gt; можно найти на его страничке в &lt;a href="http://msdn.microsoft.com/en-us/library/aa315486%28VS.60%29.aspx"&gt;MSDN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Customiser (Wanga International, Win32)     &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Это первый инструмент такого рода, с которым я познакомился. Настоящая игрушка для программистов (и не только). В изучении пользовательского интерфейса приложений намного удобней и интуитивней &lt;span style="font-weight: bold;"&gt;Spy++&lt;/span&gt; или &lt;span style="font-weight: bold;"&gt;Managed Spy&lt;/span&gt;. Скачать его можно &lt;a href="http://www.wanga.com/download.php"&gt;здесь&lt;/a&gt;. Позволяет во время работы приложения менять свойства его контролов – размеры, положение, надписи, видимость, доступность (enable/disable) и еще много чего. Посылать различные сообщения контролам и окнам. Например, любую кнопку, которая находится в состоянии disable можно сделать enable, потом нажать и посмотреть что произойдет :). Вообще &lt;span style="font-weight: bold;"&gt;The Customiser&lt;/span&gt; умеет много чего, всего и не перечесть. Весьма прикольно при помощи &lt;span style="font-weight: bold;"&gt;The Customiser&lt;/span&gt; модифицировать панель задач и кнопу &lt;span style="font-weight: bold;"&gt;Пуск/Start&lt;/span&gt;. На рисунке ниже показан результат работы над кнопкой &lt;span style="font-weight: bold;"&gt;Start &lt;/span&gt;и панелью задач.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wH1VzXDaKGc/SFYYSi-CL3I/AAAAAAAAAD8/NPm2xf9XwCI/s1600-h/cust_modified_taskbar.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_wH1VzXDaKGc/SFYYSi-CL3I/AAAAAAAAAD8/NPm2xf9XwCI/s400/cust_modified_taskbar.jpg" alt="" id="BLOGGER_PHOTO_ID_5212380325631635314" border="0" /&gt;&lt;/a&gt;После запуска &lt;span style="font-weight: bold;"&gt;The Customise&lt;/span&gt;r появится небольшое окошко с бегающим вправо-влево шариком. Кстати, после инсталляции &lt;span style="font-weight: bold;"&gt;The Customiser&lt;/span&gt; надо искать в корне меню&lt;span style="font-weight: bold;"&gt; All Programs&lt;/span&gt;, никаких папок с именем компании или приложения он не создает.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wH1VzXDaKGc/SFYYmS0IN6I/AAAAAAAAAEE/YpuhGDOOD44/s1600-h/cust_main_win.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_wH1VzXDaKGc/SFYYmS0IN6I/AAAAAAAAAEE/YpuhGDOOD44/s400/cust_main_win.JPG" alt="" id="BLOGGER_PHOTO_ID_5212380664892503970" border="0" /&gt;&lt;/a&gt;Нажмите кнопку &lt;span style="font-weight: bold;"&gt;Edit Window&lt;/span&gt; и появится основное окно для работы. Далее, надо нажать на кнопку On (после чего курсор поменяет свой вид на большой и желтый) и затем можно выбрать интересующее окно или контол.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYYzCueGpI/AAAAAAAAAEM/nefRW1di5Eg/s1600-h/cust_main_win+2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYYzCueGpI/AAAAAAAAAEM/nefRW1di5Eg/s400/cust_main_win+2.JPG" alt="" id="BLOGGER_PHOTO_ID_5212380883912104594" border="0" /&gt;&lt;/a&gt;После выбора компонента для исследования в диалоге появятся дополнительные закладки, на которых сгруппированы информация и действия по изменению компонента.&lt;br /&gt;Коротко опишу назначение каждой закладки.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Size and Position&lt;/span&gt; – просмотр и изменение положения и размеров компонента.  &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Text&lt;/span&gt; – позволяет изменять текст компонента, например, заголовок окна или надпись на кнопке.  &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Misc.&lt;/span&gt; – закладка предназначена для изменения таких свойств компонента как enable, visibility. Также содержатся команды для посылки событий типа maximize, minimize.   &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;API Message&lt;/span&gt; – закладка предназначена для послылки компоненту всевозможных событий.&lt;/li&gt;&lt;/ul&gt;Несмотря на богатые возможности и простоту работы с инструментом иногда отказывается работать и повисает. Порой еще и винду вешает.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Managed Spy (Microsoft, .NET 2.0)     &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Это бесплатный инструмент, написанный &lt;a href="http://blogs.msdn.com/benwu"&gt;Benjamin Wulfe&lt;/a&gt;, участвовавшим в разработке Visual Studio, дизайнера Windows Forms, и ряда классов для Framework и Compact Framework. Скачать &lt;span style="font-weight: bold;"&gt;ManagedSpy &lt;/span&gt;можно &lt;a href="http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/ManagedSpy.exe"&gt;здесь&lt;/a&gt;.     Сразу после старта в левой части окна отображаются процессы с managed кодом, а справа – свойства выбранного процесса или его дочернего элемента.   &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYZXZgRJBI/AAAAAAAAAEU/g7qaSxvM8cw/s1600-h/managedspy.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYZXZgRJBI/AAAAAAAAAEU/g7qaSxvM8cw/s400/managedspy.jpg" alt="" id="BLOGGER_PHOTO_ID_5212381508501840914" border="0" /&gt;&lt;/a&gt;В панели свойств отображаются свойства выбранного контрола, где их можно не только просматривать, но и менять (в отличие от &lt;span style="font-weight: bold;"&gt;Spy++&lt;/span&gt;). На рисунке ниже показан результат изменения свойства BackColor для невидного в рантайме PictureBox.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wH1VzXDaKGc/SFYZtmlp8kI/AAAAAAAAAEc/ZRvWn_zHrZk/s1600-h/managedspy_prop_change.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_wH1VzXDaKGc/SFYZtmlp8kI/AAAAAAAAAEc/ZRvWn_zHrZk/s400/managedspy_prop_change.jpg" alt="" id="BLOGGER_PHOTO_ID_5212381889971221058" border="0" /&gt;&lt;/a&gt;Есть функция, позволяющая на исследуемом окне подсветить исследуемый контрол (аналогично команде &lt;span style="font-weight: bold;"&gt;Highlight&lt;/span&gt; из &lt;span style="font-weight: bold;"&gt;Spy++&lt;/span&gt;). Для этого в меню &lt;span style="font-weight: bold;"&gt;View&lt;/span&gt; вызовите команду &lt;span style="font-weight: bold;"&gt;Show Window&lt;/span&gt;.     В общем-то, простой и удобный использовании инструмент, но, к сожалению, не на всех окнах &lt;span style="font-weight: bold;"&gt;ManagedSpy&lt;/span&gt; работает. На простых все ОК, а вот на сложных иногда дает сбои. По крайней мере, у себя в проекте я им воспользоваться не смог.     Более подробное описание &lt;span style="font-weight: bold;"&gt;ManagedSpy&lt;/span&gt; можно найти в &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163617.aspx"&gt;статье&lt;/a&gt; в MSDN Magazine.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;WfSpy (.NET 1.0, .NET 1.1)     &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Инструмент написан Rama Krishna Vavilala. Распространяется бесплатно и исходниками, которые прилагаются к его статье на &lt;span style="font-weight: bold;"&gt;CodeProject&lt;/span&gt;. Статья доступна вот &lt;a href="http://www.codeproject.com/KB/dotnet/wfspy.aspx"&gt;здесь&lt;/a&gt;. К ней прилагается вариант, скомпилированный для .net 1.0. но для работы под .net 1.1 достаточно его просто перекомпилировать в VS 2003.   В целом по внешнему виду очень похож на &lt;span style="font-weight: bold;"&gt;ManagedSpy&lt;/span&gt;. Сразу после старта в центральной части окна отображаются процессы с managed кодом. Чтобы посмотреть свойства заинтересовавшего компонента надо нажать кнопку &lt;span style="font-weight: bold;"&gt;Details&lt;/span&gt;. После чего откроется окно со списком свойств выбранного компонента, где можно как просматривать, так и изменять свойства компонента.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYaP44Po4I/AAAAAAAAAEk/YJxP09Y1JDE/s1600-h/wfspy_small.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wH1VzXDaKGc/SFYaP44Po4I/AAAAAAAAAEk/YJxP09Y1JDE/s400/wfspy_small.JPG" alt="" id="BLOGGER_PHOTO_ID_5212382478996579202" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Заключение  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Как видно из этого небольшого обзора, большинство инструментов достаточно просты и работа с ними интуитивно понятна. Самый сложный в использовании – это &lt;span style="font-weight: bold;"&gt;Spy++&lt;/span&gt;, однако, он, пожалуй, и самый функциональный. В статье приведены четыре инструмента, с другими мне сталкиваться не приходилось, так что если вы знакомы с каким-либо еще подобным инструментом - пожалуйста, напишите об этом в комментариях.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-3890068059542700527?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/ztJx1bjCbYk/gui.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_wH1VzXDaKGc/SFYVVzRe73I/AAAAAAAAADE/2JwJSR-hVLU/s72-c/test_form_small.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/06/gui.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-2742594671888760880</guid><pubDate>Fri, 06 Jun 2008 08:56:00 +0000</pubDate><atom:updated>2008-06-06T12:05:35.017+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>Скромный пожиратель ресурсов</title><description>В состав Visual Studio входит небольшая утилитка командной строки &lt;span style="font-weight: bold;"&gt;consume.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;exe&lt;/span&gt;&lt;/span&gt;, которая предназначена для загрузки ресурсов системы при нагрузочном тестировании. Найти ее можно по следующему пути: &lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;VSInstallDir&lt;/span&gt;\Common7\Tools\Bin. &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;VSInstallDir&lt;/span&gt; &lt;/span&gt;– это путь где у Вас установлена студия. Основная задача этой утилиты – на определенное время основательно занаять какой-либо ценный ресурс системы (например, оперативную память, процессорное время, дисковое пространство и т.д). Формат работы утилиты следующий:   &lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;consume RESOURCE [-time SECONDS]     &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RESOURCE&lt;/span&gt; – как можно догадаться по имени параметра, это ресурс системы который надо занять. Он может принимать одно из следующих значений:  &lt;br /&gt;&lt;ul&gt;&lt;li&gt;-physical-memory    &lt;/li&gt;&lt;li&gt;-page-file    &lt;/li&gt;&lt;li&gt;-disk-space    &lt;/li&gt;&lt;li&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;cpu&lt;/span&gt;-time    &lt;/li&gt;&lt;li&gt;-kernel-pool     &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SECONDS&lt;/span&gt; – а это время в секундах на которое надо занять ресурс.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-2742594671888760880?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/LwpLxvJKyvk/blog-post.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>4</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/06/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-740058823166566707</guid><pubDate>Sun, 01 Jun 2008 10:44:00 +0000</pubDate><atom:updated>2008-06-01T13:47:08.763+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><title>Как быстро закрыть 23 Internet Explorer’а</title><description>&lt;span&gt;&lt;span&gt;Не знаю, кто как, а я для подобных целей использую утилиту Windows  &lt;strong&gt;taskkill&lt;/strong&gt; вот с такими параметрами:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;strong&gt;taskkill /f /im iexplore.exe&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;Чтобы не ошибиться с набором имени процесса, можно вывести список всех процессов в консоль утилитой &lt;strong&gt;tasklist&lt;/strong&gt; и потом воспользоваться командами &lt;strong&gt;Mark/Paste&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Я  постоянно пользуюсь этой командой для закрытия нашего клиентского приложения, потому как что бы закрыть его обычным способом приходится делать слишком много движений и кликов мыши:&lt;br /&gt;&lt;br /&gt;1. В System Tray найти иконку приложения.&lt;br /&gt;2. Открыть у него контекстное меню.&lt;br /&gt;3. В меню выбрать команду Exit.&lt;br /&gt;4. И наконец, подтвердить, закрытие приложение.&lt;br /&gt;&lt;br /&gt;И когда приходится по 20 раз на день запускать/закрывать  клиента, я всегда держу открытым консольное окно с командой для запуска и закрытия приложения.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-740058823166566707?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/c47KIab0VdU/23-internet-explorer.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>2</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/06/23-internet-explorer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-7316371686520847830</guid><pubDate>Fri, 30 May 2008 08:41:00 +0000</pubDate><atom:updated>2008-05-30T11:48:10.348+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips and tricks</category><category domain="http://www.blogger.com/atom/ns#">other</category><title>Смотрю в книгу – вижу буквы</title><description>Недавно нашел интересную статью &lt;a href="http://www.stevemcconnell.com"&gt;Стива Макконелла&lt;/a&gt; «&lt;a href="http://www.computer.org/portal/cms_docs_software/software/content/how_to_read_a_technical_article.pdf"&gt;How To Read a Technical Article&lt;/a&gt;». Эту статью он написал 10 лет назад, когда занимал должность главного редактора в &lt;a href="http://www.computer.org/portal/site/software"&gt;IEEE Software&lt;/a&gt;. Макконелл обобщает свой опыт чтения статей на компьютерную тематику и объясняет, как можно извлечь из статьи максимум пользы при лимите времени. Несмотря на то, что статья Макконелла прежде всего ориентирована на чтение статей в традиционных журналах, уверен, что его советы окажутся полезными и для статей блогосферы.&lt;br /&gt;&lt;br /&gt;Он выделяет 4 типа чтения:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Базовый – распознавание отдельных слов. Приобретается, как правило, в детском саду. Название этой статьи характеризует данный стиль чтения.&lt;/li&gt;&lt;li&gt;Обзорное – более продвинутый уровень. Ориентирован на получение максимума информации за ограниченное время. Его еще называют «чтение по диагонали».&lt;/li&gt;&lt;li&gt;Аналитический – еще более продвинутый уровень. Извлечение максимума информации при неограниченном количестве времени. &lt;/li&gt;&lt;li&gt;Синтезирующий – самый крутой уровень. Получение информации из нескольких литературных источников, которой может и не быть в явном виде в каждом из них отдельно. Описание запутанное, но уровень обязывает :).&lt;/li&gt;&lt;/ul&gt;Начинать чтение Макконелл рекомендует с получения общей информации о статье: прочитать аннотацию, введение, заключение, название разделов статьи, затем прочитать статью по диагонали и, наконец, повторно прочитать заинтересовавшие разделы статьи – ещё более внимательно.&lt;br /&gt;&lt;br /&gt;Также Макконелл рекомендует вступить в диалог с автором статьи и ответить на ряд вопросов, которые помогут понять статью лучше. Вот некоторые из них:&lt;br /&gt;•    О чем эта статья в целом?&lt;br /&gt;•    На чем автор хотел заострить внимание читателей?&lt;br /&gt;•    Не привирает ли автор в целом и в мелочах?&lt;br /&gt;•    Почему он пишет о A, а не о B?&lt;br /&gt;&lt;br /&gt;P.S. В начале статьи я привел ссылку, где статью можно скачать совершенно бесплатно, а &lt;a href="http://csdl2.computer.org/persagen/DLAbsToc.jsp?resourcePath=/dl/mags/so/&amp;amp;toc=comp/mags/so/1998/06/s6toc.xml&amp;amp;DOI=10.1109/MS.1998.10035"&gt;здесь&lt;/a&gt; ее предлагают купить за 19$ и вот что интересно: обе ссылки мне выдал Google и оба ресурса принадлежат IEEE Software. Странный бизнес.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-7316371686520847830?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/z4-wNbUJmsU/blog-post_30.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>2</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/05/blog-post_30.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2814402786100989215.post-2404388459423578981</guid><pubDate>Tue, 27 May 2008 08:25:00 +0000</pubDate><atom:updated>2008-05-27T13:58:23.120+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">other</category><title>Ложка меда в бочке дегтя</title><description>Недавно &lt;a href="http://stump-workshop.blogspot.com/2008/05/msdn.html"&gt;Сергей Розовик&lt;/a&gt; описывал неудобства связвнные с новым &lt;a href="http://msdn.microsoft.com/en-us/magazine/default.aspx"&gt;MSDN Magazine Online&lt;/a&gt;. Однако не все так плохо, есть и положительные мометны. Об одном из них я и хочу написать.  Я не сам ее обнаружил :), об этой фиче написал в своем блоге &lt;a href="http://blogs.msdn.com/jmstall/archive/2008/05/19/nice-msdn-urls.aspx"&gt;Mike Stall&lt;/a&gt;. &lt;br /&gt;Суть ее в том, что статью из MSDN для класса из BCL можно открыть по урлам такого вот вида:&lt;br /&gt;&lt;br /&gt;http://msdn.microsoft.com/en-us/library/&lt;span style="font-weight: bold;"&gt;system.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;io.&lt;br /&gt;                    filesystemwatcher&lt;/span&gt;.aspx – для класса&lt;br /&gt;&lt;br /&gt;http://msdn.microsoft.com/en-us/library/&lt;span style="font-weight: bold;"&gt;system.io.&lt;br /&gt;                   filesystemwatcher.waitforchanged&lt;/span&gt;.aspx – для метода класса&lt;br /&gt;&lt;br /&gt;http://msdn.microsoft.com/en-us/library/&lt;span style="font-weight: bold;"&gt;system.io.&lt;br /&gt;                  filesystemwatcher.path&lt;/span&gt;.aspx – для свойства.&lt;br /&gt;&lt;br /&gt;По моему, это очень удобно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814402786100989215-2404388459423578981?l=andybor.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/andybor/~3/h6KC1NbdnUc/blog-post_27.html</link><author>noreply@blogger.com (Андрей Бороздин)</author><thr:total>3</thr:total><feedburner:origLink>http://andybor.blogspot.com/2008/05/blog-post_27.html</feedburner:origLink></item></channel></rss>

