<?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.paulomorgado.net/~d/styles/itemcontent.css"?><rss xmlns:a10="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Paulo Morgado</title><link>http://paulomorgado.net/pt/</link><description>Aventuras em .NET, Engenharia de Software e Arquitectura de Software</description><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><a10:id>/PauloMorgado/Blogs/PT</a10:id><dc:language xmlns:dc="http://purl.org/dc/elements/1.1/">pt-PT</dc:language><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.paulomorgado.net/PauloMorgado/Blogs/PT" /><feedburner:info uri="paulomorgado/blogs/pt" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38676</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/3T9fYjHKo7w/proposta-c-verifica-231-227-o-est-225-tica-de-objectos-din-226-micos-em-tempo-de-compila-231-227-o.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><title>Proposta C#: Verificação Estática De Objectos Dinâmicos Em Tempo De Compilação</title><description>&lt;p align="justify"&gt;O &lt;a title="Microsoft Visual C#" href="http://cli.gs/vcsharp" target="_blank"&gt;C#&lt;/a&gt; 4.0 introduz um novo tipo: &lt;a title="Using Type dynamic (C# Programming Guide)" href="http://msdn.microsoft.com/library/dd264736(VS.100).aspx" target="_blank"&gt;dynamic&lt;/a&gt;. &lt;strong&gt;dynamic&lt;/strong&gt; é um tipo estático que contorna os mecanismos de verificação estática de tipos.&lt;/p&gt;  &lt;p align="justify"&gt;Este novo tipo é muito útil para interoperar com:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;As novas linguagens da &lt;a title="Dynamic Language Runtime Overview" href="http://msdn.microsoft.com/library/dd233052(VS.100).aspx" target="_blank"&gt;dynamic language runtime&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;HTML Document Object Model (DOM).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Objectos &lt;a title="Component Object Model" href="http://wikipedia.org/wiki/Component_Object_Model" target="_blank"&gt;COM&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a title="Duck typing" href="http://wikipedia.org/wiki/Duck_typing" target="_blank"&gt;Duck typing&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;…&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Porque a verificação estática de tipos é contornada, isto:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;dynamic &lt;/span&gt;dynamicValue = GetValue();
dynamicValue.Method();&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;é equivalente a isto:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;object &lt;/span&gt;objectValue = GetValue();
objectValue
    .GetType()
        .InvokeMember(
            &lt;span style="color:#a31515;"&gt;&amp;quot;Method&amp;quot;&lt;/span&gt;,
            &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.InvokeMethod,
            &lt;span style="color:blue;"&gt;null&lt;/span&gt;,
            objectValue,
            &lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;/pre&gt;

&lt;p align="justify"&gt;Aparte a memorização “escondida” do &lt;em&gt;call site&lt;/em&gt; e alguma resolução dinâmica, &lt;strong&gt;dynamic&lt;/strong&gt; apenas tem melhor aspecto. Qualquer erro de digitação só será descoberto em tempo de execução.&lt;/p&gt;

&lt;p align="justify"&gt;De facto, se estou a escrever o código, eu sei o contrato do que estou a chamar. Não seria bom se o compilador pudesse fazer alguma verificação estática de tipos na interacção com estes objectos dinâmicos?&lt;/p&gt;

&lt;p align="justify"&gt;Imagine-se que o objecto dinâmico que estou a obter na chamada ao método &lt;strong&gt;GetValue&lt;/strong&gt;, alé do método sem parâmetros &lt;strong&gt;Method&lt;/strong&gt; também tem uma propriedade &lt;strong&gt;Property&lt;/strong&gt; do tipo &lt;strong&gt;string&lt;/strong&gt;. Ist quer dizer que, do ponto de vista do código que estou a escrever, o contrato que o objecto dinâmico devolvido por &lt;strong&gt;GetValue&lt;/strong&gt; implementa é:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;string &lt;/span&gt;Property { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }
&lt;span style="color:blue;"&gt;void &lt;/span&gt;Method();&lt;/pre&gt;

&lt;p align="justify"&gt;Com se trata de um contrato bem definido, eu poderia escrever uma &lt;a title="Interfaces (C# Programming Guide)" href="http://msdn.microsoft.com/library/ms173156.aspx" target="_blank"&gt;interface&lt;/a&gt; para o representar:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IValue
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;string &lt;/span&gt;Property { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;void &lt;/span&gt;Method();
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Se &lt;strong&gt;dynamic&lt;/strong&gt; permitisse a especificação do contrato no formato &lt;strong&gt;dynamic(&lt;/strong&gt;&lt;em&gt;contrato&lt;/em&gt;&lt;strong&gt;)&lt;/strong&gt;, eu poderia escrever isto:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;dynamic(&lt;span style="color:#2b91af;"&gt;IValue&lt;/span&gt;) &lt;/span&gt;dynamicValue = GetValue();
dynamicValue.Method();&lt;/pre&gt;

&lt;p align="justify"&gt;Ist não quer dizer que o valor por &lt;strong&gt;GetValue&lt;/strong&gt; tem de implementar a interface &lt;strong&gt;IValue&lt;/strong&gt;. Apenas permite ao compilador verificar que &lt;strong&gt;dynamicValue.Method()&lt;/strong&gt; é uma utilização válida de &lt;strong&gt;dynamicValue&lt;/strong&gt; e &lt;strong&gt;dynamicValue.OtherMethod()&lt;/strong&gt; não.&lt;/p&gt;

&lt;p align="justify"&gt;Se a interface &lt;strong&gt;IValue&lt;/strong&gt; já existir, por alguma razão, não há qualquer problema. Mas ter de adicionar um novo tipo à &lt;em&gt;assembly&lt;/em&gt; apenas para ser usado em tempo de compilação não me parece correcto. Por isso, &lt;strong&gt;dynamic&lt;/strong&gt; podeia ser um novo tipo de especificação de tipos. Algo como:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;dynamic &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DValue
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;string &lt;/span&gt;Property { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;void &lt;/span&gt;Method();
}&lt;/pre&gt;

&lt;p align="justify"&gt;O código passaria a ser escrito assim; &lt;/p&gt;

&lt;p align="justify"&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&lt;span style="color:#2b91af;"&gt;DValue&lt;/span&gt; &lt;/span&gt;dynamicValue = GetValue();
dynamicValue.Method();&lt;/pre&gt;

&lt;p align="justify"&gt;O compilador nunca geraia qualquer IL ou metadados para esta especificação de tipo. Esta especificação de tipo seria usada apenas para o compilador efectuar uma verificação estática dos objectos diâmicos. Como consequência, não faz qualquer sentido ser acessível publicamente, pelo que tal não seria permitido.&lt;/p&gt;

&lt;p align="justify"&gt;Mais uma vez, se a interface &lt;strong&gt;IValue&lt;/strong&gt; (ou qualquer outra definição de tipo) já existir, pode ser usada na definição de tipo dinâmico: &lt;/p&gt;

&lt;p align="justify"&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;dynamic &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DValue&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IValue&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;SomeClass&lt;/span&gt;
{
    &lt;span style="color:blue;"&gt;string &lt;/span&gt;Property { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;void &lt;/span&gt;Method();
}&lt;/pre&gt;

&lt;p&gt;Um benfício acrescido seria &lt;a title="IntelliSense" href="http://wikipedia.org/wiki/Intellisense" target="_blank"&gt;IntelliSense&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tenho recebido reacções mistas em relação a esta proposta. O que acham? Seria algo útil?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38676" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38676" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38676" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=3T9fYjHKo7w:whCO--pC8Y4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=3T9fYjHKo7w:whCO--pC8Y4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=3T9fYjHKo7w:whCO--pC8Y4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=3T9fYjHKo7w:whCO--pC8Y4:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=3T9fYjHKo7w:whCO--pC8Y4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=3T9fYjHKo7w:whCO--pC8Y4:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=3T9fYjHKo7w:whCO--pC8Y4:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/3T9fYjHKo7w" height="1" width="1"/&gt;</description><pubDate>Wed, 17 Mar 2010 02:28:13 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38676</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38676</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2010/03/17/proposta-c-verifica-231-227-o-est-225-tica-de-objectos-din-226-micos-em-tempo-de-compila-231-227-o.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2010/03/17/proposta-c-verifica-231-227-o-est-225-tica-de-objectos-din-226-micos-em-tempo-de-compila-231-227-o.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38674</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/7sGaiJ_vhnU/e-book-gr-225-tis-programming-windows-phone-7-series-de-charles-petzold.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/e-books/default.aspx">e-books</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Free/default.aspx">Free</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/WindowsPhone/default.aspx">WindowsPhone</category><title>e-Book Grátis: Programming Windows Phone 7 Series de Charles Petzold</title><description>&lt;div style="text-align:left;"&gt;   &lt;div style="width:200px;padding-right:10px;float:left;height:240px;"&gt;&lt;a href="http://pontonetpt.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/paulomorgado.metablogapi/2337.WinPhone_5F00_v3_5F00_6A47C6D5.jpg" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="Programming Windows Phone 7 Series - Charles Petzold" border="0" alt="Programming Windows Phone 7 Series - Charles Petzold" align="left" src="http://pontonetpt.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/paulomorgado.metablogapi/8206.WinPhone_5F00_v3_5F00_thumb_5F00_221A0AF9.jpg" width="197" height="240" /&gt;&lt;/a&gt;&lt;/div&gt;    &lt;div style="height:240px;"&gt;     &lt;h3&gt;&lt;a title="PDF: Programming Windows Phone 7 Series" href="http://download.microsoft.com/download/7/C/8/7C820C6F-C205-4ECF-B9F3-1505DD13F9BF/ProgWinPhonePreview.pdf" target="_blank"&gt;PDF: Programming Windows Phone 7 Series&lt;/a&gt;&lt;i&gt;&lt;/i&gt; &lt;/h3&gt;      &lt;h3&gt;&lt;a title="XPS: Programming Windows Phone 7 Series" href="http://download.microsoft.com/download/E/3/5/E359FC51-1CF5-47F1-9BF3-74AB09D3339B/ProgWinPhonePreview.xps" target="_blank"&gt;XPS: Programming Windows Phone 7 Series&lt;/a&gt;&lt;i&gt;&lt;/i&gt; &lt;/h3&gt;      &lt;h3&gt;&lt;a title="Source code" href="http://download.microsoft.com/download/1/D/B/1DB49641-3956-41F1-BAFA-A021673C709E/CodeSamples_DRAFTPreview_ProgrammingWindowsPhone7Series.zip" target="_blank"&gt;Source code&lt;/a&gt; &lt;/h3&gt;   &lt;/div&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38674" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38674" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38674" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=7sGaiJ_vhnU:U2AEkowSRcQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=7sGaiJ_vhnU:U2AEkowSRcQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=7sGaiJ_vhnU:U2AEkowSRcQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=7sGaiJ_vhnU:U2AEkowSRcQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=7sGaiJ_vhnU:U2AEkowSRcQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=7sGaiJ_vhnU:U2AEkowSRcQ:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=7sGaiJ_vhnU:U2AEkowSRcQ:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/7sGaiJ_vhnU" height="1" width="1"/&gt;</description><pubDate>Wed, 17 Mar 2010 00:03:35 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38674</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38674</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2010/03/17/e-book-gr-225-tis-programming-windows-phone-7-series-de-charles-petzold.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2010/03/17/e-book-gr-225-tis-programming-windows-phone-7-series-de-charles-petzold.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38561</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/DUiTTknCTgA/techdays-2010-inscri-231-245-es-abertas.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/TechDays/default.aspx">TechDays</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/TechNet/default.aspx">TechNet</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio2010/default.aspx">VisualStudio2010</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Windows/default.aspx">Windows</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Windows7/default.aspx">Windows7</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/WindowsAzure/default.aspx">WindowsAzure</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/WPF/default.aspx">WPF</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Exchange/default.aspx">Exchange</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/TechDaysPT10/default.aspx">TechDaysPT10</category><title>TechDays 2010: Inscrições Abertas</title><description>&lt;div style="min-width:515px;"&gt;   &lt;p&gt;&lt;a title="Microsoft TechDays 2010" href="http://www.techdays2010.com/" target="_blank"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" border="0" src="http://www.microsoft.com/library/media/2070/portugal/msdn/media/bannertechdays2.png" width="515" height="152" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p align="justify"&gt;Estão abertas as inscrições para o &lt;a title="Microsoft TechDays 2010" href="http://www.techdays2010.com/" target="_blank"&gt;TechDays 2010&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38561" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38561" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38561" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=DUiTTknCTgA:qopuqTvN9JQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=DUiTTknCTgA:qopuqTvN9JQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=DUiTTknCTgA:qopuqTvN9JQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=DUiTTknCTgA:qopuqTvN9JQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=DUiTTknCTgA:qopuqTvN9JQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=DUiTTknCTgA:qopuqTvN9JQ:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=DUiTTknCTgA:qopuqTvN9JQ:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/DUiTTknCTgA" height="1" width="1"/&gt;</description><pubDate>Tue, 09 Feb 2010 23:58:35 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38561</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38561</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2010/02/09/techdays-2010-inscri-231-245-es-abertas.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2010/02/09/techdays-2010-inscri-231-245-es-abertas.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38531</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/j9_foVe3xsw/globaliza-231-227-o-de-s-237-tios-web-usando-o-roteamento-do-asp-net.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><title>Globalização de Sítios Web Usando O Roteamento Do ASP.NET</title><description>&lt;p align="justify"&gt;Para quem não sabe, eu tenho um sítio web (&lt;a title="Paulo Morgado" href="http://PauloMorgado.NET/" target="_blank"&gt;http://PauloMorgado.NET/&lt;/a&gt;) que uso como presença (além dos meus blogues) na web e para testes.&lt;/p&gt;  &lt;p align="justify"&gt;Porque costumo escrever tanto em Português como em Inglês, queria que o sítio tivesse uma versão Portuguesa e uma versão Inglesa. Isto é simples de fazer usando a infra-estrutura de &lt;a title="ASP.NET Globalization and Localization" href="http://msdn.microsoft.com/library/c6zyy3s9.aspx" target="_blank"&gt;Globalização e Localização ASP.NET&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Mas eu queria mais do que apenas adivinhar a língua do utilizador através da linguagem do &lt;strong&gt;browser&lt;/strong&gt;. Queria algo como os sítios da &lt;a title="MSDN - Microsoft Developers Network" href="http://msdn.microsoft.com/" target="_blank"&gt;MSDN&lt;/a&gt; e &lt;a title="Microsoft TechNet: Resources for IT Professionals" href="http://technet.microsoft.com/" target="_blank"&gt;TechNet&lt;/a&gt; onde cultura está embebida no URL o que possibilita ao utilizador escolher em que linguagem deseja ver o sítio.&lt;/p&gt;  &lt;p align="justify"&gt;Com o lançamento do &lt;a title="ASP.NET Routing" href="http://msdn.microsoft.com/library/cc668201.aspx" target="_blank"&gt;ASP.NET Routing&lt;/a&gt;, isto é tão simples como escrever um &lt;a title="IRouteHandler Interface" href="http://msdn.microsoft.com/library/system.web.routing.iroutehandler.aspx" target="_blank"&gt;route handler&lt;/a&gt; que define a cultura do pedido HTTP e devolve o &lt;a title="Page Class" href="http://msdn.microsoft.com/library/system.web.ui.page.aspx" target="_blank"&gt;page&lt;/a&gt; &lt;a title="Introduction to HTTP handlers" href="http://msdn.microsoft.com/library/ms227675(VS.85).aspx" target="_blank"&gt;handler&lt;/a&gt; da página pretendida.&lt;/p&gt;  &lt;p align="justify"&gt;Algo como isto:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;GlobalizationRouteHandler &lt;/span&gt;: &lt;span style="color:blue;"&gt;global&lt;/span&gt;::System.Web.Routing.&lt;span style="color:#2b91af;"&gt;IRouteHandler
&lt;/span&gt;{
    System.Globalization.&lt;span style="color:#2b91af;"&gt;CultureInfo &lt;/span&gt;culture;
    System.Globalization.&lt;span style="color:#2b91af;"&gt;CultureInfo &lt;/span&gt;uiCulture;

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;GlobalizationRouteHandler(System.Globalization.&lt;span style="color:#2b91af;"&gt;CultureInfo &lt;/span&gt;culture)
        : &lt;span style="color:blue;"&gt;this&lt;/span&gt;(culture, culture)
    {
    }

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;GlobalizationRouteHandler(&lt;span style="color:#2b91af;"&gt;CultureInfo &lt;/span&gt;culture, &lt;span style="color:#2b91af;"&gt;CultureInfo &lt;/span&gt;uiCulture)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(culture == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color:blue;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;cultureInfo&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;cultureInfo is null.&amp;quot;&lt;/span&gt;);
        }

        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(uiCulture == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color:blue;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;uiCulture&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;uiCulture is null.&amp;quot;&lt;/span&gt;);
        }

        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.culture = culture;
        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.uiCulture = uiCulture;
    }

    &lt;span style="color:blue;"&gt;private &lt;/span&gt;GlobalizationRouteHandler()
    {
    }

    &lt;span style="color:blue;"&gt;#region &lt;/span&gt;IRouteHandler Members

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IHttpHandler &lt;/span&gt;GetHttpHandler(&lt;span style="color:#2b91af;"&gt;RequestContext &lt;/span&gt;requestContext)
    {
        &lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.CurrentThread.CurrentCulture = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.culture;
        &lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.CurrentThread.CurrentUICulture = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.uiCulture;

        &lt;span style="color:blue;"&gt;string &lt;/span&gt;path = &lt;span style="color:#a31515;"&gt;&amp;quot;~/&amp;quot; &lt;/span&gt;+ (requestContext.RouteData.Values[&lt;span style="color:#a31515;"&gt;&amp;quot;path&amp;quot;&lt;/span&gt;] &lt;span style="color:blue;"&gt;as string&lt;/span&gt;);

        &lt;span style="color:blue;"&gt;var &lt;/span&gt;physicalPath = requestContext.HttpContext.Server.MapPath(path);
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(System.IO.&lt;span style="color:#2b91af;"&gt;Directory&lt;/span&gt;.Exists(physicalPath))
        {
            path = &lt;span style="color:#2b91af;"&gt;VirtualPathUtility&lt;/span&gt;.Combine(path, &lt;span style="color:#a31515;"&gt;&amp;quot;Default.aspx&amp;quot;&lt;/span&gt;);
        }

        &lt;span style="color:blue;"&gt;var &lt;/span&gt;httpHandler = &lt;span style="color:#2b91af;"&gt;BuildManager&lt;/span&gt;.CreateInstanceFromVirtualPath(path, &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IHttpHandler&lt;/span&gt;)) &lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IHttpHandler&lt;/span&gt;;

        &lt;span style="color:blue;"&gt;return &lt;/span&gt;httpHandler;
    }

    &lt;span style="color:blue;"&gt;#endregion
