<?xml version="1.0" encoding="iso-8859-15"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xml:lang="it-it"><title>blogs.ASPItalia.com</title><id>http://blogs.aspitalia.com/ricciolo/</id><link href="http://blogs.aspitalia.com/ricciolo/" rel="self" type="application/rss+xml" /><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/" /><generator uri="http://feed.aspitalia.com/" version="1.0">feed.ASPItalia.com 'Caesar Reborn' 2009.6.29</generator><author><name>blogs.ASPItalia.com</name><uri>http://blogs.aspitalia.com/ricciolo/</uri></author><updated>2009-05-31T09:14:00+00:00</updated><icon>http://gui.ASPItalia.com/images/aspitalia/syndication.gif</icon><entry><title>Silverlight - Real time audio peak meter </title><id>http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx</id><updated>2009-05-31T09:14:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2511' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;In un &lt;a href=&quot;http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx&quot;&gt;post&lt;/a&gt; precedente ho mostrato di come si pu&#242; realizzare un misuratore di picchi per l'audio di un &lt;b&gt;MediaElement&lt;/b&gt; precalcolandoli con un'applicazione console. Ovviamente questa non &#232; la prassi normale di tutti i lettori normali, dove il calcolo della FFT applicata ai samples avviene in real time, man mano che questi vengono renderizzati sulla periferica audio.&lt;/p&gt;&lt;p&gt;Da Silverlight 2.0 sull'oggetto MediaElement&amp;#xa0;&#232; presente un metodo SetSource che accetta uno Stream oppure un'oggetto &lt;b&gt;MediaStreamSource&lt;/b&gt;. Questa classe ha dei metodi che MediaElement chiama, come OpenMediaAsync, GetSampleAsync, SeekAsync per chiederci di aprire la sorgente, di restituirgli gruppi di samples o di posizionarci ad uno specifico timestamp. Con i metodi ReportOpenMediaCompleted, ReportGetSampleCompleted e ReportSeekCompleted non si fa altro che notificargli l'avvenuta operazione e ciclicamente mandargli pacchetti audio/video.&lt;/p&gt;&lt;p&gt;La brutta notizia &#232; che i samples audio e video devono essere compressi (MP4, WMV) e quindi quello che noi possiamo fare &#232; solo fare da tramite per fonire tracce audio e video con i protocolli che vogliamo: RTP, UPNP, streaming custom. Questa &#232; una brutta notizia perch&#233; per applicare la FFT occorre avere i samples grezzi, gi&#224; decodificati. L'oggetto MediaElement non permette di caricare file &lt;b&gt;WAV&lt;/b&gt; direttamente, ma il MediaStreamSouce permette invece di passare anche i samples raw, che il file WAV appunto contiene. Sebbene si potrebbe scrivere un decoder MP3, non sono cos&#236; pazzo da farlo :-), perci&#242; ho scelto di creare un file &lt;b&gt;WavMediaStreamSource&lt;/b&gt; che carica tramite WebRequest un file wav e&amp;#xa0;legge&amp;#xa0;l'header per conoscere il numero di canali, i samples al secondo (solitamente 44100) e i bit (8/16). L'implementazione poi non fa altro che rigirare i byte al MediaElement.&lt;/p&gt;&lt;p&gt;Ho portato poi l'algoritmo FFT e di calcolo dei picchi sulla mia libreria Silverlight e diviso il controllo del post precedente in due parti: &lt;b&gt;DataAudioPeakMeter&lt;/b&gt; e &lt;b&gt;SamplesAudioPeakMeter&lt;/b&gt;. Il primo lavora con il file dat precalcolato e funziona con tutti i formati supportati da SL. Il secondo lavora solo con i file WAV, ma funziona in real time. Entrambi poi fanno uso della &lt;b&gt;BarVisualization&lt;/b&gt; per l'animazione.&lt;/p&gt;&lt;p&gt;L'utilizzo &#232; piuttosto semplice:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#800000&quot;&gt;MediaElement&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;AutoPlay&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;False&amp;quot;&lt;/span&gt;
              &lt;span style=&quot;color:#FF0000&quot;&gt;x&lt;/span&gt;:&lt;span style=&quot;color:#FF0000&quot;&gt;Name&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;media&amp;quot;&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;/&amp;gt;&lt;/span&gt;

&lt;span style=&quot;color:#008000&quot;&gt;&amp;lt;!-- Visualization --&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#C71585&quot;&gt;a&lt;/span&gt;:&lt;span style=&quot;color:#800000&quot;&gt;SamplesAudioPeakMeter&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;x&lt;/span&gt;:&lt;span style=&quot;color:#FF0000&quot;&gt;Name&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;sa&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#C71585&quot;&gt;a&lt;/span&gt;:&lt;span style=&quot;color:#800000&quot;&gt;BarVisualization&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;BarSegmentHeight&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;4&amp;quot;&lt;/span&gt;
        &lt;span style=&quot;color:#FF0000&quot;&gt;BarMargin&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
        &lt;span style=&quot;color:#FF0000&quot;&gt;BarSegmentMargin&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
        &lt;span style=&quot;color:#FF0000&quot;&gt;StrokeBrush&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;Yellow&amp;quot;&lt;/span&gt;
        &lt;span style=&quot;color:#FF0000&quot;&gt;StrokeThickness&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#C71585&quot;&gt;a&lt;/span&gt;:&lt;span style=&quot;color:#800000&quot;&gt;BarVisualization.BarBrush&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#800000&quot;&gt;LinearGradientBrush&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;StartPoint&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;0,0&amp;quot;&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;EndPoint&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;0,1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;gt;&lt;/span&gt;
                &lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#800000&quot;&gt;GradientStop&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;Offset&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
                              &lt;span style=&quot;color:#FF0000&quot;&gt;Color&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;Black&amp;quot;&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;/&amp;gt;&lt;/span&gt;
                &lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#800000&quot;&gt;GradientStop&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;Offset&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;0&amp;quot;&lt;/span&gt;
                              &lt;span style=&quot;color:#FF0000&quot;&gt;Color&lt;/span&gt;=&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;/&amp;gt;&lt;/span&gt;

            &lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#800000&quot;&gt;LinearGradientBrush&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#C71585&quot;&gt;a&lt;/span&gt;:&lt;span style=&quot;color:#800000&quot;&gt;BarVisualization.BarBrush&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#C71585&quot;&gt;a&lt;/span&gt;:&lt;span style=&quot;color:#800000&quot;&gt;BarVisualization&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#C71585&quot;&gt;a&lt;/span&gt;:&lt;span style=&quot;color:#800000&quot;&gt;SamplesAudioPeakMeter&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Da codice poi dobbiamo legare la sorgente wav sia al MediaElement che al SamplesAudioPeakMeter:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;WavMediaStreamSource source = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; WavMediaStreamSource(&lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; Uri(&amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;test1.wav&lt;/span&gt;&amp;quot;, UriKind.RelativeOrAbsolute));
source.Loop = &lt;span style=&quot;color:#0000FF&quot;&gt;true&lt;/span&gt;;