&lt;/span&gt;}&lt;/pre&gt;

&lt;p&gt;Depois é só registar as rotas para as culturas pretendidas:&lt;/p&gt;

&lt;pre class="code"&gt;routes.Add(&lt;span style="color:#a31515;"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Route&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;en/{*path}&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;GlobalizationRouteHandler&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;CultureInfo&lt;/span&gt;.GetCultureInfo(&lt;span style="color:#a31515;"&gt;&amp;quot;en-US&amp;quot;&lt;/span&gt;))));
routes.Add(&lt;span style="color:#a31515;"&gt;&amp;quot;pt&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Route&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;pt/{*path}&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;GlobalizationRouteHandler&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;CultureInfo&lt;/span&gt;.GetCultureInfo(&lt;span style="color:#a31515;"&gt;&amp;quot;pt-PT&amp;quot;&lt;/span&gt;))));&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38531" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38531" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38531" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=j9_foVe3xsw:8l4inmInZbQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=j9_foVe3xsw:8l4inmInZbQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=j9_foVe3xsw:8l4inmInZbQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=j9_foVe3xsw:8l4inmInZbQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=j9_foVe3xsw:8l4inmInZbQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=j9_foVe3xsw:8l4inmInZbQ:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=j9_foVe3xsw:8l4inmInZbQ:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/j9_foVe3xsw" height="1" width="1"/&gt;</description><pubDate>Sun, 31 Jan 2010 23:54:26 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38531</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38531</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/31/globaliza-231-227-o-de-s-237-tios-web-usando-o-roteamento-do-asp-net.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/31/globaliza-231-227-o-de-s-237-tios-web-usando-o-roteamento-do-asp-net.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38513</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/HsKBjJTU87A/emparelhando-o-estado-da-sess-227-o-asp-net-com-autentica-231-227-o-por-formul-225-rio.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET2.0/default.aspx">.NET2.0</category><title>Emparelhando O Estado Da Sessão ASP.NET Com Autenticação Por Formulário</title><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Hoje, estava a falar com o &lt;a title="João Cardoso" href="http://pontonetpt.com/blogs/joaocardoso" target="_blank"&gt;João&lt;/a&gt; acerca de um modo de emparelhar a duração da &lt;a title="ASP.NET Session State Overview" href="http://msdn.microsoft.com/library/ms178581.aspx" target="_blank"&gt;estado de sessão&lt;/a&gt; &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; com a duração do &lt;a title="Understanding the Forms Authentication Ticket and Cookie" href="http://support.microsoft.com/kb/910443" target="_blank"&gt;ticket&lt;/a&gt; de &lt;a title="Forms Authentication Provider" href="http://msdn.microsoft.com/library/9wff0kyh.aspx" target="_blank"&gt;autenticação por formulário&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;A minha ideia era guardar o identificador de sessão na propriedade &lt;a title="FormsAuthenticationTicket.UserData Property" href="http://msdn.microsoft.com/library/System.Web.Security.FormsAuthenticationTicket.UserData.aspx" target="_blank"&gt;UserData&lt;/a&gt;&amp;#160; &lt;a title="FormsAuthenticationTicket Class" href="http://msdn.microsoft.com/library/system.web.security.formsauthenticationticket.aspx" target="_blank"&gt;forms authentication ticket&lt;/a&gt; durante o &lt;em&gt;login&lt;/em&gt; e obtê-lo através de um &lt;a title="ISessionIDManager Interface" href="http://msdn.microsoft.com/library/system.web.sessionstate.isessionidmanager.aspx" target="_blank"&gt;session ID manager&lt;/a&gt; desenvolvido para o efeito.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;O código do &lt;em&gt;login&lt;/em&gt; seria algo assim:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;protected void &lt;/span&gt;Login1_Authenticate(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;AuthenticateEventArgs &lt;/span&gt;e)
{
    &lt;span style="color:blue;"&gt;bool &lt;/span&gt;isPersistent = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Login1.RememberMeSet;
    &lt;span style="color:blue;"&gt;string &lt;/span&gt;username = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Login1.UserName;
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;ticket = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FormsAuthenticationTicket&lt;/span&gt;(
        0,
        username,
        &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now,
        &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now.AddMinutes(2),
        isPersistent,
        &lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;.NewGuid().ToString(&lt;span style="color:#a31515;"&gt;&amp;quot;N&amp;quot;&lt;/span&gt;));

    &lt;span style="color:green;"&gt;// Encrypt the ticket.
    &lt;/span&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;encryptedTicket = &lt;span style="color:#2b91af;"&gt;FormsAuthentication&lt;/span&gt;.Encrypt(ticket);

    &lt;span style="color:green;"&gt;// Create the cookie.
    &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Response.Cookies.Add(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;HttpCookie&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;FormsAuthentication&lt;/span&gt;.FormsCookieName, encryptedTicket));

    &lt;span style="color:green;"&gt;// Redirect back to original URL.
    &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Response.Redirect(&lt;span style="color:#2b91af;"&gt;FormsAuthentication&lt;/span&gt;.GetRedirectUrl(username, isPersistent));
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Para efeitos de demonstração estou a usar um &lt;a title="Guid Structure" href="http://msdn.microsoft.com/library/system.guid.aspx" target="_blank"&gt;Guid&lt;/a&gt; como identificador de sessão.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;O &lt;em&gt;session ID manager&lt;/em&gt; vai retornar ao &lt;a title="SessionStateModule Class" href="http://msdn.microsoft.com/library/System.Web.SessionState.SessionStateModule.aspx" target="_blank"&gt;session state HTTP module&lt;/a&gt; o identificador de sessão uando este o pedir:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SessionIdManager &lt;/span&gt;: &lt;span style="color:blue;"&gt;global&lt;/span&gt;::System.Web.SessionState.&lt;span style="color:#2b91af;"&gt;ISessionIDManager
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;#region &lt;/span&gt;ISessionIDManager Members

    &lt;span style="color:blue;"&gt;public string &lt;/span&gt;CreateSessionID(&lt;span style="color:#2b91af;"&gt;HttpContext &lt;/span&gt;context)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;GetDummySessionIdOrRedirectToLoginPage(context);
    }

    &lt;span style="color:blue;"&gt;public string &lt;/span&gt;GetSessionID(&lt;span style="color:#2b91af;"&gt;HttpContext &lt;/span&gt;context)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;GetSessionIdFromFormsIdentity(context);
    }

    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;Initialize()
    {
    }

    &lt;span style="color:blue;"&gt;public bool &lt;/span&gt;InitializeRequest(&lt;span style="color:#2b91af;"&gt;HttpContext &lt;/span&gt;context, &lt;span style="color:blue;"&gt;bool &lt;/span&gt;suppressAutoDetectRedirect, &lt;span style="color:blue;"&gt;out bool &lt;/span&gt;supportSessionIDReissue)
    {
        supportSessionIDReissue = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;GetSessionIdFromFormsIdentity(context) == &lt;span style="color:blue;"&gt;null&lt;/span&gt;;
    }

    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;RemoveSessionID(&lt;span style="color:#2b91af;"&gt;HttpContext &lt;/span&gt;context)
    {
    }

    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;SaveSessionID(&lt;span style="color:#2b91af;"&gt;HttpContext &lt;/span&gt;context, &lt;span style="color:blue;"&gt;string &lt;/span&gt;id, &lt;span style="color:blue;"&gt;out bool &lt;/span&gt;redirected, &lt;span style="color:blue;"&gt;out bool &lt;/span&gt;cookieAdded)
    {
        redirected = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
        cookieAdded = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
    }

    &lt;span style="color:blue;"&gt;public bool &lt;/span&gt;Validate(&lt;span style="color:blue;"&gt;string &lt;/span&gt;id)
    {
        &lt;span style="color:blue;"&gt;return true&lt;/span&gt;;
    }

    &lt;span style="color:blue;"&gt;#endregion

    private static string &lt;/span&gt;GetSessionIdFromFormsIdentity(&lt;span style="color:#2b91af;"&gt;HttpContext &lt;/span&gt;context)
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;identity = context.User != &lt;span style="color:blue;"&gt;null &lt;/span&gt;? context.User.Identity &lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FormsIdentity &lt;/span&gt;: &lt;span style="color:blue;"&gt;null&lt;/span&gt;;

        &lt;span style="color:blue;"&gt;if &lt;/span&gt;((identity == &lt;span style="color:blue;"&gt;null&lt;/span&gt;) || (identity.Ticket == &lt;span style="color:blue;"&gt;null&lt;/span&gt;) || &lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(identity.Ticket.UserData))
        {
            &lt;span style="color:blue;"&gt;return &lt;/span&gt;GetDummySessionIdOrRedirectToLoginPage(context);
        }
        &lt;span style="color:blue;"&gt;else
        &lt;/span&gt;{
            &lt;span style="color:blue;"&gt;return &lt;/span&gt;identity.Ticket.UserData;
        }
    }

    &lt;span style="color:blue;"&gt;private static string &lt;/span&gt;GetDummySessionIdOrRedirectToLoginPage(&lt;span style="color:#2b91af;"&gt;HttpContext &lt;/span&gt;context)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(context.Request.CurrentExecutionFilePath.Equals(&lt;span style="color:#2b91af;"&gt;FormsAuthentication&lt;/span&gt;.DefaultUrl, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.OrdinalIgnoreCase)
                        || context.Request.CurrentExecutionFilePath.Equals(&lt;span style="color:#2b91af;"&gt;FormsAuthentication&lt;/span&gt;.LoginUrl, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.OrdinalIgnoreCase))
        {
            &lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;.NewGuid().ToString(&lt;span style="color:#a31515;"&gt;&amp;quot;N&amp;quot;&lt;/span&gt;);
        }
        &lt;span style="color:blue;"&gt;else
        &lt;/span&gt;{
            &lt;span style="color:#2b91af;"&gt;FormsAuthentication&lt;/span&gt;.RedirectToLoginPage();
            &lt;span style="color:blue;"&gt;return null&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;&lt;strong&gt;NOTA:&lt;/strong&gt; Embora este código deva funcionar, trata-se apenas de um exercício intelectual e não foi devidamente testado.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38513" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38513" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38513" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=HsKBjJTU87A:wiLBeyh8LhY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=HsKBjJTU87A:wiLBeyh8LhY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=HsKBjJTU87A:wiLBeyh8LhY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=HsKBjJTU87A:wiLBeyh8LhY:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=HsKBjJTU87A:wiLBeyh8LhY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=HsKBjJTU87A:wiLBeyh8LhY:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=HsKBjJTU87A:wiLBeyh8LhY:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/HsKBjJTU87A" height="1" width="1"/&gt;</description><pubDate>Thu, 28 Jan 2010 01:30:15 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38513</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38513</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/28/emparelhando-o-estado-da-sess-227-o-asp-net-com-autentica-231-227-o-por-formul-225-rio.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/28/emparelhando-o-estado-da-sess-227-o-asp-net-com-autentica-231-227-o-por-formul-225-rio.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38508</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/OrMMCM50_-8/brincando-com-linq-obtendo-as-implementa-231-245-es-de-propriedades-de-interfaces.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><title>Brincando Com LINQ: Obtendo As Implementações De Propriedades De Interfaces</title><description>&lt;p align="justify"&gt;Hoje, o meu amigo &lt;a title="Nuno Gomes" href="http://NunoGomes.NET/" target="_blank"&gt;Nuno&lt;/a&gt; estava a escrever algum código para obter as &lt;a title="PropertyInfo Class" href="http://msdn.microsoft.com/library/System.Reflection.PropertyInfo.aspx" target="_blank"&gt;PropertyInfo&lt;/a&gt;s da implementação de uma interface por parte de classe.&lt;/p&gt;  &lt;p align="justify"&gt;Dada este interface:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;p&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ISomeInterface
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;int &lt;/span&gt;IntProperty { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;string &lt;/span&gt;StringProperty { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;void &lt;/span&gt;Method();
}&lt;/p&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;e esta classe:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SomeClass &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;ISomeInterface
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;int &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ISomeInterface&lt;/span&gt;.IntProperty { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;public int &lt;/span&gt;IntProperty { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;private set&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;public string &lt;/span&gt;StringProperty { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;private set&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;Method() { }
}&lt;/pre&gt;

&lt;p&gt;o Nuno queria obter:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Int32 ISomeInterface.IntProperty &lt;/li&gt;

  &lt;li&gt;System.String StringProperty &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O código é relativamente simples. Primeiro é necessário obter os mapeamentos da interface:&lt;/p&gt;

&lt;p style="padding-left:1em;"&gt;&lt;code&gt;&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;SomeClass&lt;/span&gt;).GetInterfaceMap(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ISomeInterface&lt;/span&gt;)).TargetMethods&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e filtrar por &lt;strong&gt;PropertyInfo&lt;/strong&gt;s para as quais o &lt;a title="MethodInfo Class" href="http://msdn.microsoft.com/library/System.Reflection.MethodInfo.aspx" target="_blank"&gt;MethodInfo&lt;/a&gt; é parte da sua implementação (implementa o método &lt;strong&gt;get&lt;/strong&gt; ou o método &lt;strong&gt;set&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Algo como isto:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static bool &lt;/span&gt;Implements(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MethodInfo &lt;/span&gt;methodInfo, &lt;span style="color:#2b91af;"&gt;PropertyInfo &lt;/span&gt;propertyInfo)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;(propertyInfo.GetGetMethod(&lt;span style="color:blue;"&gt;true&lt;/span&gt;) == methodInfo) || (propertyInfo.GetSetMethod(&lt;span style="color:blue;"&gt;true&lt;/span&gt;) == methodInfo);
}&lt;/pre&gt;

&lt;p&gt;Mas o que me chamou a atenção foi que, com os&amp;#160; &lt;a title="Extension Methods (C# Programming Guide)" href="http://msdn.microsoft.com/library/bb383977.aspx" target="_blank"&gt;métodos de extensão&lt;/a&gt; acima, posso usar &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; para obter as desejadas &lt;strong&gt;PropertyInfo&lt;/strong&gt;s.&lt;/p&gt;

&lt;p&gt;Algo assim:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;PropertyInfo&lt;/span&gt;&amp;gt; GetInterfacePropertyImplementation(&lt;span style="color:#2b91af;"&gt;Type &lt;/span&gt;implementer, &lt;span style="color:#2b91af;"&gt;Type &lt;/span&gt;implemented)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;(&lt;span style="color:blue;"&gt;from &lt;/span&gt;propertyInfo &lt;span style="color:blue;"&gt;in &lt;/span&gt;implementer.GetProperties(&lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.Instance | &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.Public | &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.NonPublic).AsEnumerable()
            &lt;span style="color:blue;"&gt;from &lt;/span&gt;methodInfo &lt;span style="color:blue;"&gt;in &lt;/span&gt;implementer.GetInterfaceMap(implemented).TargetMethods.AsEnumerable()
            &lt;span style="color:blue;"&gt;where &lt;/span&gt;methodInfo.Implements(propertyInfo)
            &lt;span style="color:blue;"&gt;select &lt;/span&gt;propertyInfo).Distinct();
}&lt;/pre&gt;

&lt;p&gt;Para a classe e interface do exemplo, usar o método acimo seria algo como:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q = GetInterfacePropertyImplementation(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;SomeClass&lt;/span&gt;), &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ISomeInterface&lt;/span&gt;));

&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;p &lt;span style="color:blue;"&gt;in &lt;/span&gt;q)
{
    &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(p);
}&lt;/pre&gt;

&lt;p&gt;O que produzirá o seguinte resultado:&lt;/p&gt;

&lt;pre class="code"&gt;Int32 ISomeInterface.IntProperty
System.String StringProperty&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;ACTUALIZADO&lt;/strong&gt;: A implementação anterior era demasiado complexa e baseada em &lt;em&gt;string&lt;/em&gt;s. Obrigado, Nuno.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38508" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38508" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38508" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=OrMMCM50_-8:jnR5TMpGCYM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=OrMMCM50_-8:jnR5TMpGCYM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=OrMMCM50_-8:jnR5TMpGCYM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=OrMMCM50_-8:jnR5TMpGCYM:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=OrMMCM50_-8:jnR5TMpGCYM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=OrMMCM50_-8:jnR5TMpGCYM:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=OrMMCM50_-8:jnR5TMpGCYM:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/OrMMCM50_-8" height="1" width="1"/&gt;</description><pubDate>Wed, 27 Jan 2010 02:32:02 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38508</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38508</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/27/brincando-com-linq-obtendo-as-implementa-231-245-es-de-propriedades-de-interfaces.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/27/brincando-com-linq-obtendo-as-implementa-231-245-es-de-propriedades-de-interfaces.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38491</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/UU_lWIbLGyE/tracelistener-para-testes.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Testes/default.aspx">Testes</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/UnitTests/default.aspx">UnitTests</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio2008/default.aspx">VisualStudio2008</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio2005/default.aspx">VisualStudio2005</category><title>TraceListener Para Testes</title><description>&lt;p align="justify"&gt;No meu código faço uso extensivo de asserções de &lt;em&gt;debugi&lt;/em&gt; (see &lt;a title="Debug.Assert Method" href="http://msdn.microsoft.com/library/System.Diagnostics.Debug.Assert.aspx" target="_blank"&gt;System.Diagnostics.Debug.Assert&lt;/a&gt;). Estas asserções são muito uteis quando em &lt;em&gt;debug&lt;/em&gt; porque deixa de ser necessário, uma a uma, percorrer todas as linhas de código para verificar que todas as pré-condições são satisfeitas. Assim que uma pré-condição falhar, é lançada uma janela com a informação da asserção e que nos permite abortar a execução (&lt;em&gt;abort&lt;/em&gt;), ignorar e continuar (&lt;em&gt;ignore&lt;/em&gt;) ou ir para a instrucção de asserção (&lt;em&gt;retry&lt;/em&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;Imaginem este código:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private void &lt;/span&gt;IKnowForSureThatANullStringWillNeverBePassed(&lt;span style="color:blue;"&gt;string &lt;/span&gt;text)
{
    System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;.Assert(&lt;span style="color:blue;"&gt;string &lt;/span&gt;!= &lt;span style="color:blue;"&gt;null&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;text is null.&amp;quot;&lt;/span&gt;);

    &lt;span style="color:green;"&gt;// ...
&lt;/span&gt;}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Porque o método é privado, tenho todo o controlo dos valores que são passados no parâmetro &lt;strong&gt;text&lt;/strong&gt;, estou a afirmar que nunca terá o valor &lt;strong&gt;null&lt;/strong&gt;. Porque pode não ser óbvio que o valor de &lt;strong&gt;text&lt;/strong&gt; nunca será &lt;strong&gt;null&lt;/strong&gt;, a asserção funciona também como documentação.&lt;/p&gt;

&lt;p align="justify"&gt;Costumo correr os meus testes unitários e de integração em compilações de &lt;em&gt;debug&lt;/em&gt; e estas asserções seriam muito úteis fazendo os testes falharem quando corro os meus testes unitários e de integração quando uma asserção falha em vez de continuar com a execução do método e falhar numa &lt;a title="NullReferenceException Class" href="http://msdn.microsoft.com/library/System.NullReferenceException.aspx" target="_blank"&gt;NullReferenceException&lt;/a&gt;. Foi por isso que eu (e mais pessoas) escrevi este simples &lt;a title="TraceListener Class" href="http://msdn.microsoft.com/library/System.Diagnostics.TraceListener.aspx" target="_blank"&gt;TraceListener&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TraceListener &lt;/span&gt;: &lt;span style="color:blue;"&gt;global&lt;/span&gt;::System.Diagnostics.&lt;span style="color:#2b91af;"&gt;TraceListener
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public static readonly &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TraceListener &lt;/span&gt;Default = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TraceListener&lt;/span&gt;();

    &lt;span style="color:blue;"&gt;protected &lt;/span&gt;TraceListener()
    {
        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Testing Trace Listener&amp;quot;&lt;/span&gt;;    
    }

    &lt;span style="color:blue;"&gt;protected &lt;/span&gt;TraceListener(&lt;span style="color:blue;"&gt;string &lt;/span&gt;name)
        : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(name)
    {
    }

    &lt;span style="color:blue;"&gt;public override void &lt;/span&gt;Write(&lt;span style="color:blue;"&gt;string &lt;/span&gt;message)
    {
    }

    &lt;span style="color:blue;"&gt;public override void &lt;/span&gt;WriteLine(&lt;span style="color:blue;"&gt;string &lt;/span&gt;message)
    {
    }

    &lt;span style="color:blue;"&gt;public override void &lt;/span&gt;Fail(&lt;span style="color:blue;"&gt;string &lt;/span&gt;message, &lt;span style="color:blue;"&gt;string &lt;/span&gt;detailMessage)
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;builder = &lt;span style="color:blue;"&gt;new global&lt;/span&gt;::System.Text.&lt;span style="color:#2b91af;"&gt;StringBuilder&lt;/span&gt;();

        builder.Append(message);

        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(detailMessage != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
        {
            builder.Append(&lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;);
            builder.Append(detailMessage);
        }

        &lt;span style="color:blue;"&gt;throw new global&lt;/span&gt;::Microsoft.VisualStudio.TestTools.UnitTesting.&lt;span style="color:#2b91af;"&gt;AssertFailedException&lt;/span&gt;(builder.ToString());

    }
}&lt;/pre&gt;