&lt;span style=&quot;color:#008000&quot;&gt;// Binding Source -&amp;gt; Visualization&lt;/span&gt;
sa.SetSource(source);
&lt;span style=&quot;color:#008000&quot;&gt;// Binding Source -&amp;gt; MediaElement&lt;/span&gt;
media.SetSource(source);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ed ecco il risultato:&lt;/p&gt;
&lt;img src=&quot;http://blogs.aspitalia.com/img/Ricciolo/fft.png&quot; /&gt;
&lt;p&gt;Ovviamente i file wav sono di grandi dimensioni quindi questa tecnica &#232; adatta per file di piccola di dimensione sulla quale fare loop, ma meglio di niente :-). Poi speriamo che magari nella RTM di Silverlight 3.0 ci sia la possibilit&#224; di accedere ai samples gi&#224; decodificati.&lt;/p&gt;
&lt;p&gt;Infine le performance: escludendo l'animazione sono rimasto piuttosto colpito. La mia CPU resta su un 2% per calcolare FFT e picchi. Includendo l'animazione si arriva poi ad un 25/30%, ma va considerato che SL tenta sempre di andare al massimo di frame rate per l'esecuzione delle animazioni.&lt;br/&gt;Presto metter&#242; i sorgenti: promesso!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_-_animazioni/&quot; rel=&quot;tag&quot;&gt;Silverlight - animazioni&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_2.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term="Silverlight"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2511.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2511</trackback:ping></entry><entry><title>Salvare immagini Bitmap con Silverlight 3.0</title><id>http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx</id><updated>2009-05-29T17:56:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2510' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;In &lt;strong&gt;Silverlight 3.0&lt;/strong&gt; &#232; stato aggiunta la possibilit&#224; di salvare file in locale attraverso la &lt;strong&gt;SaveFileDialog&lt;/strong&gt;. Per motivi di sicurezza, questa pu&#242; essere visualizzata solo all'interno di un evento scatenato dall'utente (pressione del pulsante, ecc)&amp;#xa0;mentre attraverso OpenFile &#232; possibile poi aprire uno Stream per la scrittura sulla quale &#232; possibile scrivere qualsiasi cosa.&lt;/p&gt;&lt;p&gt;In una discussione con &lt;a href=&quot;http://blogs.aspitalia.com/nostromo/&quot;&gt;Marco&lt;/a&gt; ci &#232; venuto il dubbio se si poteva salvare immagini in locale, ma purtroppo la cosa non &#232; molto semplice da raggiungere. In SL infatti non ci sono API per effettuare encoding ed decoding di immagini ad eccezione del passare uno Stream da visualizzare. Inoltre con &lt;strong&gt;WriteableBitmap&lt;/strong&gt; &#232; stata aggiunta la possibilit&#224; di caricare uno Stream o di renderizzare un &lt;strong&gt;UIElement&lt;/strong&gt; su un'immagine, ma poi non &#232; possibile accedere ai byte. Insomma, se si ha un'immagine gi&#224; codificata in JPEG/PNG basta semplicemente travasare lo Stream sorgente verso il file locale, altrimenti se si ha solo i byte grezzi dell'immagine occorre scriversi il motore di encoding e di creazione del contenitore.&lt;/p&gt;&lt;p&gt;Per fortuna c'&#232; il buon vecchio file &lt;strong&gt;BMP&lt;/strong&gt;, la cui definizione si pu&#242; trovare &lt;a href=&quot;http://en.wikipedia.org/wiki/BMP_file_format&quot;&gt;qui&lt;/a&gt;, che &#232; abbastanza semplice da creare&amp;#xa0;e a parte dover accodare i byte dell'immagine dal basso verso l'altro, non necessita di algoritmi di compressione. Ovviamente il file risultante &#232; di grandi dimensioni, ma non dev'essere trasportato in rete, ma bens&#236; salvato direttamente in locale. Ho scritto quindi un &lt;strong&gt;BitmapEncoder&lt;/strong&gt; e un BitmapFrame per salvare un'immagine in BMP, lo trovate completo di sorgente &lt;a href=&quot;http://lab.aspitalia.com/Ricciolo/Downloads/SLSaveBitmap.zip&quot;&gt;qua&lt;/a&gt;. L'esempio allegato genera un'immagine con un algoritmo e la mostra anche attraverso un WriteableBitmap.&lt;/p&gt;&lt;p&gt;&lt;img align=&quot;baseline&quot; src=&quot;http://blogs.aspitalia.com/img/Ricciolo/SLBitmap.jpg&quot; border=&quot;0&quot; hspace=&quot;0&quot; complete=&quot;true&quot; complete=&quot;true&quot; /&gt;&lt;/p&gt;&lt;p&gt;Purtroppo non serve a tantissimo, perch&#233; attualmente la WriteableBitmap non permette di accedere ai pixel e quindi non &#232; possibile salvare screenshot effettuati sugli elementi. Potenzialmente si pu&#242; creare qualsiasi file, ma ovviamente non &#232; semplice doversi riscrivere librerie di creazione di file, non potendosi appoggiare a oggetti COM.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_3.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 3.0&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term="Silverlight"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2510.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2510</trackback:ping></entry><entry><title>.NET Framework 4.0 beta 1: Tuple</title><id>http://blogs.aspitalia.com/ricciolo/post2509/.NET-Framework-4.0-Beta-1-Tuple.aspx</id><updated>2009-05-27T04:00:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2509' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Altro post per un&amp;#39;altra novit&#224; del .NET Framework 4.0: le classi &lt;b&gt;Tuple&lt;/b&gt;. In pratica sono delle classi generiche con tanti argomenti generici quanti sono le relative propriet&#224; che esse espongono.&lt;/p&gt;
&lt;p&gt;Per esempio Tuple&amp;lt;T1, T2&amp;gt; ha una propriet&#224; Item1 di tipo T1 e una propriet&#224; Item2 di tipo T2. Ci vengono molto comode per quelle volte che nei nostri algoritmi, per velocizzare la scrittura del codice (o per pigrizia :-) ), abbiamo bisogno di una classe che faccia da repository dei valori. Inoltre la loro caratteristica &#232; di implementare GetHashCode, Equals e l&amp;#39;interfaccia &lt;b&gt;IComparable&lt;/b&gt;, &lt;b&gt;IStructuralEquatable&lt;/b&gt; (nuova in .NET 4.0) e &lt;b&gt;IStructuralComparable&lt;/b&gt; (nuova in .NET 4.0) in modo che a parit&#224; dei valori, due istanze di Tuple diverse risultino uguali. Si comportano quindi come un valore atomico e sono l&amp;#39;ideale per essere utilizzate come chiavi per dictionary o per hash set.&lt;/p&gt;
&lt;p&gt;Per capirci quindi:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;var t = Tuple.Create&amp;lt;Int32, String&amp;gt;(2, &amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;ciao&lt;/span&gt;&amp;quot;);
var t2 = Tuple.Create&amp;lt;Int32, String&amp;gt;(2, &amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;ciao&lt;/span&gt;&amp;quot;);

Console.WriteLine(t.Item2);
Console.WriteLine(&amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;Reference equals: {0}&lt;/span&gt;&amp;quot;, Object.ReferenceEquals(t, t2));
Console.WriteLine(&amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;Equals: {0}&lt;/span&gt;&amp;quot;, t.Equals(t2));&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;stampa a video:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;ciao
Reference equals: False
Equals: True&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In effetti c&amp;#39;&#232; una forte somiglianza agli anonymous type sebbene quest&amp;#39;ultimi sono generati dal compilatore e hanno propriet&#224; dal nome che vogliamo. In comune hanno infatti che due istanze diverse, ma con identici valori, risultano uguali se comparati tra loro. Non implementano per&#242; IStructuralEquatable, ma non credo che questo sia un problema. Se necessitiamo di lavorare a livello d&amp;#39;interfaccia allora tanto vale restituire una tuple nelle nostre query.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_4.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 4.0&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET 4.0"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2509/.NET-Framework-4.0-Beta-1-Tuple.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2509/.NET-Framework-4.0-Beta-1-Tuple.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2509.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2509</trackback:ping></entry><entry><title>.NET Framework 4.0 beta1: le classi Lazy&amp;lt;T&amp;gt; e LazyVariable&amp;lt;T&amp;gt;</title><id>http://blogs.aspitalia.com/ricciolo/post2508/.NET-Framework-4.0-Beta1-Classi-LazyT-LazyVariableT.aspx</id><updated>2009-05-26T16:42:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2508' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Tra le tante piccole e grandi novit&#224; del .NET Framework 4.0 ci sono le classi &lt;b&gt;Lazy&amp;lt;T&amp;gt;&lt;/b&gt; e &lt;b&gt;LazyVariable&amp;lt;T&amp;gt;&lt;/b&gt;. Il concetto &#232; molto semplice: istanziamo un tipo passando un delegate ad una funzione che restituisce un valore; la prima volta che interroghiamo la propriet&#224; Value, il delegate viene chiamato e il valore persistito per le successive interrogazioni.&lt;/p&gt;
&lt;p&gt;Ecco un esempio:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color:#0000FF&quot;&gt;string&lt;/span&gt;[] args)
{
    Lazy&amp;lt;String&amp;gt; v = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; Lazy&amp;lt;String&amp;gt;(GetValue);
    Lazy&amp;lt;String&amp;gt; v2 = v;

    Console.WriteLine(v.Value);
    Console.WriteLine(v.Value);
    Console.WriteLine(v2.Value);
}