&lt;p align="justify"&gt;Este &lt;em&gt;trace listener&lt;/em&gt; não escreve nada. Limita-se a disparar uma &lt;a title="AssertFailedException Class" href="http://msdn.microsoft.com/library/Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException.aspx" target="_blank"&gt;AssertFailedException&lt;/a&gt; quando é chamado o método &lt;a title="TraceListener.Fail Method" href="http://msdn.microsoft.com/library/t9h55cex.aspx" target="_blank"&gt;Fail&lt;/a&gt;, que é o que acontece quando uma asserção falha.&lt;/p&gt;

&lt;p align="justify"&gt;Porque uma janela de falha de asserção não é desejável quando se estão a correr testes (especialmente se forem corridos de forma automática com parte de um processo de &lt;em&gt;buil&lt;/em&gt;), o melhor é desabilitar a interface visual das asserções no ficheiro de configuração do projecto de testes.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.diagnostics&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assert &lt;/span&gt;&lt;span style="color:red;"&gt;assertuienabled&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;trace&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;listeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;TestTraceListener&lt;/span&gt;&amp;quot;
                     &lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;PauloMorgado.TestTools.VisualStudio.UnitTesting.Diagnostics.TraceListener, PauloMorgado.TestTools.VisualStudio&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;listeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;trace&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.diagnostics&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
Podem encontrar isto (e mais) em &lt;a title="PauloMorgado.TestTools" href="http://pmtesttools.codeplex.com/" target="_blank"&gt;PauloMorgado.TestTools&lt;/a&gt; no &lt;a title="CodePlex - Open Source Community" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt;. 

&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38491" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38491" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38491" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=UU_lWIbLGyE:Yd14_o4G9pM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=UU_lWIbLGyE:Yd14_o4G9pM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=UU_lWIbLGyE:Yd14_o4G9pM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=UU_lWIbLGyE:Yd14_o4G9pM:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=UU_lWIbLGyE:Yd14_o4G9pM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=UU_lWIbLGyE:Yd14_o4G9pM:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=UU_lWIbLGyE:Yd14_o4G9pM:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/UU_lWIbLGyE" height="1" width="1"/&gt;</description><pubDate>Mon, 25 Jan 2010 00:50:12 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38491</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38491</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/25/tracelistener-para-testes.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/25/tracelistener-para-testes.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38472</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/sm8Jwy2dWYE/como-atribu-237-r-valores-a-elementos-de-um-array-de-um-tipo-privado-usando-os-acessores-do-visual-studio.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Testes/default.aspx">Testes</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio2008/default.aspx">VisualStudio2008</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio2010/default.aspx">VisualStudio2010</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET2.0/default.aspx">.NET2.0</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><title>Como Atribuír Valores A Elementos De Um Array De Um Tipo Privado Usando Os Acessores Do Visual Studio</title><description>&lt;p align="justify"&gt;O &lt;a target="_blank" href="http://cli.gs/vstudio" title="Microsoft Visual Studio"&gt;Visual Studio&lt;/a&gt; usa a ferramenta &lt;a target="_blank" href="http://msdn.microsoft.com/library/bb514191.aspx" title="Using Publicize to Create Private Accessors"&gt;Publicize&lt;/a&gt; para criar acessores p&amp;uacute;blicos para membros e tipos privados de um determinado tipo.&lt;/p&gt;
&lt;p align="justify"&gt;Mas quando se tenta definir o valor de um elemento de um &lt;em&gt;array&lt;/em&gt; privado de elementos de um tipo privado, a situa&amp;ccedil;&amp;atilde;o complica-se.&lt;/p&gt;
&lt;p align="justify"&gt;Imagine-se este hipot&amp;eacute;tica classe a testar:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;private static readonly &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyInnerClass&lt;/span&gt;[] myArray = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyInnerClass&lt;/span&gt;[10];

    &lt;span style="color:blue;"&gt;public static bool &lt;/span&gt;IsEmpty()
    {
        &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;myArray)
        {
            &lt;span style="color:blue;"&gt;if &lt;/span&gt;((item != &lt;span style="color:blue;"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; (!&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(item.Field)))
            {
                &lt;span style="color:blue;"&gt;return false&lt;/span&gt;;
            }
        }

        &lt;span style="color:blue;"&gt;return true&lt;/span&gt;;
    }

    &lt;span style="color:blue;"&gt;private class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyInnerClass
    &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;public string &lt;/span&gt;Field;
    }
}&lt;/pre&gt;
&lt;p align="justify"&gt;Se se quiser escrever um teste para o caso em que o &lt;em&gt;array&lt;/em&gt; tem entradas &amp;ldquo;n&amp;atilde;o vazias&amp;rdquo;, vai ser necess&amp;aacute;rio primeiro inicializar o &lt;em&gt;array&lt;/em&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Usando os acessores gerados pelo Visual Studio, o teste pode ser escrito desta froma:&lt;/p&gt;
&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestClass&lt;/span&gt;()]
&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClassTest
&lt;/span&gt;{
    [&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;()]
    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;IsEmpty_NotEmpty_ReturnsFalse()
    {
        &lt;span style="color:blue;"&gt;for &lt;/span&gt;(&lt;span style="color:blue;"&gt;int &lt;/span&gt;i = 0; i &amp;lt; 10; i++)
        {
            &lt;span style="color:#2b91af;"&gt;MyClass_Accessor&lt;/span&gt;.myArray[i] = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass_Accessor&lt;/span&gt;.&lt;span style="color:#2b91af;"&gt;MyInnerClass &lt;/span&gt;{ Field = i.ToString() };
        }

        &lt;span style="color:blue;"&gt;bool &lt;/span&gt;expected = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
        &lt;span style="color:blue;"&gt;bool &lt;/span&gt;actual;

        actual = &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;.IsEmpty();

        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(expected, actual);
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Mas o teste vai falhar porque, apesar dos elementos do &lt;em&gt;array&lt;/em&gt; privado &lt;strong&gt;myArray&lt;/strong&gt; poderem ser lidos como inst&amp;acirc;ncias de &lt;strong&gt;MyClass_Accessor.MyInnerClass&lt;/strong&gt;, n&amp;atilde;o podem ser escritos como tal.&lt;/p&gt;
&lt;p align="justify"&gt;Para o fazer, o teste tem de ser escrito da seguinte forma:&lt;/p&gt;
&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestClass&lt;/span&gt;()]
&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClassTest
&lt;/span&gt;{
    [&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;()]
    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;IsEmpty_NotEmpty_ReturnsFalse()
    {
        &lt;span style="color:blue;"&gt;for &lt;/span&gt;(&lt;span style="color:blue;"&gt;int &lt;/span&gt;i = 0; i &amp;lt; 10; i++)
        {
            &lt;span style="color:#2b91af;"&gt;MyClass_Accessor&lt;/span&gt;.ShadowedType.SetStaticArrayElement(&lt;span style="color:#a31515;"&gt;&amp;quot;myArray&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass_Accessor&lt;/span&gt;.&lt;span style="color:#2b91af;"&gt;MyInnerClass &lt;/span&gt;{ Field = i.ToString() }.Target, i);
        }

        &lt;span style="color:blue;"&gt;bool &lt;/span&gt;expected = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
        &lt;span style="color:blue;"&gt;bool &lt;/span&gt;actual;

        actual = &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;.IsEmpty();

        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(expected, actual);
    }
}&lt;/pre&gt;
&lt;p align="justify"&gt;Mas, deste modo, perdemos a caracter&amp;iacute;stica fortemente tipada que nos d&amp;atilde;o os acessores gerados pelo Visual Studio porque &amp;eacute; necess&amp;aacute;rio escrever o nome do campo &lt;strong&gt;myArray&lt;/strong&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Porque o acessor para o campo &amp;eacute; uma propriedade, podem-se escrever alguns &lt;a target="_blank" href="http://msdn.microsoft.com/library/bb383977.aspx" title="Extension Methods (C# Programming Guide)"&gt;m&amp;eacute;todos de extens&amp;atilde;o&lt;/a&gt; para obter o nome do campo sem que seja necess&amp;aacute;rio escrev&amp;ecirc;-lo como uma &lt;em&gt;string&lt;/em&gt;. Algo assim:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;PrivateypeExtensions
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public static void &lt;/span&gt;SetStaticArrayElement&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;PrivateType &lt;/span&gt;self, &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T[]&amp;gt;&amp;gt; expression, T value, &lt;span style="color:blue;"&gt;params int&lt;/span&gt;[] indices)
    {
        &lt;span style="color:blue;"&gt;object &lt;/span&gt;elementValue = (value &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;BaseShadow&lt;/span&gt;) ? (value &lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;BaseShadow&lt;/span&gt;).Target : value;

        self.SetStaticArrayElement(
            ((&lt;span style="color:#2b91af;"&gt;PropertyInfo&lt;/span&gt;)((&lt;span style="color:#2b91af;"&gt;MemberExpression&lt;/span&gt;)(expression.Body)).Member).Name,
            elementValue,
            indices);
    }

    &lt;span style="color:blue;"&gt;public static void &lt;/span&gt;SetStaticArrayElement&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;PrivateType &lt;/span&gt;self, &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T[]&amp;gt;&amp;gt; expression, &lt;span style="color:#2b91af;"&gt;BindingFlags &lt;/span&gt;invokeAttr, T value, &lt;span style="color:blue;"&gt;params int&lt;/span&gt;[] indices)
    {
        &lt;span style="color:blue;"&gt;object &lt;/span&gt;elementValue = (value &lt;span style="color:blue;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;BaseShadow&lt;/span&gt;) ? (value &lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;BaseShadow&lt;/span&gt;).Target : value;

        self.SetStaticArrayElement(
            ((&lt;span style="color:#2b91af;"&gt;PropertyInfo&lt;/span&gt;)((&lt;span style="color:#2b91af;"&gt;MemberExpression&lt;/span&gt;)(expression.Body)).Member).Name,
            invokeAttr,
            elementValue,
            indices);
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Sendo assim, o teste tomaria esta forma:&lt;/p&gt;
&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestClass&lt;/span&gt;()]
&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClassTest
&lt;/span&gt;{
    [&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;()]
    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;IsEmpty_NotEmpty_ReturnsFalse()
    {
        &lt;span style="color:blue;"&gt;for &lt;/span&gt;(&lt;span style="color:blue;"&gt;int &lt;/span&gt;i = 0; i &amp;lt; 10; i++)
        {
            &lt;span style="color:#2b91af;"&gt;MyClass_Accessor&lt;/span&gt;.ShadowedType.SetStaticArrayElement(() =&amp;gt; &lt;span style="color:#2b91af;"&gt;MyClass_Accessor&lt;/span&gt;.myArray, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass_Accessor&lt;/span&gt;.&lt;span style="color:#2b91af;"&gt;MyInnerClass &lt;/span&gt;{ Field = i.ToString() }, i);
        }

        &lt;span style="color:blue;"&gt;bool &lt;/span&gt;expected = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
        &lt;span style="color:blue;"&gt;bool &lt;/span&gt;actual;

        actual = &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;.IsEmpty();

        &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(expected, actual);
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;N&amp;atilde;o &amp;eacute; o mesmo que a primeria forma, mas &amp;eacute; fortemente tipado e, se se mudar o nome ou o tipo do campo &lt;strong&gt;myArray&lt;/strong&gt;, obterem-se um erro de compila&amp;ccedil;&amp;atilde;o e n&amp;atilde;o um erro de execu&amp;ccedil;&amp;atilde;o do teste.&lt;/p&gt;
&lt;p align="justify"&gt;Podem encontrar isto (e mais) em &lt;a target="_blank" href="http://pmtesttools.codeplex.com/" title="PauloMorgado.TestTools"&gt;&lt;span style="color:#0000ff;"&gt;PauloMorgado.TestTools&lt;/span&gt;&lt;/a&gt; no &lt;a target="_blank" href="http://www.codeplex.com/" title="CodePlex - Open Source Community"&gt;&lt;span style="color:#0000ff;"&gt;CodePlex&lt;/span&gt;&lt;/a&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38472" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38472" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38472" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=sm8Jwy2dWYE:KQBAIpWhrtw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=sm8Jwy2dWYE:KQBAIpWhrtw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=sm8Jwy2dWYE:KQBAIpWhrtw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=sm8Jwy2dWYE:KQBAIpWhrtw:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=sm8Jwy2dWYE:KQBAIpWhrtw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=sm8Jwy2dWYE:KQBAIpWhrtw:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=sm8Jwy2dWYE:KQBAIpWhrtw:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/sm8Jwy2dWYE" height="1" width="1"/&gt;</description><pubDate>Tue, 19 Jan 2010 00:56:00 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38472</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38472</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/19/como-atribu-237-r-valores-a-elementos-de-um-array-de-um-tipo-privado-usando-os-acessores-do-visual-studio.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2010/01/19/como-atribu-237-r-valores-a-elementos-de-um-array-de-um-tipo-privado-usando-os-acessores-do-visual-studio.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38326</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/-SwPgzL7KmA/extended-webbrowser-control-vers-227-o-0-0-0-0.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/CodePlex/default.aspx">CodePlex</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/InternetExplorer/default.aspx">InternetExplorer</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/WindowsClient/default.aspx">WindowsClient</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/WindowsForms/default.aspx">WindowsForms</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET2.0/default.aspx">.NET2.0</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/WebBrowserEx/default.aspx">WebBrowserEx</category><title>Extended WebBrowser Control - Versão 0.0.0.0</title><description>&lt;p align="justify"&gt;Finalmente consegui ter uma versão do &lt;a title="Extended WebBrowser Control" href="http://webbrowserex.codeplex.com/" target="_blank"&gt;Extended WebBrowser Control&lt;/a&gt; para colocar no &lt;a title="Open Source Project Hosting" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Ainda é um trabalho em curso, mas está usável (isto é uma palavra?). Estejam à vontade para &lt;a title="Downloads for WebBrowserEx - Extended WebBrowser Control" href="http://webbrowserex.codeplex.com/Release/ProjectReleases.aspx" target="_blank"&gt;descarregar&lt;/a&gt;, &lt;a title="Discussions for WebBrowserEx - Extended WebBrowser Control" href="http://webbrowserex.codeplex.com/Thread/List.aspx" target="_blank"&gt;comentar&lt;/a&gt; e &lt;a title="Issue Tracker for WebBrowserEx - Extended WebBrowser Control" href="http://webbrowserex.codeplex.com/WorkItem/List.aspx" target="_blank"&gt;registra incidentes&lt;/a&gt;. Um &lt;em&gt;tabbed web browser&lt;/em&gt;está incluído como demonstração.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38326" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38326" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38326" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=-SwPgzL7KmA:21dozx278bE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=-SwPgzL7KmA:21dozx278bE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=-SwPgzL7KmA:21dozx278bE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=-SwPgzL7KmA:21dozx278bE:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=-SwPgzL7KmA:21dozx278bE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=-SwPgzL7KmA:21dozx278bE:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=-SwPgzL7KmA:21dozx278bE:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/-SwPgzL7KmA" height="1" width="1"/&gt;</description><pubDate>Wed, 02 Dec 2009 02:12:39 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38326</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38326</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2009/12/02/extended-webbrowser-control-vers-227-o-0-0-0-0.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2009/12/02/extended-webbrowser-control-vers-227-o-0-0-0-0.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38188</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/i6RMVnsyzNs/compilando-aplica-231-245-es-net-1-1-no-visual-studio-2008.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio2008/default.aspx">VisualStudio2008</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET2.0/default.aspx">.NET2.0</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET1.1/default.aspx">.NET1.1</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio2003/default.aspx">VisualStudio2003</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/MSBee/default.aspx">MSBee</category><title>Compilando Aplicações .NET 1.1 No Visual Studio 2008</title><description>&lt;p align="justify"&gt;Depois de ter a minha aplicação &lt;strong&gt;&lt;a title="Microsoft .NET Framework" href="https://www.microsoft.com/net/" target="_blank"&gt;.NET&lt;/a&gt; 1.1&lt;/strong&gt; a correr no ambiente de execução &lt;strong&gt;.NET 2.0&lt;/strong&gt; (&lt;a title="Correndo Aplicações .NET 1.1 Em .NET 2.0" href="http://pontonetpt.com/blogs/paulomorgado/archive/2009/10/21/correndo-aplica-231-245-es-net-1-1-em-net-2-0.aspx" target="_blank"&gt;^&lt;/a&gt;), comecei a planear migrá-la para &lt;strong&gt;.NET 2.0&lt;/strong&gt;, mas faseadamente.&lt;/p&gt;  &lt;p align="justify"&gt;Porque não quero ter de manter 2 soluções (uma em &lt;strong&gt;Visual Studio 2003&lt;/strong&gt; para as &lt;em&gt;assemblies&lt;/em&gt;&amp;#160;&lt;strong&gt;.NET 1.1&lt;/strong&gt; e outra em &lt;strong&gt;Visual Studio 2008&lt;/strong&gt; para as &lt;em&gt;assemblies&lt;/em&gt;&amp;#160;&lt;strong&gt;.NET 2.0&lt;/strong&gt;) decidi experimentar o &lt;a title="MSBuild Extras - Toolkit for .NET 1.1" href="http://www.codeplex.com/MSBee" target="_blank"&gt;MSBee&lt;/a&gt; e ter apenas uma solução &lt;a title="Microsoft Visual Studio" href="http://www.microsoft.com/visualstudio/default.mspx" target="_blank"&gt;&lt;strong&gt;Visual Studio&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 2008&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;O &lt;strong&gt;MSBee&lt;/strong&gt; é um projecto que esiste no &lt;a title="Project Hosting for Open Source Software" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt;. Pode ser descarregado daí ou dos &lt;a title="MSBuild Extras - Toolkit for .NET 1.1" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=E0D0776F-25C4-444A-A6B9-71D06826F5B4"&gt;Microsoft Downloads&lt;/a&gt;. Porque a versão existente no &lt;strong&gt;Microsoft Downloads&lt;/strong&gt; me pareceu ser a mais estável, foi a que descarreguei e instalei. O pacote contem um documento &lt;a title="Microsoft Office Word" href="http://office.microsoft.com/word/default.aspx" target="_blank"&gt;Word&lt;/a&gt; com as instruções de utilização.&lt;/p&gt;  &lt;p align="justify"&gt;Antes de se instalar o &lt;strong&gt;MSBee&lt;/strong&gt; é necessário instalar o &lt;a title=".NET Framework SDK Version 1.1" href="http://www.microsoft.com/downloads/details.aspx?familyid=9B3A2CA6-3647-4070-9F41-A333C6B9181D" target="_blank"&gt;.NET 1.1 SDK&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Depois de tudo instalado, bastou abrir a solução &lt;strong&gt;Visual Studio 2003&lt;/strong&gt; no &lt;strong&gt;Visual Studio 2008&lt;/strong&gt; e deixá-lo convertê-la e aos projectos (quase 30).&lt;/p&gt;  &lt;p align="justify"&gt;Após a conversão, para compilar os projectos usando o compilador &lt;a title="Visual C# Developer Center" href="http://msdn.microsoft.com/vcsharp/default.aspx" target="_blank"&gt;C#&lt;/a&gt; da plataforma &lt;strong&gt;.NET 1.1&lt;/strong&gt; &lt;a title="Visual C# Developer Center" href="http://msdn.microsoft.com/vcsharp/default.aspx" target="_blank"&gt;C#&lt;/a&gt;, é necessário editar os ficheiros de de prjecto (&lt;strong&gt;.csproj&lt;/strong&gt;) para sobrepor os &lt;em&gt;targets&lt;/em&gt; po omissão peloas do &lt;strong&gt;MSBee&lt;/strong&gt; adicionando o &lt;em&gt;imports&lt;/em&gt; do &lt;strong&gt;MSBee&lt;/strong&gt; a seguir aos da linguagem do projecto: &lt;/p&gt;  &lt;pre style="font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;overflow:auto;" class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Import &lt;/span&gt;&lt;span style="color:red;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;$(MSBuildBinPath)\Microsoft.CSharp.targets&lt;/span&gt;&amp;quot; &lt;span style="color:blue;font-size:larger;font-weight:bold;"&gt;/&amp;gt;
&lt;span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Import &lt;/span&gt;&lt;span style="color:red;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;$(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX1_1.CSharp.targets&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Outra alteração necessária (para &lt;strong&gt;Visual Studio 2008&lt;/strong&gt; - não sei se era necessária para &lt;strong&gt;Visual Studio 2005&lt;/strong&gt;) é a versão das ferramentas. O &lt;strong&gt;MSBee&lt;/strong&gt; necessita da versão 2.0. Para fazer esta alteração é ncessário alterar o atributo &lt;strong&gt;ToolsVersion&lt;/strong&gt; no elemento raíz o ficheiro de projecto:&lt;/p&gt;

&lt;pre style="font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;overflow:auto;" class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project &lt;/span&gt;&lt;span style="color:red;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Build&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;font-size:larger;font-weight:bold;text-decoration:underline;"&gt;2.0&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;O &lt;strong&gt;MSBee&lt;/strong&gt; tem a sua própria ideia acerca de onde coloca o resultado da compilação que não é a que eu tinha definido para os meus projectos. Há alguma informação acreca disto na documentação, mas decidi simplesmente comentar esta parte no ficheiro &lt;span style="font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;"&gt;$(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX1_1.Common.targets&lt;/span&gt;:&lt;/p&gt;

&lt;pre style="font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;overflow:auto;" class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;span style="color:green;"&gt;Paulo
&amp;lt;Choose&amp;gt;
  &amp;lt;When Condition=&amp;quot; &amp;#39;$(BaseFX1_1OutputPath)&amp;#39; == &amp;#39;&amp;#39; &amp;quot;&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;OutputPath&amp;gt;bin\FX1_1\&amp;lt;/OutputPath&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;/When&amp;gt;
  &amp;lt;Otherwise&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;OutputPath&amp;gt;$(BaseFX1_1OutputPath)&amp;lt;/OutputPath&amp;gt;
      &amp;lt;OutputPath Condition=&amp;quot; !HasTrailingSlash(&amp;#39;$(OutputPath)&amp;#39;) &amp;quot;&amp;gt;$(OutputPath)\&amp;lt;/OutputPath&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;/Otherwise&amp;gt;
&amp;lt;/Choose&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;

&amp;lt;!-- &lt;/span&gt;&lt;span style="color:green;"&gt;Paulo
&amp;lt;PropertyGroup&amp;gt;
  &amp;lt;BaseIntermediateOutputPath&amp;gt;obj\FX1_1\&amp;lt;/BaseIntermediateOutputPath&amp;gt;
  &amp;lt;IntermediateOutputPath Condition=&amp;quot; &amp;#39;$(PlatformName)&amp;#39; == &amp;#39;AnyCPU&amp;#39; &amp;quot;&amp;gt;$(BaseIntermediateOutputPath)$(Configuration)\&amp;lt;/IntermediateOutputPath&amp;gt;
  &amp;lt;IntermediateOutputPath Condition=&amp;quot; &amp;#39;$(PlatformName)&amp;#39; != &amp;#39;AnyCPU&amp;#39; &amp;quot;&amp;gt;$(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\&amp;lt;/IntermediateOutputPath&amp;gt;

  &amp;lt;OutputPath Condition=&amp;quot; &amp;#39;$(PlatformName)&amp;#39; == &amp;#39;AnyCPU&amp;#39; &amp;quot;&amp;gt;$(OutputPath)$(Configuration)\&amp;lt;/OutputPath&amp;gt;
  &amp;lt;OutputPath Condition=&amp;quot; &amp;#39;$(PlatformName)&amp;#39; != &amp;#39;AnyCPU&amp;#39; &amp;quot;&amp;gt;$(OutputPath)$(PlatformName)\$(Configuration)\&amp;lt;/OutputPath&amp;gt;
  
  &amp;lt;- Once OutputPath is determined, set OutDir to its value. -&amp;gt;
  &amp;lt;OutDir&amp;gt;$(OutputPath)&amp;lt;/OutDir&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Tudo parecia funcionar na minha elha máquina &lt;strong&gt;Windows XP&lt;/strong&gt; sem qualquer &lt;em&gt;plug-ins&lt;/em&gt; de terceiras partes para o &lt;strong&gt;Visual Studio&lt;/strong&gt;, mas quando tentei na minha máquina &lt;strong&gt;Windows Vista X64&lt;/strong&gt;, encontrei os seguintes problemas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="left"&gt;&lt;strong&gt;&lt;u&gt;License Compiler&lt;/u&gt;&lt;/strong&gt;&lt;/div&gt;

    &lt;p align="justify"&gt;Porque estou a ausar controlso da &lt;a title="Infragistics - User Interface Components" href="http://www.infragistics.com/" target="_blank"&gt;Infragistics&lt;/a&gt; existe um ficheiro licences.licx que vai ser compilado. E isto costituiu um porblema.&lt;/p&gt;

    &lt;p align="justify"&gt;O &lt;strong&gt;MSBee&lt;/strong&gt; copia todos os ficheiros que necessita para o processo de compilação para uma pasta temporária, compila e depois copia o resultado para a localização configurada (&lt;em&gt;output path&lt;/em&gt;).&lt;/p&gt;

    &lt;p align="justify"&gt;O LC.exe parecia nunca ser capaz de encontrar as &lt;em&gt;assemblies&lt;/em&gt; de que necessitava. Pesquisando, pareceu-me que era um problema antigo (desde os tempos da &lt;strong&gt;.NET 1.1&lt;/strong&gt;) e a solução apontava para não compilar os ficheiros de licença. Por isso, comentei essa parte do ficheiro &lt;span style="font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;"&gt;$(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX1_1.Common.targets&lt;/span&gt;:&lt;/p&gt;

    &lt;pre style="font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;overflow:auto;" class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target
    &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;CompileLicxFiles&lt;/span&gt;&amp;quot;&amp;#160; &lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;#39;@(_LicxFile)&amp;#39;!=&amp;#39;&amp;#39;&lt;/span&gt;&amp;quot;
    &lt;span style="color:red;"&gt;DependsOnTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;$(CompileLicxFilesDependsOn)&lt;/span&gt;&amp;quot;
    &lt;span style="color:red;"&gt;Inputs&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;$(MSBuildAllProjects);@(_LicxFile);@(ReferencePath);@(ReferenceDependencyPaths)&lt;/span&gt;&amp;quot;
    &lt;span style="color:red;"&gt;Outputs&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;$(IntermediateOutputPath)$(TargetFileName).licenses&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;

  &amp;lt;!--
  &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;lt;LC
      Sources=&amp;quot;@(_LicxFile)&amp;quot;
      LicenseTarget=&amp;quot;$(TargetFileName)&amp;quot;
      OutputDirectory=&amp;quot;$(IntermediateOutputPath)&amp;quot;
      OutputLicense=&amp;quot;$(IntermediateOutputPath)$(TargetFileName).licenses&amp;quot;
      ReferencedAssemblies=&amp;quot;@(ReferencePath);@(ReferenceDependencyPaths)&amp;quot;
      ToolPath=&amp;quot;$(TargetFrameworkSDKDirectory)bin\&amp;quot;&amp;gt;

    &amp;lt;Output TaskParameter=&amp;quot;OutputLicense&amp;quot; ItemName=&amp;quot;CompiledLicenseFile&amp;quot;/&amp;gt;
    &amp;lt;Output TaskParameter=&amp;quot;OutputLicense&amp;quot; ItemName=&amp;quot;FileWrites&amp;quot;/&amp;gt;

  &amp;lt;/LC&amp;gt;
  &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;div align="left"&gt;&lt;strong&gt;&lt;u&gt;Resource Generator&lt;/u&gt;&lt;/strong&gt;&lt;/div&gt;

    &lt;p align="justify"&gt;Apesar de tudo fucionar bem em linha de comando, dentro do &lt;strong&gt;Visual Studio&lt;/strong&gt; ocorria um erro na execução do &lt;span style="font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;"&gt;ResGen.exe&lt;/span&gt;.&lt;/p&gt;

    &lt;p align="justify"&gt;Consulanado o &lt;a title="Windows Application Log" href="http://technet.microsoft.com/library/ms157312.aspx" target="_blank"&gt;Windows Application Log&lt;/a&gt; descobri isto:&lt;/p&gt;

    &lt;div align="justify"&gt;
      &lt;p style="font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;overflow:auto;" class="code"&gt;Faulting application Resgen.exe, version 1.1.4322.573, time stamp 0x3e559b5f, faulting module MockWeaver.dll, version 0.0.0.0, time stamp 0x4adb072e, exception code 0xc0000005, fault offset 0x00018fac, process id 0x4a50, application start time 0x01ca53c14488a2fb. &lt;/p&gt;
    &lt;/div&gt;

    &lt;p align="justify"&gt;&lt;strong&gt;MockWeaver.dll&lt;/strong&gt; pertence ao &lt;a title="Typemock Isolator - Isolate any .NET dependencies to make unit testing easy" href="http://www.typemock.com/" target="_blank"&gt;Isolator&lt;/a&gt; e basta-me inibi-lo quando compilo dentro do &lt;strong&gt;Visual Studio&lt;/strong&gt;. Esperava começar a usar o &lt;strong&gt;Isolator&lt;/strong&gt; neste projecto, mas, por enquanto, não vai ser possível.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Espero que isto possa ajudar alguém. Se precisarem de mais ajuda, provavelmente encontrá-la-ão nos foruns do &lt;strong&gt;MSBee&lt;/strong&gt; no &lt;strong&gt;CodePlex&lt;/strong&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;O que interessa é: &lt;strong&gt;Não precisam do Visual Studio 2003!&lt;/strong&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38188" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38188" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38188" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=i6RMVnsyzNs:UZiKvL8BFRo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=i6RMVnsyzNs:UZiKvL8BFRo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=i6RMVnsyzNs:UZiKvL8BFRo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=i6RMVnsyzNs:UZiKvL8BFRo:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=i6RMVnsyzNs:UZiKvL8BFRo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=i6RMVnsyzNs:UZiKvL8BFRo:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=i6RMVnsyzNs:UZiKvL8BFRo:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/i6RMVnsyzNs" height="1" width="1"/&gt;</description><pubDate>Mon, 26 Oct 2009 00:37:02 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38188</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38188</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2009/10/26/compilando-aplica-231-245-es-net-1-1-no-visual-studio-2008.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2009/10/26/compilando-aplica-231-245-es-net-1-1-no-visual-studio-2008.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38158</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/VFu69CPwaew/correndo-aplica-231-245-es-net-1-1-em-net-2-0.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET2.0/default.aspx">.NET2.0</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET1.1/default.aspx">.NET1.1</category><title>Correndo Aplicações .NET 1.1 Em .NET 2.0</title><description>&lt;p align="justify"&gt;Uma das aplicações que desenvolvo é uma aplicação &lt;a title="The Official Microsoft WPF and Windows Forms Site" href="http://windowsclient.net/" target="_blank"&gt;Windows Forms&lt;/a&gt; &lt;a title="Microsoft .NET Framework" href="https://www.microsoft.com/net/" target="_blank"&gt;.NET&lt;/a&gt; 1.1 usada por cerca de 5000 utilizadores e crítica para o negócio.&lt;/p&gt;  &lt;p align="justify"&gt;Sendo uma aplicação complexa e crítica, migrá-la para o ambiente de execução 2.0 apenas porque sim não seria uma opção porque significaria instalar um novo ambiente de execução e plataforma no ambiente estável dos postos de trabalho (&lt;a title="Microsoft Windows" href="http://cli.gs/Microsoft-Windows" target="_blank"&gt;&lt;/a&gt;&lt;a title="Microsoft Windows XP" href="http://www.microsoft.com/windows/windows-xp/" target="_blank"&gt;Windows XP&lt;/a&gt;&lt;/a&gt;) e testar todas as aplicações.&lt;/p&gt;  &lt;p align="justify"&gt;Com o passar dos tempos, um elemento da equipa recebeu um novo posto de trabalho com o &lt;a title="Microsoft Windows Vista" href="https://www.microsoft.com/windows/windows-vista/" target="_blank"&gt;Windows Vista&lt;/a&gt;. Uma vez que apenas necessitava de .NET 2.0 para os seus desenvolvimentos, nunca instalou a .NET 1.1.&lt;/p&gt;  &lt;p align="justify"&gt;Um outro membro da equipa já tinha tentado migrar a aplicação para .NET 2.0 e deparou-se com os seguintes problemas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;O principal componente da aplicação é o &lt;a title="WebBrowserControl for the .NET Framework 1.1" href="http://www.codeproject.com/KB/miscctrl/WebBrowserControl11.aspx" target="_blank"&gt;Web Browser Control&lt;/a&gt;. Este controlo extende o &lt;a title="AxHost Class" href="http://msdn.microsoft.com/library/system.windows.forms.axhost.aspx" target="_blank"&gt;AxHost&lt;/a&gt;, que, na transição da 1.1 para a 2.0 sofreu alterações e necessitava de profundas alterações para que pudesse ser compilado para a plataform 2.0.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Misturar chamadas síncronas e assíncronas não é permitido na plataforma 2.0 e a aplicação tinha, pelo menos, um caso desses na utilização de &lt;a title="HttpWebRequest Class" href="http://msdn.microsoft.com/library/system.net.httpwebrequest.aspx" target="_blank"&gt;HttpWebRequest&lt;/a&gt;/&lt;a title="HttpWebResponse Class" href="http://msdn.microsoft.com/library/system.net.httpwebresponse.aspx" target="_blank"&gt;HttpWebResponse&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;A .NET 2.0 foi desenvolvida para ter o máximo de retro compatibilidade com a .NET 1.1 por forma a poder correr com o mínimo e impactos (nenhum, na maioria dos casos) aplicações desenvolvidas para a .NET 1.1. De facto, algumas das alterações passaram apenas por aplicar o atributo &lt;a title="ObsoleteAttribute Class" href="http://msdn.microsoft.com/library/system.obsoleteattribute.aspx" target="_blank"&gt;ObsoleteAttribute&lt;/a&gt; de modo a que o compilador dê erro, impedindo a compilação de novo código mas não impedindo a utilização por parte de código previamente compilado. Era este o caso do WebBrowserControl/AxHost e usar a &lt;em&gt;assembly &lt;/em&gt;compilada para .NET 1.1, provavelmente, seria&amp;#160; suficiente. E foi.&lt;/p&gt;  &lt;p align="justify"&gt;A questão do síncrono/assíncrono também foi fácil de resolver. Apenas requereu alterar isto:&lt;/p&gt;  &lt;p style="padding-left:2em;" align="left"&gt;&lt;font face="Consolas"&gt;request.GetRequestStream()&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;para isto:&lt;/p&gt;  &lt;p style="padding-left:2em;" align="left"&gt;&lt;font face="Consolas"&gt;request.EndGetRequestStream(response.BeginGetRequestStream(null, null))&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;E tudo funcionou como se estivesse a correr em .NET 1.1.&lt;/p&gt;  &lt;p align="justify"&gt;Mas ainda não é o fim da história. Mais tarde veio um requisito para que uma das páginas web que correm no controlo web browser usassem um componente ActiveX desenvolvido em .NET 2.0.&lt;/p&gt;  &lt;p&gt;Por esta altura já os postos de trabalho tinham a plataforma 2.0 instalada.&lt;/p&gt;  &lt;p&gt;Mas, como forçar a aplicação a correr no ambiente de execução 2.0 em vez de 1.1 dado que ambos estavam instalados nos postos de trabalho?&lt;/p&gt;  &lt;p&gt;Tão simples como adicionar isto ao ficheiro de configuração (App.config):&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;startup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;requiredRuntime &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;v2.0.50727&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;safemode&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;startup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38158" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38158" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38158" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=VFu69CPwaew:4PurGVIKt5o:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=VFu69CPwaew:4PurGVIKt5o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=VFu69CPwaew:4PurGVIKt5o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=VFu69CPwaew:4PurGVIKt5o:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=VFu69CPwaew:4PurGVIKt5o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=VFu69CPwaew:4PurGVIKt5o:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=VFu69CPwaew:4PurGVIKt5o:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/VFu69CPwaew" height="1" width="1"/&gt;</description><pubDate>Wed, 21 Oct 2009 00:46:07 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38158</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38158</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2009/10/21/correndo-aplica-231-245-es-net-1-1-em-net-2-0.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2009/10/21/correndo-aplica-231-245-es-net-1-1-em-net-2-0.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38134</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/YPXTswheJIc/techtalks-em-ferramentas-de-desenvolvimento-ciclo-de-webcasts-microsoft.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/VisualStudio2010/default.aspx">VisualStudio2010</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Webcasts/default.aspx">Webcasts</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><title>Techtalks em Ferramentas de Desenvolvimento| Ciclo de Webcasts| Microsoft</title><description>&lt;p style="text-align:center;font-family:arial;color:#009644;font-size:12pt;"&gt;&lt;b&gt;&lt;span style="font-family:arial;color:#009644;font-size:18pt;"&gt;Tech Talks&lt;/span&gt; em Ferramentas de Desenvolvimento&lt;/b&gt; &lt;/p&gt;  &lt;p style="text-align:center;font-family:arial;color:#009644;font-size:12pt;"&gt;&lt;b&gt;4 Sessőes Webcast &amp;gt; Nivel 200/300&lt;/b&gt; &lt;/p&gt;  &lt;p style="text-align:center;"&gt;&lt;img border="0" alt="Tech Talks em Ferramentas de Desenvolvimento" src="http://www.microsoft.com/library/media/2070/portugal/msdn/media/mailshots/TechTalks.jpg" /&gt; &lt;/p&gt;  &lt;div&gt;   &lt;div&gt;     &lt;div&gt;       &lt;div style="font-family:arial;color:#009644;font-size:12pt;font-weight:bold;"&gt;         &lt;div style="float:left;"&gt;[20 Outubro 09]&lt;/div&gt;          &lt;div style="float:right;font-weight:bold;"&gt;&lt;a href="http://co1piltwb.partners.extranet.microsoft.com/mcoeredir/mcoeredirect.aspx?linkId=12629312&amp;amp;s1=3d600a80-1a34-b5a5-fa8f-07a04e440a10" target="_blank"&gt;registo&lt;/a&gt;&lt;/div&gt;       &lt;/div&gt;        &lt;div style="font-family:arial;color:#1f497d;clear:both;font-size:9pt;font-weight:bold;"&gt;         &lt;p style="text-align:left;"&gt;Microsoft Visual Studio Team System 2008: Test Edition&lt;/p&gt;          &lt;p style="text-align:justify;font-weight:normal;"&gt;Uma sessăo dedicada á apresentaçăo da versăo de testes do Visual studio Team System 2008, especialmente das funcionalidades testes de carga, testes unitários e testes em cenários de internet. &lt;/p&gt;       &lt;/div&gt;     &lt;/div&gt;      &lt;div&gt;       &lt;div style="font-family:arial;color:#009644;font-size:12pt;font-weight:bold;"&gt;         &lt;div style="float:left;"&gt;[21 Outubro 09]&lt;/div&gt;          &lt;div style="float:right;"&gt;&lt;a href="http://co1piltwb.partners.extranet.microsoft.com/mcoeredir/mcoeredirect.aspx?linkId=12629313&amp;amp;amp;s1=3d600a80-1a34-b5a5-fa8f-07a04e440a10" target="_blank"&gt;registo&lt;/a&gt;&lt;/div&gt;       &lt;/div&gt;        &lt;div style="font-family:arial;color:#1f497d;clear:both;font-size:9pt;"&gt;         &lt;p style="text-align:left;font-weight:bold;"&gt;Microsoft Visual Studio Team System 2008: Database Edition&lt;/p&gt;          &lt;p style="text-align:justify;font-weight:normal;"&gt;Esta sessăo que abordará as funcionalidades que o Team System disponibiliza relativamente ao desenvolvimento de bases de dados, nomeadamente como se inserem no normal ciclo de desenvolvimento de software.&lt;/p&gt;       &lt;/div&gt;     &lt;/div&gt;      &lt;div&gt;       &lt;div style="font-family:arial;color:#009644;font-size:12pt;font-weight:bold;"&gt;         &lt;div style="float:left;"&gt;[27 Outubro 09]&lt;/div&gt;          &lt;div style="float:right;"&gt;&lt;a href="http://co1piltwb.partners.extranet.microsoft.com/mcoeredir/mcoeredirect.aspx?linkId=12629314&amp;amp;s1=3d600a80-1a34-b5a5-fa8f-07a04e440a10" target="_blank"&gt;registo&lt;/a&gt;&lt;/div&gt;       &lt;/div&gt;        &lt;div style="font-family:arial;color:#1f497d;clear:both;font-size:9pt;"&gt;         &lt;p style="text-align:left;font-weight:bold;"&gt;Visual Studio 2010 and .NET 4.0: Visual Studio Team System 2010 Part 1&lt;/p&gt;          &lt;p style="text-align:justify;font-weight:normal;"&gt;As novas funcionalidades do Visual Studio Team System 2010, particularmente no que diz respeito ao Team Foundation Server, Relatórios e Gestăo de Projectos.&lt;/p&gt;       &lt;/div&gt;     &lt;/div&gt;      &lt;div&gt;       &lt;div style="font-family:arial;color:#009644;font-size:12pt;font-weight:bold;"&gt;         &lt;div style="float:left;"&gt;[28 Outubro 09]&lt;/div&gt;          &lt;div style="float:right;"&gt;&lt;a href="http://co1piltwb.partners.extranet.microsoft.com/mcoeredir/mcoeredirect.aspx?linkId=12629315&amp;amp;s1=3d600a80-1a34-b5a5-fa8f-07a04e440a10" target="_blank"&gt;registo&lt;/a&gt;&lt;/div&gt;       &lt;/div&gt;        &lt;div style="font-family:arial;color:#1f497d;clear:both;font-size:9pt;"&gt;         &lt;p style="text-align:left;font-weight:bold;"&gt;Visual Studio 2010 and .NET 4.0: Visual Studio Team System 2010 Part 2&lt;/p&gt;          &lt;p style="text-align:justify;font-weight:normal;"&gt;As novas funcionalidades do Visual Studio Team System 2010 das ferramentas de suporte ao Programador e Arquitecto.&lt;/p&gt;       &lt;/div&gt;     &lt;/div&gt;   &lt;/div&gt;    &lt;p style="font-family:arial;color:#1f497d;font-size:11pt;font-weight:bold;"&gt;Orador:&lt;/p&gt;    &lt;div&gt;     &lt;div style="float:left;"&gt;&lt;img style="border-bottom-style:none;border-right-style:none;border-top-style:none;float:left;vertical-align:top;border-left-style:none;margin-right:10px;" alt="Pedro Rosa" src="http://www.microsoft.com/library/media/2070/portugal/msdn/media/mailshots/TTProsa.jpg" /&gt;         &lt;div&gt;         &lt;div style="font-family:arial;color:#1f497d;font-size:9pt;font-weight:bold;"&gt;Pedro Rosa&lt;/div&gt;          &lt;div style="font-style:italic;font-family:arial;color:#1f497d;font-size:9pt;"&gt;Developer Advisor&lt;/div&gt;          &lt;div style="font-family:arial;color:#1f497d;font-size:9pt;"&gt;Microsoft Portugal&lt;/div&gt;       &lt;/div&gt;     &lt;/div&gt;      &lt;div style="float:right;"&gt;&lt;img style="border-bottom-style:none;border-right-style:none;border-top-style:none;border-left-style:none;" src="http://www.microsoft.com/library/media/2070/portugal/msdn/media/mailshots/TTPremio.jpg" alt="" /&gt; &lt;/div&gt;   &lt;/div&gt;    &lt;div&gt;&lt;/div&gt;    &lt;p&gt;&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38134" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38134" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38134" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=YPXTswheJIc:tUYCkLMRozQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=YPXTswheJIc:tUYCkLMRozQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=YPXTswheJIc:tUYCkLMRozQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=YPXTswheJIc:tUYCkLMRozQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=YPXTswheJIc:tUYCkLMRozQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=YPXTswheJIc:tUYCkLMRozQ:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=YPXTswheJIc:tUYCkLMRozQ:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/YPXTswheJIc" height="1" width="1"/&gt;</description><pubDate>Sun, 18 Oct 2009 12:36:36 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38134</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38134</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2009/10/18/techtalks-em-ferramentas-de-desenvolvimento-ciclo-de-webcasts-microsoft.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2009/10/18/techtalks-em-ferramentas-de-desenvolvimento-ciclo-de-webcasts-microsoft.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:38090</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/PTU0PneBlJU/truques-amp-dicas-de-linq-para-sql-tips-amp-tricks-opera-231-245-es-de-texto.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/LINQ2SQL/default.aspx">LINQ2SQL</category><title>Truques &amp; Dicas De LINQ Para SQL: Operações De Texto</title><description>&lt;a title="LINQ Com C#" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ Com C#" border="0" alt="LINQ Com C#" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;   &lt;p align="justify"&gt;O &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; trouxe-nos uma forma muito amigável de escrever consultas de forma independente do domínio das mesmas.&lt;/p&gt;  &lt;p align="justify"&gt;O facto de que o modo como as consultas são escritas é independente do domínio não quer dizer que todas vão ser compiladas e executadas do mesmo modo. É sempre necessário saber como o provedor se vai comportar.&lt;/p&gt;  &lt;p align="justify"&gt;O &lt;a title="LINQ to Objects" href="http://msdn.microsoft.com/library/bb397919.aspx" target="_blank"&gt;LINQ Para Objectos&lt;/a&gt;, por exemplo, vai compilar as consultas para chamadas a funções do tipo &lt;strong&gt;Func&amp;lt;&amp;gt;&lt;/strong&gt; que retornam implementações de &lt;a title="IEnumerable(T) Interface" href="http://msdn.microsoft.com/library/9eekhta0.aspx" target="_blank"&gt;IEnumerable(T)&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Por outro lado, o &lt;a title="LINQ To SQL" href="http://msdn.microsoft.com/library/bb386976.aspx" target="_blank"&gt;LINQ Para SQL&lt;/a&gt; vai compilar as consultas para uma árvore de expressões do tipo &lt;strong&gt;Expression&amp;lt;Func&amp;lt;&amp;gt;&amp;gt;&lt;/strong&gt; e a sua execução retornará implementações de &amp;lt;&lt;a title="IQueryable(T) Interface" href="http://msdn.microsoft.com/library/bb351562.aspx" target="_blank"&gt;IQueryable(T)&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Porque as consultas &lt;strong&gt;LINQ Para SQL&lt;/strong&gt; são compiladas para uma árvore de expressões, é possível que o provedor trate os elementos da árvore como bem entender.&lt;/p&gt;  &lt;p align="justify"&gt;Neste caso, isto quer dizer que todas as operações que poderem ser executadas na base de dados serão executadas na base de dados e o programador(a) tem de ter noção disto quando escrever as consultas.&lt;/p&gt;  &lt;p align="justify"&gt;Consideremos um exemplo usando a base de dados &lt;strong&gt;AdventureWorks&lt;/strong&gt; (se não tiverem, podem descarregar &lt;a title="Microsoft SQL Server Product Samples: Database" href="http://msftdbprodsamples.codeplex.com/" target="_blank"&gt;daqui&lt;/a&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;Eu quero construír uma lista de saudações para todos os empregados que&amp;#160; tenham a marca&lt;strong&gt;SalariedFlag&lt;/strong&gt;, na forma:&lt;/p&gt;  &lt;p style="padding-left:1em;" align="justify"&gt;[Mr.|Mrs.|Miss] &amp;lt;first name&amp;gt; &amp;lt;middle name&amp;gt; &amp;lt;last name&amp;gt;&lt;/p&gt;  &lt;p align="justify"&gt;Mas há um pequeno detalhe na base de dados: &lt;strong&gt;FirstName&lt;/strong&gt;, &lt;strong&gt;MiddleName&lt;/strong&gt; e &lt;strong&gt;LastName&lt;/strong&gt; podem ter espaços no fim e eu não os quero.&lt;/p&gt;  &lt;p align="justify"&gt;É algo tão simples como isto:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q1 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees
         &lt;span style="color:blue;"&gt;where &lt;/span&gt;e.SalariedFlag
         &lt;span style="color:blue;"&gt;select
            &lt;/span&gt;((e.Gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((e.MaritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+
            e.Person.FirstName.Trim() +
            (e.Person.MiddleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| e.Person.MiddleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ e.Person.MiddleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;) +
            e.Person.LastName.Trim();&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;que será executado na base de dados como:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:gray;"&gt;((((
    (&lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
        WHEN &lt;/span&gt;&lt;span style="color:magenta;"&gt;UNICODE&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender]&lt;span style="color:gray;"&gt;) = &lt;/span&gt;@p0 &lt;span style="color:blue;"&gt;THEN
            &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
                WHEN &lt;/span&gt;&lt;span style="color:magenta;"&gt;UNICODE&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus]&lt;span style="color:gray;"&gt;) = &lt;/span&gt;@p1 &lt;span style="color:blue;"&gt;THEN &lt;/span&gt;@p2
                &lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;@p3
             &lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;)
        &lt;/span&gt;&lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;NVarChar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;4&lt;span style="color:gray;"&gt;),&lt;/span&gt;@p4&lt;span style="color:gray;"&gt;)
     &lt;/span&gt;&lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;)) + &lt;/span&gt;@p5&lt;span style="color:gray;"&gt;) + &lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName]&lt;span style="color:gray;"&gt;))) + (
    (&lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
        WHEN &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName] &lt;span style="color:gray;"&gt;IS NULL) OR (&lt;/span&gt;&lt;span style="color:magenta;"&gt;LEN&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;))) = &lt;/span&gt;@p6&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;THEN &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;NVarChar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;MAX&lt;/span&gt;&lt;span style="color:gray;"&gt;),&lt;/span&gt;@p7&lt;span style="color:gray;"&gt;)
        &lt;/span&gt;&lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;@p8 &lt;span style="color:gray;"&gt;+ &lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;))) + &lt;/span&gt;@p9
     &lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;))) + &lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName]&lt;span style="color:gray;"&gt;)) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;[value]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [70]