&lt;span style=&quot;color:#0000FF&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;string&lt;/span&gt; GetValue()
{
    Console.WriteLine(&amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;GetValue called&lt;/span&gt;&amp;quot;);
    &lt;span style=&quot;color:#0000FF&quot;&gt;return&lt;/span&gt; &amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;ciao&lt;/span&gt;&amp;quot;;
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;che stampa a video:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;GetValue called
ciao
ciao
ciao&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La differenza con LazyVariable &#232; che questa &#232; una struct invece che una classe. Perci&#242; il seguente codice:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color:#0000FF&quot;&gt;string&lt;/span&gt;[] args)
{
    LazyVariable&amp;lt;String&amp;gt; v = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; LazyVariable&amp;lt;String&amp;gt;(GetValue);
    LazyVariable&amp;lt;String&amp;gt; v2 = v;

    Console.WriteLine(v.Value);
    Console.WriteLine(v.Value);
    Console.WriteLine(v2.Value);
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;stampa:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;GetValue called
ciao
ciao
GetValue called
ciao&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Questo perch&#233; quando si assegna v a v2, viene copiata l'intera struttura e non mantenuto un riferimento alla classe come avviene con Lazy.&lt;br/&gt;Entrambe le classi sono inoltre serializzabili e accettano nel costruttore un &lt;b&gt;LazyExecutionMode&lt;/b&gt; che dispone di tre valori: NotThreadSafe, EnsureSingleThreadSafeExecution, AllowMultipleThreadSafeExecution. In questo modo possiamo decidere se accedere a Value indicando che solo un thread ci acceder&#224;, oppure pi&#249; thread ci possono accedere e solo una volta il delegate viene eseguito (tramite lock), oppure pi&#249; thread ci accedono e una o pi&#249; volte il delegate potrebbe essere eseguito (il default). Mi piacerebbe che implementassero anche la conversione implicita verso T cos&#236; da non dover interrogare Value, ma forse lo faranno :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_4.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 4.0&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET 4.0"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2508/.NET-Framework-4.0-Beta1-Classi-LazyT-LazyVariableT.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2508/.NET-Framework-4.0-Beta1-Classi-LazyT-LazyVariableT.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2508.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2508</trackback:ping></entry><entry><title>Silverlight - Audio peak meter</title><id>http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx</id><updated>2009-05-23T16:59:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2506' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Qualche tempo fa realizzai un &lt;a href=&quot;http://blogs.aspitalia.com/ricciolo/post2168/Spettro-Audio-WPF.aspx&quot;&gt;controllo&lt;/a&gt; per l'analisi dello stream audio e la visualizzazione dei picchi attraverso &lt;strong&gt;WPF&lt;/strong&gt;. Nel tempo libero del tempo libero,&amp;#xa0;da appassionato di &lt;strong&gt;DirectShow&lt;/strong&gt; e di fuffologie mi son chiesto se si poteva fare una cosa simile anche in &lt;strong&gt;Silverlight&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Il problema &#232; che in Silverlight non si ha a disposizione DirectShow, non si pu&#242; usare codice unmanaged ne si pu&#242; accedere allo stream audio. L'unico oggetto che abbiamo &#232; &lt;strong&gt;MediaElement&lt;/strong&gt; che permette di riprodurre audio e video; nella versione 2.0 c'&#232; la classe &lt;strong&gt;MediaStreamSource&lt;/strong&gt;, ma sebbene non abbia avuto ancora modo di provarla a fondo, permette di accedere allo stream codificato e non quello decodificato, perci&#242; scrivere un decoder mp3 in codice managed non &#232; proprio una passeggiata :-). Per poter applicare FFT e calcolare decibel e picchi dobbiamo infatti avere i byte grezzi, come i file wav.&lt;/p&gt;&lt;p&gt;Siccome per la maggior parte dei casi pu&#242; bastare un piccolo loop su una canzone ho trovato una facile soluzione: precalcolare. In pratica ho realizzato una console application, interamente managed, che apre un file audio, calcola FFT ecc e salva in un file tutti i byte rappresentativi dei picchi, circa 12 suddivisi per 19 frequenze al secondo.&lt;/p&gt;&lt;p&gt;Una volta che si ha il file audio e il file .dat contenente i picchi, tramite un controllo posso mostrarne i valori. Il controllo &lt;strong&gt;AudioMeter&lt;/strong&gt; ha bisogno del file .dat e&amp;#xa0;del MediaElement sul quale basarsi per mostrare i picchi in funzione della posizione. Ecco il risultato:&lt;/p&gt;&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;embed width=&quot;480&quot; height=&quot;385&quot; src=&quot;http://www.youtube.com/v/ZavzJg4NK0Y&amp;hl=it&amp;fs=1&amp;rel=0&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot;&gt;&lt;/embed&gt;&lt;/embed&gt;&lt;//embed&gt;&lt;/embed&gt;&lt;//embed&gt;&lt;/&gt;&lt;//&gt;&lt;/embed&gt;&lt;//embed&gt;&lt;/&gt;&lt;//&gt;&lt;/&gt;&lt;//&gt;&lt;/&gt;&lt;//&gt;&lt;/object&gt;&lt;p&gt;Per rendere il pi&#249; fluido possibile l'animazione intercetto &lt;strong&gt;CompositionTarget.Rendering&lt;/strong&gt; che viene scatenato ad ogni frame dell'applicazione Silverlight che viene renderizzato. Le barre che vanno su e gi&#249; sono invece animate da &lt;strong&gt;DoubleAnimation&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Devo dire che sono molto soddisfatto del risultato. Anche se&amp;#xa0;il video non rende moltissimo, l'animazione &#232; molto fluida e ben sincronizzata, meglio di quanto avevo fatto con WPF.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_-_animazioni/&quot; rel=&quot;tag&quot;&gt;Silverlight - animazioni&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_2.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_3.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term="Silverlight"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx"/><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2506.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2506</trackback:ping></entry><entry><title>.NET Framework 4.0 beta 1: modifiche agli assembly</title><id>http://blogs.aspitalia.com/ricciolo/post2505/.NET-Framework-4.0-Beta-1-Modifiche-Assembly.aspx</id><updated>2009-05-21T20:22:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2505' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;La nuova versione del&lt;strong&gt; .NET Framework&lt;/strong&gt; &#232; un passo molto importante perch&#233; oltre a&amp;#xa0;contenere nuove tecnologie o migliorie,&amp;#xa0;si pu&#242; dire che&amp;#xa0;si d&#224; anche&amp;#xa0;un po' una ripulita e una riorganizzazione visto che il framework era diventato un po' confuso quando dopo la versione 2.0 &#232; stato aggiunta la 3.0 che era basata sempre sulla 2.0, poi allo stesso modo&amp;#xa0;la 3.5 ed infine il service pack 1 che introduceva ancora novit&#224;.&lt;/p&gt;&lt;p&gt;Innanzitutto date un occhio al &lt;a href=&quot;http://lab.ricciolo.aspitalia.com/metadatadiffviewer/metadatadiffviewer.html&quot;&gt;MetadataDiffViewer&lt;/a&gt; che l'ho aggiornato alla versione 4.0 cos&#236; non si perde nessuna novit&#224;. Innanzitutto&amp;#xa0;gli assembly sono tutti 4.0 e&amp;#xa0;balzano all'occhio&amp;#xa0;alcuni come &lt;strong&gt;System.Web.Routing&lt;/strong&gt; o &lt;strong&gt;System.Web.Abstractions&lt;/strong&gt; che esistono ancora, ma non contengono classi. Questo perch&#233; le loro classi sono state trasferite, come giusto che sia, nell'assembly Sys&lt;strong&gt;tem.Web&lt;/strong&gt;. Attraverso i due attributi &lt;strong&gt;TypeForwardedToAttribute&lt;/strong&gt; (presente gi&#224; dalla versione 2.0)&amp;#xa0;e &lt;strong&gt;TypeForwaredFromAttribute&lt;/strong&gt; si indica a compilatori, CLR e serializzatori vari di redirigere dalla vecchia posizione a quella nuova. In questo modo le applicazioni compilate per il 3.5 SP1 vengono rediretti alla nuova versione 4.0. Le nuove applicazioni invece verranno compilate con la referenza corretta.&lt;/p&gt;&lt;p&gt;Oltre alle novit&#224; pi&#249; importanti ho trovato qualcosa di interessante:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;una classe&lt;strong&gt; System.AggregateException&lt;/strong&gt; per raggruppare pi&#249; eccezioni;&lt;/li&gt;&lt;li&gt;il nuovo namespace &lt;strong&gt;System.Collections.Concurrent&lt;/strong&gt; contenente Queue, Dictionary e&amp;#xa0;Stack gi&#224; sincronizzate e quindi thread safe. Molto interessante la classe Partitioner per creare enumerazioni che smistano automaticamente il carico di lavoro tra pi&#249; consumer che ne fanno richiesta;&lt;/li&gt;&lt;li&gt;il nuovo namespace &lt;strong&gt;System.Diagnostics.Contracts&lt;/strong&gt; che contiene in particolare la classe Contract per indicare nel codice verifiche da effettuare in fase di compilazione e/o a runtime all'inizio o alla fine di una funzione (ne parler&#242; in dettaglio con un altro post);&lt;/li&gt;&lt;li&gt;le classi relative a &lt;strong&gt;PLINQ&lt;/strong&gt;, a &lt;strong&gt;ParallelFX&lt;/strong&gt;, lock ottimizzati come: Task, Parallel, SpinLock, ecc.&lt;/li&gt;&lt;li&gt;le classi Tuple&lt;t1,...tn&gt;&lt;/t1,...tn&gt;&lt;/t1,...tn&gt;&lt;//t1,...tn&gt; usate da F# per&#242; quante volte pu&#242; servire memorizzare delle informazioni in modo veloce senza creare una classe con propriet&#224; apposite;&lt;/li&gt;&lt;li&gt;il nuovo namespace e assembly System.ComponentModel.Composition che contiene tutta la parte di&amp;#xa0;&lt;strong&gt;Managed Extensibility Framework&lt;/strong&gt;;&lt;/li&gt;&lt;li&gt;in &lt;strong&gt;System.Core&lt;/strong&gt;&amp;#xa0;tante nuove Action&lt;t1,&gt;&lt;/t1,&gt;&lt;/t1,&gt;&lt;//t1,&gt; e Func&lt;t1,&gt;&lt;/t1,&gt;&lt;/t1,&gt;&lt;//t1,&gt; :-) Per la parte di expression e delle query LINQ ci sono alcune nuove classi Expression che permettono di fare degli statement: GotoExpression, LoopExpression, SwitchExpression, TryExpression, ecc. Un bellissimo ExpressionVisitor per sfogliare un'espressione: ci voleva!;&lt;/li&gt;&lt;li&gt;i nuovi assembly. System.Web.DataVisualization e System.Windows.Forms.DataVisualization contenente i controlli di charting per web e windows.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;E questo &#232; solo l'inizio, che bello che bello, tante cose nuove :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_4.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET/&quot; rel=&quot;tag&quot;&gt;ASP.NET&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET_4.0/&quot; rel=&quot;tag&quot;&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ/&quot; rel=&quot;tag&quot;&gt;LINQ&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Visual_Studio/&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET 4.0"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2505/.NET-Framework-4.0-Beta-1-Modifiche-Assembly.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2505/.NET-Framework-4.0-Beta-1-Modifiche-Assembly.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2505.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2505</trackback:ping></entry><entry><title>.NET Framework 4.0 beta 1: Windows Communication Foundation</title><id>http://blogs.aspitalia.com/ricciolo/post2498/.NET-Framework-4.0-Beta-1-Windows-Communication-Foundation.aspx</id><updated>2009-05-18T14:00:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2498' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Vista l'imminente uscita del &lt;strong&gt;.NET Framework 4.0&lt;/strong&gt; beta 1 vediamo un po' tra le numerose novit&#224;, quali sono quelle che riguardano WCF.&amp;#xa0;Nonostate fino ad ora non &#232; stata resa pubblica una build completa si conoscono gi&#224; le principali nuove caratteristiche.&lt;/p&gt;&lt;p&gt;Si parte dai miglioramenti di prestazioni del &lt;strong&gt;DataContractSerializer&lt;/strong&gt;, motore principale per la serializzazione degli oggetti e un nuovo &lt;strong&gt;DataContractResolver&lt;/strong&gt; che permette di personalizzare la risoluzione dei tipi. La configurazione, punto dolente della prima versione, &#232; stata semplificata. Ora &#232; possibile definire un servizio e/o un behavior con name vuoto e si ottiene una configurazione predefinita per tutti i servizi dell'hosting. I file svc sono poi auto configuranti e ci&#242; significa che viene creato automaticamente un endpoint basandosi sulle configurazioni predefinite dei servizi HTTP.&lt;/p&gt;&lt;p&gt;Sono disponibili poi nuovi binding e nuovi canali tra i quali la possibilit&#224; di fare &lt;strong&gt;HTTP polling duplex&lt;/strong&gt; (usato da Silverlight), di esporre un servizio tramite &lt;strong&gt;UDP&lt;/strong&gt;, un nuovo sistema di claim basato su &lt;strong&gt;Geneva&lt;/strong&gt;, nome in codice del nuovo framework per l'autenticazione e gestione dell'identit&#224;. WCF 4.0 aderisce alle specifiche &lt;strong&gt;Basic Profile 1.2&lt;/strong&gt; che garantiscono una migliore interoperabilit&#224; tra piattaforme diverse ed implementa inoltre &lt;strong&gt;WS-Discovery&lt;/strong&gt; e il routing. Il primo permette ad un servizio di annunciarsi attraverso endpoint conosciuti che i possibili client possono individuare ed andare a consumare. Con il servizio di routing &#232; invece possibile porre uno strato intermedio che dirotti le richieste verso gli endpoint effettivi a seconda dei carichi od in base a regole XPath applicate sul messaggio.&lt;/p&gt;&lt;p&gt;WCF inoltre si accopia con Windows Workflow Foundation diventando praticamente un solo framework. Questo perch&#233; dall'idea di Workflow Services, introdotti con il service pack 1 del .NET Framework 3.5, si &#232; passati ad una&amp;#xa0;forte cooperazione ed integrazione tra le tue tecnologie. Partecipano allo stesso sistema di tracing e di tracking, di gestione degli errori, di transazione e sfruttando &lt;strong&gt;WAS&lt;/strong&gt; e tutti gli strumenti aggiuntivi messi a disposizione per IIS7, raccolti sotto il nome di &lt;strong&gt;Dublin&lt;/strong&gt;, permettono di esporre workflow attraverso servizi e&amp;#xa0;di gestire e monitorare i workflow facilitando moltissimo la creazione di servizi duraturi nel tempo e scalabili.&lt;/p&gt;&lt;p&gt;Maggiori informazioni e le informazioni per il download sono disponibili nel nostro mini-sito dedicato al &lt;a href=&quot;http://netfx4.winfxitalia.com/&quot;&gt;.NET Framework 4.0&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_4.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Windows_Communication_Foundation/&quot; rel=&quot;tag&quot;&gt;Windows Communication Foundation&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Windows_Workflow_Foundation/&quot; rel=&quot;tag&quot;&gt;Windows Workflow Foundation&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2498/.NET-Framework-4.0-Beta-1-Windows-Communication-Foundation.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2498/.NET-Framework-4.0-Beta-1-Windows-Communication-Foundation.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2498.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2498</trackback:ping></entry><entry><title>Mostrare la WebCam in Silverlight</title><id>http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx</id><updated>2009-05-07T11:00:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2492' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Nel &lt;a href=&quot;http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx&quot;&gt;precedente post&lt;/a&gt; ho illustrato la mia idea di dialogo tra Silverlight e la macchina host, ma ora vediamo un caso pratico.&lt;/p&gt;
&lt;p&gt;Prima di tutto ho preparato un&amp;#39;applicazione Windows senza finestre, ma che rimane sulla system tray mettendosi in ascolto come policy server e su un&amp;#39;altra porta in attesa di connessioni. Questo &amp;quot;server&amp;quot; alla prima connessione avvia un filtro &lt;b&gt;DirectShow&lt;/b&gt; che prende l&amp;#39;immagine della WebCam, prende ogni frame attraverso un &lt;b&gt;Sample Grabber&lt;/b&gt; e lo comprime in Jpeg ad una qualit&#224; non troppo impegnativa. I bytes risultati vengono inviati al client preceduti da 8 byte che indicano la dimensione dell&amp;#39;immagine e quindi dei bytes che il client si deve aspettare. Ci&#242; che ottengo quindi &#232; di fatto un &lt;b&gt;Motion Jpeg&lt;/b&gt; pi&#224; alcuni controlli che il server fa per saltare frame qualora il client sia in ritardo a ricevere i fotogrammi.&lt;/p&gt;
&lt;p&gt;Il client Silverlight invece avvia la connessione e in modo ciclico legge nel buffer i primi 8 byte per conoscere la dimensione dell&amp;#39;immagine. Carica i restanti byte con i quale crea un &lt;b&gt;MemoryStream&lt;/b&gt; che d&#224; poi in pasto al metodo &lt;b&gt;BitmapImage.SetSource&lt;/b&gt;. Quest&amp;#39;ultimo carica l&amp;#39;immagine che viene poi associata ad un oggetto &lt;b&gt;Image&lt;/b&gt; di Silverlight. In pratica quindi, vi &#232; un flusso continuo di bytes di immagini compresse che vengono poi ricostruite per formare i fotogrammi dell&amp;#39;immagine con il quale poi ci si pu&#242; sbizzarrire come si vuole.&lt;/p&gt;
&lt;p&gt;Ho creato poi un deployment con &lt;b&gt;ClickOnce&lt;/b&gt; per avviare il server automaticamente e dei byte &amp;quot;magici&amp;quot; che manda il client per chiudere il server. Questo il risultato finale:&lt;/p&gt;
&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/t1u9G8myG9Y&amp;hl=it&amp;fs=1&amp;rel=0&amp;color1=0x2b405b&amp;color2=0x6b8ab6&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/t1u9G8myG9Y&amp;hl=it&amp;fs=1&amp;rel=0&amp;color1=0x2b405b&amp;color2=0x6b8ab6&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;p&gt;Silverlight con questa tecnica si comporta bene e l&amp;#39;uso della CPU &#232; non &#232; intenso, garantendo sempre un flusso fluido dell&amp;#39;immagine.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_2.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Windows_7/&quot; rel=&quot;tag&quot;&gt;Windows 7&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Windows_Client/&quot; rel=&quot;tag&quot;&gt;Windows Client&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term="Silverlight"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx"/><slash:comments>2</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2492.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2492</trackback:ping></entry><entry><title>Comunicazione TCP tra Silverlight e WPF</title><id>http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx</id><updated>2009-05-06T21:46:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2491' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Negli ultimi giorni mi sono incuriosito su come risolvere un'esigenza che potrebbe capitarmi in futuro: la comunicazione tra &lt;b&gt;Silverlight&lt;/b&gt; e una application &lt;b&gt;WPF/WinForms&lt;/b&gt;.&lt;br /&gt;Silverlight ha potenzialit&#224; limitate e potrebbe utile usare un&amp;#39;applicazione classica locale che non ha limiti in termini di funzionalit&#224;.&lt;/p&gt;
&lt;p&gt;Per questo scopo in Silverlight fortunatamente hanno lasciato la classe &lt;b&gt;Socket&lt;/b&gt; che, sebbene il suo utilizzo differisce dal .NET Framework, permette di connettersi ad un end point e dialogare direttamente con i bytes, permettendo ampio margine di movimento e consentendo di implementare protocolli standard o custom.&lt;/p&gt;
&lt;p&gt;Con questo post non &#232; mio intento spiegare in dettaglio come si usa il socket, ma illustrare come vedo io una possibile implementazione e una collaborazione tra un&amp;#39;applicazione locale e una in Silverlight. Innanzitutto bisogna tenere conto che Silverlight pu&#242; connettersi solo al range di porte &lt;b&gt;4502-4534&lt;/b&gt;, per ovvi motivi di sicurezza: evitare che un&amp;#39;applicazione possa essere strumento di attacchi &lt;b&gt;DoS&lt;/b&gt; o &lt;b&gt;Reverse tunnel&lt;/b&gt;. Inoltre sia che ci si connetta al host di origine sia ad un host esterno (cross site), &#232; necessario che il server sia in ascolto anche sulla porta &lt;b&gt;943&lt;/b&gt; (fissa) che su richiesta deve restituire il file &lt;i&gt;clientAccessPolicy.xml&lt;/i&gt; che gi&#224; conosciamo per le richieste HTTP, ma che viene validato anche per le richieste socket.&lt;br /&gt;A &lt;a href=&quot;http://msdn.microsoft.com/en-gb/library/cc645032(VS.95).aspx#sectionToggle4&quot;&gt;questo indirizzo&lt;/a&gt; troviamo un esempio di classe PolicyServer per implementare questa logica di validazione, qualora un client Silverlight la richieda.&lt;/p&gt;
&lt;p&gt;Con l&amp;#39;esempio indicato possiamo anche vedere come con il pattern Begin/End possiamo accettare nuove connessioni, inviare e ricevere bytes e creare di fatto un nostro protocollo di dialogo. Infatti l&amp;#39;idea &#232; che una volta avviata l&amp;#39;applicazione Silverlight, qualora serva, facciamo partire quella locale che si mette in ascolto e con la quale poi si instaura un dialogo per chiedere informazioni al server o viceversa.&lt;/p&gt;
&lt;p&gt;Per far partire il server viene in aiuto &lt;b&gt;ClickOnce&lt;/b&gt; che grazie al sua capacit&#224; di installare un&amp;#39;applicazione al volo, la fa anche avviare. Basta navigare aprendo una popup al file .application e l&amp;#39;applicazione viene installata, previa conferma, e poi avviata.&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;void&lt;/span&gt; StartButton_Click(&lt;span style=&quot;color:#0000FF&quot;&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    &lt;span style=&quot;color:#008000&quot;&gt;// Avvio l'applicazione con ClickOnce&lt;/span&gt;
    Uri appUri = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; Uri(&amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;http://test.aspitalia.com:50658/setup/WebCamStreaming.application&lt;/span&gt;&amp;quot;);
    HtmlPage.PopupWindow(appUri, &amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;_blank&lt;/span&gt;&amp;quot;, &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; HtmlPopupWindowOptions());

    &lt;span style=&quot;color:#008000&quot;&gt;// Avvia la comunicazione TCP&lt;/span&gt;
    client.ConnectAsync();
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Attraverso poi un Mutex si pu&#242; impedire che pi&#249; istanze partano, lasciando sempre un solo server attivo. Qualora poi non serva pi&#249;, possiamo sfruttare sempre la connessione tcp per inviare un segnale di chiusura dell&amp;#39;applicazione.&lt;/p&gt;
&lt;p&gt;Nel prossimo post mostrer&#242; un esempio completo di tutto questo ambaradam di cui dar&#242; i sorgenti.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_2.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term="Silverlight"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx"/><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2491.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2491</trackback:ping></entry><entry><title>Dettagli sul metodo SelectDTO</title><id>http://blogs.aspitalia.com/ricciolo/post2488/Dettagli-Metodo-SelectDTO.aspx</id><updated>2009-04-26T12:19:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2488' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Vorrei aggiungere alcuni dettagli sul &lt;a href=&quot;http://blogs.aspitalia.com/ricciolo/post2486/LINQ-Reflection-Parte.aspx&quot;&gt;mio post&lt;/a&gt; riguardo LINQ to Reflection ed in particolare sull&amp;#39;extension method SelectDTO.&lt;/p&gt;
&lt;p&gt;Quello che il metodo fa &#232; creare un expression identica a quello che faremmo scrivendo a mano il mapping. Prendiamo per esempio il classico Northwind e una classe di nome CustomerDTO:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;class&lt;/span&gt; CustomerDTO
{
    &lt;span style=&quot;color:#0000FF&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;string&lt;/span&gt; ContactName { &lt;span style=&quot;color:#0000FF&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color:#0000FF&quot;&gt;set&lt;/span&gt;; }
    &lt;span style=&quot;color:#0000FF&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;string&lt;/span&gt; ContactTitle { &lt;span style=&quot;color:#0000FF&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color:#0000FF&quot;&gt;set&lt;/span&gt;; }
    
    &lt;span style=&quot;color:#0000FF&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;string&lt;/span&gt; ToString() { 
        &lt;span style=&quot;color:#0000FF&quot;&gt;return&lt;/span&gt; String.Format(&amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;{0} {1}&lt;/span&gt;&amp;quot;, ContactTitle, ContactName);
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Per caricare la lista dei customer e creare istanze del nostro DTO dovremmo fare:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;using&lt;/span&gt; (NorthwindEntities ne = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; NorthwindEntities()) {
    IList&amp;lt;customerdto&amp;gt; l = ne.Customers.Select(c =&amp;gt; &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; CustomerDTO
    {
        ContactName = c.ContactName,
        ContactTitle = c.ContactTitle
    }).ToList();
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Usando il mio extension method invece:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;using&lt;/span&gt; (NorthwindEntities ne = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; NorthwindEntities())
{
    IList&amp;lt;CustomerDTO&amp;gt; l = ne.Customers.SelectDTO&amp;lt;Customers, CustomerDTO&amp;gt;().ToList();
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ci&#242; che si produce &#232; la medesima Expression del metodo classico, perci&#242; LINQ to Entities la tradurr&#224; nel medesimo modo, scaricando solo le colonne che ci interessano:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;SELECT&lt;/span&gt; 
1 &lt;span style=&quot;color:#0000FF&quot;&gt;AS&lt;/span&gt; [C1], 
[Extent1].[ContactName] &lt;span style=&quot;color:#0000FF&quot;&gt;AS&lt;/span&gt; [ContactName], 
[Extent1].[ContactTitle] &lt;span style=&quot;color:#0000FF&quot;&gt;AS&lt;/span&gt; [ContactTitle]
&lt;span style=&quot;color:#0000FF&quot;&gt;FROM&lt;/span&gt; [dbo].[Customers] &lt;span style=&quot;color:#0000FF&quot;&gt;AS&lt;/span&gt; [Extent1]&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Quello che si paga &#232; solo il prezzo di iniziale di reflection per l&amp;#39;analisi delle propriet&#224; in comune tra le due classi. Ovviamente questo &#232; un inizio, va valutato perch&#233; comunque ha un costo, ha il vincolo di dover chiamare le propriet&#224; che si vogliono copiare con lo stesso nome, ma lo si pu&#242; estendere.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ADO.NET_Entity_Framework/&quot; rel=&quot;tag&quot;&gt;ADO.NET Entity Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ/&quot; rel=&quot;tag&quot;&gt;LINQ&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ_to_Entities/&quot; rel=&quot;tag&quot;&gt;LINQ to Entities&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ_to_SQL/&quot; rel=&quot;tag&quot;&gt;LINQ to SQL&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET 3.5"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2488/Dettagli-Metodo-SelectDTO.aspx"/><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2488/Dettagli-Metodo-SelectDTO.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2488.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2488</trackback:ping></entry><entry><title>Parallelizzare in Silverlight 2.0</title><id>http://blogs.aspitalia.com/ricciolo/post2487/Parallelizzare-Silverlight-2.0.aspx</id><updated>2009-04-21T05:27:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2487' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Durante lo sviluppo di &lt;a href=&quot;http://lab.ricciolo.aspitalia.com/metadatadiffviewer/metadatadiffviewer.html&quot;&gt;MetadataDiffViewer&lt;/a&gt; ho dovuto fare i conti con la grande quantit&#224; di informazioni da dover processare e dover trovare un modo di rendere l&amp;#39;interfaccia la pi&#249; utilizzabile possibile. Per prima cosa ho optato per preparare una struttura di assembly/module/type/member tutta in lazy loading, in questo modo solo nell&amp;#39;espandere un assembly vengono caricati i moduli, solo espandendo un modulo vengono caricati i tipi ecc. &lt;b&gt;LINQ&lt;/b&gt; a questo scopo &#232; fantastico perch&#233; lavorando con IEnumerable si pu&#242; parserizzare, incrociare, ordinare, ma elaborare il tutto solo quando viene effettivamente consumato.&lt;/p&gt;
&lt;p&gt;Questo comporta per&#242; un difetto perch&#233; non mi consente di mostrare preventivamente quali assembly sono cambiati. Ho optato quindi per eseguire in un thread in background e ciclare per la struttura ad oggetti; appena trova un elemento cambiato, l&amp;#39;intero assembly &#232; cambiato e perci&#242; evito di proseguire. Questa operazione era comunque lunga e la cosa meno piacevole era vedere la cpu che lavorava solo al 50%, essendo un dual core.&lt;/p&gt;
&lt;p&gt;Mi son scritto quindi un piccolo extension method, specifico per la mia esigenza, per parallelizzare un&amp;#39;operazione basata su sorgenti LINQ. Il primo problema &#232; determinare quanti core abbiamo a disposizione, ma non potendo accedere all&amp;#39;OS ho ripiegato sul fatto che il thread pool in &lt;b&gt;SL 2.0&lt;/b&gt; ha 250 thread per core e questo numero non si pu&#242; cambiare. Perci&#242; ho creato una semplice propriet&#224;:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; DefaultThreadsPerCpu = 250;

&lt;span style=&quot;color:#0000FF&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; CpuNumber {
    &lt;span style=&quot;color:#0000FF&quot;&gt;get&lt;/span&gt; {
        &lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; wt; &lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; cpt;
        ThreadPool.GetMaxThreads(&lt;span style=&quot;color:#0000FF&quot;&gt;out&lt;/span&gt; wt, &lt;span style=&quot;color:#0000FF&quot;&gt;out&lt;/span&gt; cpt);
        &lt;span style=&quot;color:#0000FF&quot;&gt;return&lt;/span&gt; Math.Max(1, wt / DefaultThreadsPerCpu);
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L&amp;#39;extension method che ho poi definito accetta una sorgente dati sul quale ciclare e un delegate ad una funzione che elabora ogni item ed eventualmente restituisce un risultato:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;static&lt;/span&gt; IEnumerable&amp;lt;tresult&amp;gt; ForEach&amp;lt;IEnumerable&amp;lt;T&amp;gt;, TItem, TResult&amp;gt;
                                   (&lt;span style=&quot;color:#0000FF&quot;&gt;this&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;TItem, TResult&amp;gt; process)
{
{&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Per prima cosa ho ripartito la sorgente in n parti, quante sono le cpu, incrociando gli item. Ad esempio su due core al primo vanno l&amp;#39;item 1,3,5.., al secondo vanno 2,4,6.&lt;/p&gt;

&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; cpuNumber = CpuNumber;

&lt;span style=&quot;color:#008000&quot;&gt;// Elementi da processare per ogni cpu&lt;/span&gt;
IEnumerable&amp;lt;TItem&amp;gt;[] items = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; IEnumerable&amp;lt;TItem&amp;gt;[cpuNumber];
&lt;span style=&quot;color:#008000&quot;&gt;// Semafori di notifica per ogni cpu&lt;/span&gt;
ManualResetEvent[] events = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; ManualResetEvent[cpuNumber];
&lt;span style=&quot;color:#008000&quot;&gt;// Risultati ottenuti per ogni cpu&lt;/span&gt;
IList&amp;lt;TResult&amp;gt;[] results = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; IList&amp;lt;TResult&amp;gt;[cpuNumber];

&lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; itemsPerCpu = (&lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt;)Math.Ceiling(source.Count() / (&lt;span style=&quot;color:#0000FF&quot;&gt;double&lt;/span&gt;)cpuNumber);

&lt;span style=&quot;color:#0000FF&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; x = 0; x &amp;lt; items.Length; x++)
{
    items[x] = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; TItem[itemsPerCpu];
    &lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; cpu = x;
    &lt;span style=&quot;color:#008000&quot;&gt;// Ripartizione incrociata&lt;/span&gt;
    items[x] = source.Where((item, index) =&amp;gt; (index + cpu) % cpuNumber == 0);
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L&amp;#39;uso della variabile interna cpu che semplicemente ricopia x &#232; fondamentale perch&#233; all&amp;#39;atto del consumo di items[] x sarebbe sempre all&amp;#39;ultimo valore. Usando LINQ occorre infatti ricordarsi che l&amp;#39;elaborazione avviene a posteriori, a meno non si chiami un ToList/ToArray.&lt;/p&gt;
&lt;p&gt;A questo punto avvio i thread e aspetto tramite un WaitHandle che questi abbiamo finito di lavorare:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; x = 0; x &amp;lt; items.Length; x++)
{
    &lt;span style=&quot;color:#008000&quot;&gt;// Semaforo di notifica al thread che ha lanciato ForEach&lt;/span&gt;
    events[x] = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; ManualResetEvent(&lt;span style=&quot;color:#0000FF&quot;&gt;false&lt;/span&gt;);
    results[x] = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; List&amp;lt;TResult&amp;gt;(itemsPerCpu);
    Thread t = &lt;span style=&quot;color:#0000FF&quot;&gt;new&lt;/span&gt; Thread(&lt;span style=&quot;color:#0000FF&quot;&gt;delegate&lt;/span&gt;(&lt;span style=&quot;color:#0000FF&quot;&gt;object&lt;/span&gt; i)
    {
        &lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; index = (&lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt;)i;

        &lt;span style=&quot;color:#0000FF&quot;&gt;foreach&lt;/span&gt; (TItem item &lt;span style=&quot;color:#0000FF&quot;&gt;in&lt;/span&gt; items[index])
            results[index].Add(process(item));

        events[index].Set();
    });
    t.Start(x);
}

WaitHandle.WaitAll(events);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I risultati sono un List che poi vengono restituiti, in questo caso non nello stesso ordine della sorgente. Tutto questo per la mia esigenza, ma le variabili possono essere tante, in funzione della sorgente (pu&#242; non essere possibile dividere il carico in quel modo), o del risultato (certi risultati dipendono dai risultati degli altri thread), ma &#232; un inizio. L&amp;#39;uso poi &#232; molto semplice:&lt;/p&gt;
&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;var r = from n &lt;span style=&quot;color:#0000FF&quot;&gt;in&lt;/span&gt; Enumerable.Range(1, 1000)
     select &amp;quot;&lt;span style=&quot;color:#8B0000&quot;&gt;Ciao &lt;/span&gt;&amp;quot; + n;
&lt;span style=&quot;color:#0000FF&quot;&gt;int&lt;/span&gt; l = r.ForEach(s =&amp;gt; s.Length).Sum();&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ/&quot; rel=&quot;tag&quot;&gt;LINQ&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_2.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2487/Parallelizzare-Silverlight-2.0.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2487/Parallelizzare-Silverlight-2.0.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2487.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2487</trackback:ping></entry><entry><title>LINQ to Reflection - Parte tre</title><id>http://blogs.aspitalia.com/ricciolo/post2486/LINQ-Reflection-Parte.aspx</id><updated>2009-04-20T05:17:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2486' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Ho avuto un po' di tempo per fare alcune aggiunte alla libreria che ora &#232; disponibile nel &lt;a href=&quot;http://lab.aspitalia.com/58/MetadataDiffViewer-Differenze-Framework.aspx&quot;&gt;lab&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Ho aggiunto una classe &lt;strong&gt;DTOCopy&amp;lt;Tsource,TTarget&amp;gt;&lt;/strong&gt; che mi permette di memorizzare&amp;#xa0;attraverso un membro statico le propriet&#224; che hanno in comune due classi. L'uso di una classe generica mi permette di avere un meccanismo automatico di cache in funzione delle classi che fanno da source e da target. Lo scopo &#232; creare un extension method &lt;strong&gt;CopyTo&amp;#xa0;&lt;/strong&gt;per copiare i valori da una classe ad un'altra, utile nei DTO:&lt;/p&gt;&lt;p&gt;&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000FF&quot;&gt;class&lt;/span&gt; ProductDTO{&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#0000FF&quot;&gt;public&lt;/span&gt; ProductDTO()&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#0000FF&quot;&gt;public&lt;/span&gt; ProductDTO(Product source)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#008000&quot;&gt;// Copia solo le propriet&amp;#224; che hanno in comune&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; source.CopyTo(this);&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160; public string Description { get; set; }}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Un secondo extension method invece permette di creare un expression linq per un object initializer di una classe DTO. Siccome mi capita spesso di avere un'entit&#224; LINQ to SQL o LINQ to Entities e nell'espressione LINQ voglio avere come risultato una classe DTO, mi son fatto un extension method che mi evita di elencare tutte le propriet&#224; da travasare:&lt;/p&gt;&lt;p&gt;&lt;div class=&quot;codeboxheader&quot;&gt; &lt;/div&gt;&lt;div class=&quot;codebox&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#008000&quot;&gt;// Espressione LINQ per DTOIQueryable&amp;lt;Product,ProductDTO&amp;gt; products = new Product[] { new Product { Description = &amp;quot;ppp&amp;quot; } }.AsQueryable();IEnumerable&amp;lt;ProductDTO&amp;gt; productsDTO = products.SelectDTO&amp;lt;Product,ProductDTO&amp;gt;();&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Decisamente comodo :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_4.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ/&quot; rel=&quot;tag&quot;&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET 3.5"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2486/LINQ-Reflection-Parte.aspx"/><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2486/LINQ-Reflection-Parte.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2486.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2486</trackback:ping></entry><entry><title>Silverlight: performance dell'isolated storage</title><id>http://blogs.aspitalia.com/ricciolo/post2484/Silverlight-Performance-Isolated-Storage.aspx</id><updated>2009-04-16T17:03:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2484' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Durante lo sviluppo del &lt;a href=&quot;http://blogs.aspitalia.com/ricciolo/post2483/metadatadiffviewer-differenze-framework.aspx&quot;&gt;MetadataDiffViewer&lt;/a&gt; ho dovuto ricorrere all'uso dell'Isolated Storage per salvare i metadati in locale e poterli prelevare da disco invece che da remoto. Ho notato per&#242; che le performance, rispetto allo scaricare da un webserver in locale, erano peggiori ed era imputabile a:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;la chiamata a&lt;strong&gt; IsolatedStorageFile.GetUserStoreForApplication/Site&lt;/strong&gt;: &#232; molto costosa, aprendo lo storage una sola volta, dall'inizio alla fine ho guadagnato un 40% di performance; &lt;/li&gt;&lt;li&gt;la lettura dello stream attraverso &lt;strong&gt;IsolatedStorageFileStream&lt;/strong&gt;: &#232; un pi&#249; lenta rispetto ad uno stream in memoria nelle operazioni di accesso randomico. Questo &#232; ovvio visto che va su disco, ma non pensavo cos&#236; tanto. Precaricando il tutto in un MemoryStream e parserizzando poi l'XML con XDocument.Load in un'attivit&#224;, ho guadagnato 3 secondi su 14 e non &#232; poco. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Insomma, occhio a come lo usate.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_2.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_3.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2484/Silverlight-Performance-Isolated-Storage.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2484/Silverlight-Performance-Isolated-Storage.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2484.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2484</trackback:ping></entry><entry><title>MetadataDiffViewer: differenze tra i framework</title><id>http://blogs.aspitalia.com/ricciolo/post2483/MetadataDiffViewer-Differenze-Framework.aspx</id><updated>2009-04-15T16:56:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2483' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;&lt;a href=&quot;http://lab.ricciolo.aspitalia.com/metadatadiffviewer/metadatadiffviewer.html&quot;&gt;MetadataDiffViewer&lt;/a&gt; &#232; un'applicazione in &lt;strong&gt;Silverlight&lt;/strong&gt; che mostra le differenze in termini di assembly/module/type/member tra una versione del .NET Framework e l'altra. Semplicemente mostra alcune informazioni precalcolate per conoscere nel dettaglio cosa c'&#232; di nuovo in una nuova versione.&lt;/p&gt; &lt;p&gt;Ecco uno screenshot:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://blogs.aspitalia.com/img/ricciolo/metadatadiffviewerdifferenzetraiframewor_d943/metadatadiffviewer_4.jpg&quot;&gt;&lt;img title=&quot;metadatadiffviewer&quot; border=&quot;0&quot; alt=&quot;metadatadiffviewer&quot; src=&quot;http://blogs.aspitalia.com/img/ricciolo/metadatadiffviewerdifferenzetraiframewor_d943/metadatadiffviewer_thumb_1.jpg&quot; width=&quot;340&quot; height=&quot;295&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Lo potete provare &lt;a href=&quot;http://lab.ricciolo.aspitalia.com/metadatadiffviewer/metadatadiffviewer.html&quot;&gt;qua&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Non so voi, ma mi d&#224; fastidio essermi perso un nuovo membro. Con questo tool non ci sono pi&#249; scuse :-)&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Come funziona?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ho innanzitutto creato un addin per &lt;strong&gt;Reflector&lt;/strong&gt; cos&#236; da poter esportare i metadati pubblici degli assembly. La reflection classica non permette di caricare pi&#249; versione del framework e in un'ottica continua nel tempo ho deciso di esportare i metadati e tenerli sempre pronti. Una console application poi li compara e crea un file di differenze. I metadati e le differenze sono file XML di discreta dimensione perci&#242;, per non riscaricare tutte le informazioni ogni volta, ho deciso di salvare le informazioni nell'isolated storage. Per tenersi il tutto servono circa 60MB (tranquilli, sono zippati quando si scaricano).&lt;/p&gt; &lt;p&gt;I framework comparati che sono a disposizione sono:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Silverlight 2.0 -&amp;gt; Silverlight 3.0 &lt;/li&gt; &lt;li&gt;.NET Framework 1.1 -&amp;gt; .NET Framework 2.0 &lt;/li&gt; &lt;li&gt;.NET Framework 2.0 -&amp;gt; .NET Framework 3.5 &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Se avete problemi o consigli, &lt;a href=&quot;mailto:cristian@aspitalia.com&quot;&gt;scrivetemi&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_2.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_3.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2483/MetadataDiffViewer-Differenze-Framework.aspx"/><slash:comments>4</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2483/MetadataDiffViewer-Differenze-Framework.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2483.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2483</trackback:ping></entry><entry><title>Documentazione MSDN e versioni del .NET Framework</title><id>http://blogs.aspitalia.com/ricciolo/post2482/Documentazione-MSDN-Versioni-.NET-Framework.aspx</id><updated>2009-04-15T13:23:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2482' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;In questo post qualcosa di poco tecnologico, ma che mi segno per me e magari anche voi, per trovare velocemente la documentazione delle classi. Le versioni del framework sono infatti ormai tante: .NET Framework 1.0 - 1.1 - 2.0 - 3.5 e Silverlight 2.0 - 3.0.&lt;/p&gt;&lt;p&gt;Cercando nei motori di ricerca per esempio system.string probabilmente troveremo il link a:&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;http://msdn.microsoft.com/en-us/library/system.string.aspx&quot; href=&quot;http://msdn.microsoft.com/en-us/library/system.string.aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/system.string.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;che ci porta alla documentazione riferita alla versione attuale: la 3.5.&lt;/p&gt;&lt;p&gt;Mettendo tra parentesi dopo system.string la versione possiamo per&#242; distinguere e forzatamente guardare uno specifico framework. Per Silverlight 3.0 per esempio &#232;:&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;http://msdn.microsoft.com/en-us/library/system.string(vs.96).aspx&quot; href=&quot;http://msdn.microsoft.com/en-us/library/system.string(vs.96).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/system.string(vs.96).aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ecco un riassunto delle versioni:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;vs.71: 1.1 &lt;/li&gt;&lt;li&gt;vs.80: 2.0 &lt;/li&gt;&lt;li&gt;vs.85: 3.0 &lt;/li&gt;&lt;li&gt;vs.90: 3.5 &lt;/li&gt;&lt;li&gt;vs.95: SL 2.0 &lt;/li&gt;&lt;li&gt;vs.96: SL 3.0 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_2.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight_3.0/&quot; rel=&quot;tag&quot;&gt;Silverlight 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Cristian &quot;Ricciolo&quot; Civera</name></author><category term=".NET"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ricciolo/post2482/Documentazione-MSDN-Versioni-.NET-Framework.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2482/Documentazione-MSDN-Versioni-.NET-Framework.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2482.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2482</trackback:ping></entry></feed>