-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [83]
-- @p2: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [Miss]
-- @p3: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [Mrs.]
-- @p4: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [Mr.]
-- @p5: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- @p6: Input Int (Size = 0; Prec = 0; Scale = 0) [0]
-- @p7: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- @p8: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- @p9: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;Como podem ver, há um elevado número de operações sobre texto a serem feitas, na base de dados, por cada linha retornada.&lt;/p&gt;

&lt;p align="justify"&gt;Dependendo do número de linhas ou da carga na base de dados isto pode ser muito mau. Pode inclusive resultar num &lt;em&gt;timeout&lt;/em&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;Sendo assim, como é que forçamos as operações de texto a ocorrer no cliente em vez da base de dados?&lt;/p&gt;

&lt;p align="justify"&gt;Apenas os &lt;strong&gt;IQueryable&amp;lt;T&amp;gt;&lt;/strong&gt; serão traduzidos para T-SQL. Por isso, tudo o que é necessário fazer é mudar o tipo de enumerador a iterar.&lt;/p&gt;

&lt;p align="justify"&gt;Uma forma de o fazer é usar o método &lt;a title="Enumerable.AsEnumerable(TSource) Method" href="http://msdn.microsoft.com/library/bb335435.aspx" target="_blank"&gt;AsEnumerable&lt;/a&gt; da classe &lt;a title="Enumerable Class" href="http://msdn.microsoft.com/library/system.linq.enumerable.aspx" target="_blank"&gt;Enumerable&lt;/a&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;A nova consulta será escrita assim:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q2 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees.Where(e =&amp;gt; e.SalariedFlag).AsEnumerable()
         &lt;span style="color:blue;"&gt;select
            &lt;/span&gt;((e.Gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((e.MaritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ e.Person.FirstName.Trim() +
            (e.Person.MiddleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| e.Person.MiddleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ e.Person.MiddleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;) +
            e.Person.LastName.Trim();&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;e executada na base de dados como:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LoginID]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[NationalIDNumber]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[JobTitle]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BirthDate]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[HireDate]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[VacationHours]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SickLeaveHours]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CurrentFlag]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[rowguid]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ModifiedDate]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[BusinessEntityID2]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[PersonType]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[NameStyle]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Title]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Suffix]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmailPromotion]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[AdditionalContactInfo]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Demographics]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[rowguid] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[rowguid2]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ModifiedDate] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[ModifiedDate2]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Como podem notar, as operações de texto já não são executadas na base de dados mas, em contrapartida, todas as colunas de ambas as tabelas estão a ser retornadas. E isto continua a ser mau porque está a ser consumida largura de banda desnecessáriamente.&lt;/p&gt;

&lt;p align="justify"&gt;A forma de escolher as columas que serão retornadas na consulta é seleccionar apenas as colunas pretendidas. Mas porque continuamos a querer que as operações sobre texto sejam executadas no cliente, temos de projectar essas colunas num objecto intremédio. Prque não necessitamos desse objecto fora da consulta, usaremos um &lt;a title="Anonymous Types" href="http://msdn.microsoft.com/library/bb397696.aspx" target="_blank"&gt;tipo anónimo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A consulta será agora escrita assim:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q3 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;n &lt;span style="color:blue;"&gt;in
             &lt;/span&gt;(
                 &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees
                 &lt;span style="color:blue;"&gt;where &lt;/span&gt;e.SalariedFlag
                 &lt;span style="color:blue;"&gt;select new
                 &lt;/span&gt;{
                     Gender = e.Gender,
                     MaritalStatus = e.MaritalStatus,
                     FirstName = e.Person.FirstName,
                     MiddleName = e.Person.MiddleName,
                     LastName = e.Person.LastName
                 }
             ).AsEnumerable()
         &lt;span style="color:blue;"&gt;select &lt;/span&gt;((n.Gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((n.MaritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ n.FirstName.Trim()
         + (n.MiddleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| n.MiddleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ n.MiddleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;)
         + n.LastName.Trim();&lt;/pre&gt;

&lt;p&gt;e executada na base de dados como:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Note-se que a chamada a Enumerable.AsEnumerable para traduzir de &lt;strong&gt;LINQ Para SQL&lt;/strong&gt; para &lt;strong&gt;LINQ Para Objectos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E, para terminar, Se não se usarem operações de texto na consulta, estas não serão, obviamente, traduzidas para &lt;strong&gt;T-SQL&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q4 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees
         &lt;span style="color:blue;"&gt;where &lt;/span&gt;e.SalariedFlag
         &lt;span style="color:blue;"&gt;select &lt;/span&gt;BuildSalutation(e.Gender, e.MaritalStatus, e.Person.FirstName, e.Person.MiddleName, e.Person.LastName);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;em que &lt;strong&gt;BuildSalutation&lt;/strong&gt; é implementado como:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private static object &lt;/span&gt;BuildSalutation(&lt;span style="color:blue;"&gt;char &lt;/span&gt;gender, &lt;span style="color:blue;"&gt;char &lt;/span&gt;maritalStatus, &lt;span style="color:blue;"&gt;string &lt;/span&gt;firstName, &lt;span style="color:blue;"&gt;string &lt;/span&gt;middleName, &lt;span style="color:blue;"&gt;string &lt;/span&gt;lastName)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;((gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((maritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;
        &lt;/span&gt;+ firstName.Trim()
        + (middleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| middleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ middleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;)
        + lastName.Trim();
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;e executado na base de dados como:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[gender]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[maritalStatus]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[firstName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[middleName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[lastName]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;É de notar que a consulta T-SQL gerada é praticamente a mesma que no caso anterior.&lt;/p&gt;

&lt;p&gt;Se ainda está a ler. espero que tenha ficado com a noção de que, a forma como escrever as consultas &lt;strong&gt;LINQ Para SQL&lt;/strong&gt; afecta o &lt;strong&gt;T-SQL&lt;/strong&gt; gerado.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=38090" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38090" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=38090" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=PTU0PneBlJU:7sO-OjOFO5o:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=PTU0PneBlJU:7sO-OjOFO5o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=PTU0PneBlJU:7sO-OjOFO5o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=PTU0PneBlJU:7sO-OjOFO5o:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=PTU0PneBlJU:7sO-OjOFO5o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=PTU0PneBlJU:7sO-OjOFO5o:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=PTU0PneBlJU:7sO-OjOFO5o:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/PTU0PneBlJU" height="1" width="1"/&gt;</description><pubDate>Tue, 13 Oct 2009 23:35:42 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=38090</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=38090</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2009/10/14/truques-amp-dicas-de-linq-para-sql-tips-amp-tricks-opera-231-245-es-de-texto.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2009/10/14/truques-amp-dicas-de-linq-para-sql-tips-amp-tricks-opera-231-245-es-de-texto.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:36761</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/RG2enk05Vno/pr-233-remix-sess-245-es-dia-23-de-setembro-na-microsoft.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Mix/default.aspx">Mix</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Mix09/default.aspx">Mix09</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/WindowsAzure/default.aspx">WindowsAzure</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/ReMIX09/default.aspx">ReMIX09</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/ReMIX/default.aspx">ReMIX</category><title>PréRemix: Sessões dia 23 de Setembro na Microsoft</title><description>&lt;p&gt;Hoje, dia 23 de Setembro, quarta-feira, pelas 20h00 no audit&amp;oacute;rio da Microsoft ir&amp;aacute; ser feito o Pr&amp;eacute;Remix.&lt;/p&gt;
&lt;p&gt;Consistir&amp;aacute; na apresenta&amp;ccedil;&amp;atilde;o das mesmas duas sess&amp;otilde;es focadas na Cloud que ser&amp;atilde;o apresentadas no Remix.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;Cloud computing: A plataforma Azure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Luis Martins e Pedro F&amp;eacute;lix&lt;/p&gt;
&lt;p&gt;Saiba como construir aplica&amp;ccedil;&amp;otilde;es na cloud ou usar servi&amp;ccedil;os interoperaveis sobre a infraestrutura Microsoft. Venha aprender como poder&amp;aacute; tirar partido desta plataforma para solucionar os desafios de desenvolvimento de software. Nesta sess&amp;atilde;o poder&amp;aacute; ainda ouvir os conceitos essenciais do Windows Azure, o que h&amp;aacute; de novo e como se posiciona face &amp;agrave; concorr&amp;ecirc;ncia.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;Armazenamento na cloud&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jos&amp;eacute; Ant&amp;oacute;nio Silva&lt;/p&gt;
&lt;p&gt;A escalabilidade do storage implica tipicamente um conjunto de decis&amp;otilde;es de arquitectura, de forma a manter afastadas as limita&amp;ccedil;&amp;otilde;es impostas pelos sistemas de gest&amp;atilde;o de base de dados relacionais. Estas decis&amp;otilde;es n&amp;atilde;o s&amp;atilde;o mais opcionais neste entusiasmante mundo dos cloud services.&lt;/p&gt;
&lt;p&gt;A boa not&amp;iacute;cia diz-nos que, assim que come&amp;ccedil;amos a desenvolver para os novos storage engines, o mais prov&amp;aacute;vel &amp;eacute; que fiquemos viciados nestes modelos mais flex&amp;iacute;veis.&lt;/p&gt;
&lt;p&gt;Junte-se a n&amp;oacute;s nesta sess&amp;atilde;o e fique a conhecer as tables, queues, key-values e outros patterns que nos ajudam a criar camadas de dados persistentes escal&amp;aacute;veis e distribu&amp;iacute;das para a cloud.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=36761" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=36761" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=36761" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=RG2enk05Vno:dM0md3pmw7I:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=RG2enk05Vno:dM0md3pmw7I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=RG2enk05Vno:dM0md3pmw7I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=RG2enk05Vno:dM0md3pmw7I:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=RG2enk05Vno:dM0md3pmw7I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=RG2enk05Vno:dM0md3pmw7I:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=RG2enk05Vno:dM0md3pmw7I:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/RG2enk05Vno" height="1" width="1"/&gt;</description><pubDate>Wed, 23 Sep 2009 11:20:00 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=36761</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=36761</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2009/09/23/pr-233-remix-sess-245-es-dia-23-de-setembro-na-microsoft.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2009/09/23/pr-233-remix-sess-245-es-dia-23-de-setembro-na-microsoft.aspx</feedburner:origLink></item><item><guid isPermaLink="false">9d4b03f4-ce39-4703-ab9d-5b341a2c824e:36627</guid><link>http://feeds.paulomorgado.net/~r/PauloMorgado/Blogs/PT/~3/Hbnx31Bpwgo/desconto-de-20-para-o-remix-para-membros-pontonetpt.aspx</link><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/PontoNetPT/default.aspx">PontoNetPT</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/ReMIX09/default.aspx">ReMIX09</category><category domain="http://pontonetpt.com/blogs/paulomorgado/archive/tags/ReMIX/default.aspx">ReMIX</category><title>Desconto De 20% Para O ReMIX Para Membros pontoNETpt</title><description>&lt;p&gt;&lt;a target="_blank" href="http://pontonetpt.com/" title="[:: PontoNetPT - .NET em Portugu&amp;ecirc;s(PT) ::]"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a target="_blank" href="http://www.microsoft.com/portugal/remix/index.aspx" title="ReMIX 09 Portugal"&gt;&lt;img height="364" width="380" src="https://www.microsoft.com/portugal/remix/res/img/back_page.jpg" align="left" alt="ReMIX 09 Portugal" border="0" title="ReMIX 09 Portugal" style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;a target="_blank" href="http://www.microsoft.com/portugal/remix/index.aspx" title="ReMIX 09 Portugal"&gt;&lt;img height="61" width="134" src="https://www.microsoft.com/portugal/remix/res/img/remix_logo.gif" alt="ReMIX 09" border="0" title="ReMIX 09" style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Pelo valioso contributo que t&amp;ecirc;m trazido &amp;agrave; discuss&amp;atilde;o e partilha de boas pr&amp;aacute;ticas sobre a utiliza&amp;ccedil;&amp;atilde;o da plataforma &lt;a target="_blank" href="https://www.microsoft.com/net/" title="Microsoft .NET Framework"&gt;.NET&lt;/a&gt;, a &lt;a target="_blank" href="http://www.microsoft.com/" title="Microsoft Corporation"&gt;&lt;/a&gt;&lt;a target="_blank" href="http://www.microsoft.com/portugal/" title="Microsoft Portugal"&gt;Microsoft Portugal&lt;/a&gt; est&amp;aacute; a oferecer, aos membros da comunidade &lt;a target="_blank" href="http://pontonetpt.com/" title="[:: PontoNetPT - .NET em Portugu&amp;ecirc;s(PT) ::]"&gt;pontoNETpt&lt;/a&gt;, &lt;strong&gt;&lt;em&gt;vouchers&lt;/em&gt; com 20% de desconto&lt;/strong&gt; sobre o pre&amp;ccedil;o do registo no &lt;a target="_blank" href="http://www.microsoft.com/portugal/remix/" title="ReMIX Portugal"&gt;REMIX&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Quem estiver interessado em fazer uso deste benef&amp;iacute;cio dever&amp;aacute; enviar um e-mail para &lt;strong&gt;cristina.carvalho at microsoft.com&lt;/strong&gt; com pedido de &lt;em&gt;voucher&lt;/em&gt;-desconto. O e-mail dever&amp;aacute; ter como assunto &lt;strong&gt;pontoNETpt no &lt;/strong&gt;&lt;strong&gt;ReMIX&lt;/strong&gt; e inclu&amp;iacute;r no seu corpo o endere&amp;ccedil;o do seu perfil na comunidade (&lt;a href="http://pontonetpt.com/members/&amp;lt;membro&amp;gt;/"&gt;http://pontonetpt.com/members/&amp;lt;membro&amp;gt;/&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Actualiza&amp;ccedil;&amp;atilde;o: &lt;/strong&gt;Para quem j&amp;aacute; fez o pagamento, e n&amp;atilde;o podendo fazer retorno do investimento, a Microsoft tem o maior gosto em oferecer um voucher com 50% de desconto para oferecer a quem considere ter interesse nos conte&amp;uacute;dos deste evento.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://pontonetpt.com/aggbug.aspx?PostID=36627" width="1" height="1"&gt;
&lt;div class="feed_ad"&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=36627" class="feed_ad"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=b54bb5e123554ed4bf08aed024c53573&amp;u=36627" border="0" class="feed_ad"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=Hbnx31Bpwgo:TZiSi62F9OM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=Hbnx31Bpwgo:TZiSi62F9OM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=Hbnx31Bpwgo:TZiSi62F9OM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=Hbnx31Bpwgo:TZiSi62F9OM:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=Hbnx31Bpwgo:TZiSi62F9OM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.paulomorgado.net/~ff/PauloMorgado/Blogs/PT?a=Hbnx31Bpwgo:TZiSi62F9OM:kZPkksuLl5A"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PauloMorgado/Blogs/PT?i=Hbnx31Bpwgo:TZiSi62F9OM:kZPkksuLl5A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PauloMorgado/Blogs/PT/~4/Hbnx31Bpwgo" height="1" width="1"/&gt;</description><pubDate>Fri, 18 Sep 2009 15:14:00 Z</pubDate><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Morgado</dc:creator><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/rsscomments.aspx?PostID=36627</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://pontonetpt.com/blogs/paulomorgado/commentapi.aspx?PostID=36627</wfw:comment><comments>http://pontonetpt.com/blogs/paulomorgado/archive/2009/09/18/desconto-de-20-para-o-remix-para-membros-pontonetpt.aspx#comments</comments><feedburner:origLink>http://pontonetpt.com/blogs/paulomorgado/archive/2009/09/18/desconto-de-20-para-o-remix-para-membros-pontonetpt.aspx</feedburner:origLink></item></channel></rss>
