<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET o no .NET, esa es la cuestión : C#</title><link>http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx</link><description>Etiquetas: C#</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Llamando al API de WinRT desde aplicaciones de escritorio normales en C#</title><link>http://geeks.ms/blogs/rfog/archive/2013/02/02/llamando-al-api-de-winrt-desde-aplicaciones-de-escritorio-normales-en-c.aspx</link><pubDate>Sat, 02 Feb 2013 14:09:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:208467</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=208467</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=208467</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2013/02/02/llamando-al-api-de-winrt-desde-aplicaciones-de-escritorio-normales-en-c.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#ff00ff;"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;strong&gt;&lt;span style="font-family:mceinline;"&gt;NOTA IMPORTANTE:&lt;/span&gt;&lt;/strong&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Esta entrada est&amp;aacute; obsoleta porque lo que describo m&amp;aacute;s abajo no funciona tal y como est&amp;aacute; contado. Es un &lt;i&gt;mea culpa&lt;/i&gt;&amp;nbsp;en toda propiedad por no haber probado antes lo que escrib&amp;iacute;a, pero es que la entrada original es bastante cre&amp;iacute;ble.&lt;/p&gt;
&lt;p align="justify"&gt;Eso me llev&amp;oacute; a crear un nuevo art&amp;iacute;culo, esta vez verificado, que se puede leer aqu&amp;iacute;:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 class="title"&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/dn126142.aspx"&gt;Llamando al API de WinRT desde aplicaciones de escritorio normales en C#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;******************************************************&lt;/p&gt;
&lt;p align="justify"&gt;El otro d&amp;iacute;a &lt;a href="https://twitter.com/elrfog/status/297107885199093760"&gt;twite&amp;eacute;&lt;/a&gt; un &lt;a href="http://www.hanselman.com/blog/HowToCallWinRTAPIsInWindows8FromCDesktopApplicationsWinRTDiagram.aspx"&gt;enlace&lt;/a&gt; que ten&amp;iacute;a apuntado por ah&amp;iacute; y que no hab&amp;iacute;a le&amp;iacute;do hasta el momento del twitt, como me pasa con una docena m&amp;aacute;s, que tengo en la lista de encontrar tiempo y tranquilidad para leerlos en detalle.&lt;/p&gt;
&lt;p align="justify"&gt;Y como creo que deber&amp;iacute;a estar en castellano, os voy a contar de qu&amp;eacute; va la cosa.&lt;/p&gt;
&lt;p align="justify"&gt;Todos sabemos que ahora hay dos Windows 8. El tradicional de toda la vida y el RT. A ver, son el mismo, pero a la vez diferentes. El RT es la versi&amp;oacute;n para tabletas, que en teor&amp;iacute;a permite desarrollar usando s&amp;oacute;lo un subconjunto de Win32 y de .NET, pese a que por debajo sigue estando el Windows de toda la vida.&lt;/p&gt;
&lt;p align="justify"&gt;La otra versi&amp;oacute;n es la normal, la del escritorio pleno y funcional a la que estamos acostumbrados, que a su vez usa el API tradicional, ya sea el nativo Win32 o el de .NET. &lt;/p&gt;
&lt;p align="justify"&gt;Y si bien est&amp;aacute; prohibido usar el API completo en las aplicaciones RT, lo contrario no es as&amp;iacute; ya que en el escritorio tenemos plena libertad para utilizar cualquier cosa, incluyendo el API de Windows RT. Lo que ocurre es que el soporte directo para ello est&amp;aacute; ausente en las versiones de Visual Studio.&lt;/p&gt;
&lt;p align="justify"&gt;Pero se puede hacer editando el texto plano del fichero de nuestro proyecto: &amp;lt;proyecto&amp;gt;.csproj. Ah&amp;iacute; dentro debemos a&amp;ntilde;adir las l&amp;iacute;neas&lt;/p&gt;
&lt;p align="justify"&gt;&amp;lt;propertygroup&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;lt;targetplatformversion&amp;gt;8.0&amp;lt;/targetplatformversion&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;lt;/propertygroup&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;Y a partir de ah&amp;iacute;, una vez recargado el mismo, podremos usar el API de Windows RT con s&amp;oacute;lo a&amp;ntilde;adir las referencias adecuadas seg&amp;uacute;n se vayan necesitando. El mayor problema es que tenemos que saber cu&amp;aacute;les son y a&amp;ntilde;adirlas a mano.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image001_5F00_14CC9A47.png"&gt;&lt;img height="98" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image001_5F00_thumb_5F00_7AF86417.png" alt="clip_image001" border="0" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;display:inline;" title="clip_image001" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image003_5F00_6C4DB832.jpg"&gt;&lt;img height="141" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image003_5F00_thumb_5F00_5FDF9509.jpg" alt="clip_image003" border="0" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;display:inline;" title="clip_image003" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208467" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx">Win32</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+RT/default.aspx">Windows RT</category></item><item><title>Workaround para Windows Phone ListBox/LongListSelector y ScrollIntoView() cuando los elementos tienen diferente tamaño</title><link>http://geeks.ms/blogs/rfog/archive/2013/01/11/workaround-para-windows-phone-listbox-longlistselector-y-scrollintoview-cuando-los-elementos-tienen-diferente-tama-241-o.aspx</link><pubDate>Fri, 11 Jan 2013 13:34:35 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:208210</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=208210</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=208210</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2013/01/11/workaround-para-windows-phone-listbox-longlistselector-y-scrollintoview-cuando-los-elementos-tienen-diferente-tama-241-o.aspx#comments</comments><description>&lt;h3 align="justify"&gt;&lt;font style="font-weight:normal;"&gt;En Windows Phone 7.5 hay un bug bastante asqueroso que sólo se presenta cuando quieres mostrar un elemento en un &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;ListBox&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt; o en un &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;LongListSelector&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt; llamando a &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;ScrollIntoView()&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt; y los elementos contenidos tienen diferentes tamaños. El bug también está presente en Windows Phone 8, pero sólo en el componente &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;ListBox&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt;. &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;LongListSelector&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt; está construido de otra forma y, según Microsoft, ya no presenta el problema.&lt;/font&gt;&lt;/h3&gt;  &lt;p align="justify"&gt;Como es habitual en la empresa, y aparte de ser un problema conocido desde hace tiempo, no se va a solucionar. Personalmente podría entender que no se haga en las versiones actuales ya que requeriría que luego los fabricantes reconstruyeran sus propias plataformas, pero me resulta completamente inaceptable que siga estando en el nuevo Windows Phone 8, y encima conociéndolo de antemano.&lt;/p&gt;  &lt;p align="justify"&gt;En fin, es lo que hay, y encima tampoco existe ningún &lt;i&gt;workaround&lt;/i&gt; oficialmente sancionado para resolver el problema. En otras palabras, si tienes un programa en el que te ocurre eso, básicamente te jodes y bailas.&lt;/p&gt;  &lt;p align="justify"&gt;Pero no, aquí está RFOG que te va a sacar las castañas del fuego. Como sabéis llevo unos meses currando en &lt;a href="https://d.docs.live.net/f1c8bb586bc9f3b9/Blogs/yuilop.com"&gt;Yuilop&lt;/a&gt; para Windows Phone, y también debéis saber que me toca mucho las narices que te digan &lt;i&gt;eso no se puede hacer&lt;/i&gt; y similares. Y por supuesto, a tu jefe tampoco le agrada mucho que le digas: &lt;i&gt;es un bug y no tiene solución&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Para descargo propio he de deciros que la solución es un poco chorra y que sólo había que pensar un poco, pero tenéis que reconocerme que debo de darme algo de bombo y platillo.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Bueno, ahora la parte técnica. &lt;/p&gt;  &lt;p align="justify"&gt;En el ejemplo que anexo más abajo, cuando se pulsa el botón de &lt;i&gt;Insert…&lt;/i&gt; se genera un elemento de tres posibles mediante Code Behind. Los tres tienen como elemento base un &lt;i&gt;Grid&lt;/i&gt;, pero el interior es diferente y por tanto su altura. Dos de ellos contienen una imagen y el tercero, un texto. &lt;/p&gt;  &lt;p align="justify"&gt;En cada elemento creado, se llama a &lt;i&gt;ScrollIntoView()&lt;/i&gt; sobre el citado, para que se visualice adecuadamente.&lt;/p&gt;  &lt;p align="justify"&gt;Conforme vamos creando elementos, llega un momento en el que uno de ellos se queda cortado a medias como en la captura:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image001_5F00_69D0AB4B.png"&gt;&lt;img title="clip_image001" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image001" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image001_5F00_thumb_5F00_3D477B65.png" width="132" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;El comportamiento adecuado debería ser que se mostrara completo, mostrando la parte inferior. Ese es el problema: cuando los elementos tienen diferente altura, termina ocurriendo esto mismo. Y según Microsoft, no se va a solucionar. Las apuestas suben cuando hay campos de edición y cambios de orientación: con total seguridad te quedará el elemento cortado.&lt;/p&gt;  &lt;p align="justify"&gt;El código que genera los elementos es:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Button_Tap(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, GestureEventArgs e)
        {
            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (s_rnd.Next(0,3))
            {
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 0:
                    var itemText = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemText(&lt;span class="str"&gt;&amp;quot;Hola mundo&amp;quot;&lt;/span&gt;);
                    ListBox.Items.Add(itemText); 
                    ListBox.ScrollIntoView(itemText);
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 1:
                    var itemImgBien = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemImage(StaticResources.ImageBien);
                    ListBox.Items.Add(itemImgBien);
                    ListBox.ScrollIntoView(itemImgBien);
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 2:
                    var itemImgMal = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemImage(StaticResources.ImageMal);
                    ListBox.Items.Add(itemImgMal);
                    ListBox.ScrollIntoView(itemImgMal);
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            }
        }&lt;/pre&gt;


&lt;p align="justify"&gt;Fijaos en el detalle. Dependiendo de un número aleatorio creamos uno de tres. Eso debería funcionar bien, pero como podéis comprobar vosotros en vuestra casa, no lo hace en el momento en el que empiezan a aparecer elementos con el texto y con una de las dos imágenes.&lt;/p&gt;

&lt;p align="justify"&gt;***&lt;/p&gt;

&lt;p align="justify"&gt;Como ya os he dicho, la solución es bastante sencilla. Os pego el código:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ButtonNoBug_Tap(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, GestureEventArgs e)
        {
            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (s_rnd.Next(0, 3))
            {
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 0:
                    var itemText = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemText(&lt;span class="str"&gt;&amp;quot;Hola mundo&amp;quot;&lt;/span&gt;);
                    ListBox.Items.Add(itemText);
                    ForceScrollListBox();
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 1:
                    var itemImgBien = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemImage(StaticResources.ImageBien);
                    ListBox.Items.Add(itemImgBien);
                    ForceScrollListBox();
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 2:
                    var itemImgMal = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemImage(StaticResources.ImageMal);
                    ListBox.Items.Add(itemImgMal);
                    ForceScrollListBox();
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            }
        }&lt;/pre&gt;


&lt;p align="justify"&gt;Y el truco del almendruco:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ForceScrollListBox()
        {
            var fake = &lt;span class="kwrd"&gt;new&lt;/span&gt; Grid();
            ListBox.Items.Add(fake);
            ListBox.ScrollIntoView(fake);
        }&lt;/pre&gt;


&lt;p align="justify"&gt;Sí, señores. El truco consiste en crear un nuevo elemento del mismo tipo base pero completamente vacío, añadirlo y llamar a &lt;i&gt;ScrollIntoView()&lt;/i&gt; sobre él. El uso de memoria es mínimo porque el componente no debe ocupar muchos bytes ya que está vacío, y tampoco se visualiza, pero en general el sistema &lt;i&gt;empuja&lt;/i&gt; hacia arriba al elemento que queremos mostrar.&lt;/p&gt;

&lt;p align="justify"&gt;No obstante, creo haber detectado que no siempre funciona, al menos en el emulador, pero de momento la gente de QA de &lt;a href="https://d.docs.live.net/f1c8bb586bc9f3b9/Blogs/yuilop.com"&gt;Yuliop&lt;/a&gt; todavía no me ha protestado. [Aplausos de fondo].&lt;/p&gt;

&lt;p align="justify"&gt;En el ejemplo tenéis tres botones. En el primero hacemos inserciones con el bug, en el segundo sin él y con el tercero corregimos si tenemos un elemento a medio mostrar o nos vamos abajo del todo si estamos a medias.&lt;/p&gt;

&lt;p align="justify"&gt;Finalmente, el código fuente de todo esto está aquí: &lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="https://github.com/rfog/InsertInListboxproblem_Solution"&gt;https://github.com/rfog/InsertInListboxproblem_Solution&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Sed buenos y hasta otra.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208210" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>Repetid conmigo mil veces:</title><link>http://geeks.ms/blogs/rfog/archive/2012/12/18/repetid-conmigo-mil-veces.aspx</link><pubDate>Tue, 18 Dec 2012 15:26:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207838</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=207838</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=207838</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/12/18/repetid-conmigo-mil-veces.aspx#comments</comments><description>&lt;p&gt;Los elementos del &lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un &lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con &lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los elementos del&amp;nbsp;&lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un&amp;nbsp;&lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con&amp;nbsp;&lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;Los elementos del&amp;nbsp;&lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un&amp;nbsp;&lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con&amp;nbsp;&lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;Los elementos del&amp;nbsp;&lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un&amp;nbsp;&lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con&amp;nbsp;&lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;Los elementos del&amp;nbsp;&lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un&amp;nbsp;&lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con&amp;nbsp;&lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;div&gt;...&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;O en otras palabra, cuando uses el modelo MVVM (al menos en Windows Phone) los elementos de &lt;i&gt;binding&lt;/i&gt;&amp;nbsp;en la plantilla de datos deben ser propiedades aunque sean del tipo gen&amp;eacute;rico.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Es decir en&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ListBox&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ListBox.ItemTemplate&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;DataTemplate&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Grid Margin=&amp;quot;10&amp;quot;&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;RowDefinition /&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;RowDefinition /&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;TextBlock Text=&amp;quot;{Binding Name}&amp;quot; Grid.Row=&amp;quot;0&amp;quot; FontWeight=&amp;quot;Bold&amp;quot; FontSize=&amp;quot;20&amp;quot;/&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;TextBlock Text=&amp;quot;{Binding Surname}&amp;quot; Grid.Row=&amp;quot;1&amp;quot; FontSize=&amp;quot;10&amp;quot;/&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/DataTemplate&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ListBox.ItemTemplate&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ListBox&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;tanto Name como Number deben ser propiedades y p&amp;uacute;blicas.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Me da igual si est&amp;aacute; documentado en alg&amp;uacute;n lado o no, pero me ha costado sudores darme cuenta. El objeto que se va a enlazar en la colecci&amp;oacute;n puede ser una clase o una estructura, pero debe ser p&amp;uacute;blica s&amp;iacute; o s&amp;iacute;.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Ya os imagin&amp;aacute;is por qu&amp;eacute; estoy poniendo esta entrada, &amp;iquest;no? :-P&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207838" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>Cross Threading en MVVM y Windows Phone 8 (y también 7)</title><link>http://geeks.ms/blogs/rfog/archive/2012/12/05/cross-threading-en-mvvm-y-windows-phone-8-y-tambi-233-n-7.aspx</link><pubDate>Wed, 05 Dec 2012 10:42:07 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207697</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=207697</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=207697</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/12/05/cross-threading-en-mvvm-y-windows-phone-8-y-tambi-233-n-7.aspx#comments</comments><description>&lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Os cuento una rápida que seguro os va a solucionar un montón de quebraderos de cabeza y que me ha traído loco un rato hasta que me he dado cuenta del pufo.&lt;/p&gt;  &lt;p align="justify"&gt;Todo viene cuando estás usando el patrón MVVM y varías algún dato que se está mostrando en algún componente visual. Todos los tutoriales te dicen que heredes de &lt;i&gt;ObservableCollection&lt;/i&gt; y que implementes el método &lt;i&gt;NotifyPropertyChanged()&lt;/i&gt;. Y te ponen el típico ejemplo:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; NotifyPropertyChanged([CallerMemberName] &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)
{
    var handler = PropertyChanged;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;null&lt;/span&gt; != handler)
    {
      handler(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName));
    }
}&lt;/pre&gt;


&lt;p align="justify"&gt;Hasta aquí nada extraño. Cuando una propiedad cambia su valor, quien quiera que esté observando tu colección se enterará del mismo y actuará en consecuencia. Eso si alguien está observando tu colección, que no siempre ocurre, sobre todo si hay algún &lt;i&gt;converter&lt;/i&gt; de por medio (ya hablaré largo y tendido sobre esto).&lt;/p&gt;

&lt;p align="justify"&gt;Pero el problema viene cuando ese cambio se produce fuera del hilo principal de la aplicación, como suele pasar a poco que estés haciendo algo medianamente serio. No veo yo bloqueando tu aplicación mientras un servicio web o lo que sea se baja lo que se tenga que bajar, aparte de que en Windows Phone la mayoría de llamadas a todo eso son asíncronas.&lt;/p&gt;

&lt;p align="justify"&gt;Si haces un cambio en un hilo que no sea el de la UI, en Windows Phone 7.5 no pasa nada. Simplemente se ejecuta el código y en general tu colección cambia de valor y a veces, sólo a veces, la visualización cambiará. O no.&lt;/p&gt;

&lt;p align="justify"&gt;En Windows Phone 8 ocurre otra cosa no muy diferente. Recibes dos &lt;i&gt;first chance&lt;/i&gt; de dos excepciones diferentes, el IDE no te captura nada a no ser que cambies la configuración de captura de excepciones y el hilo en el que se esté ejecutando el código se muere silenciosamente. Y por supuesto no se cambia nada en la parte visual de tu aplicación.&lt;/p&gt;

&lt;p align="justify"&gt;Vale. Tonto si no pones un bloque &lt;i&gt;try/catch&lt;/i&gt; en cada hilo. Pero aquí estamos hablando de otro combate.&lt;/p&gt;

&lt;p align="justify"&gt;¿Cómo puñetas puedo actualizar eso de forma automática? Es decir, ¿tengo que hacer un &lt;i&gt;BeginInvoke()&lt;/i&gt; cada vez que asigne algo? La respuesta corta es que sí. La larga es lo siguiente.&lt;/p&gt;

&lt;p align="justify"&gt;Primero tienes que crearte una propiedad nueva en la clase App que vas a llamar &lt;i&gt;UiDispatcher&lt;/i&gt; (o como te salga de los OO):&lt;/p&gt;

&lt;p align="justify"&gt;internal static Dispatcher UiDispatcher=Current.RootVisual.Dispatcher;&lt;/p&gt;

&lt;p align="justify"&gt;Y luego cambia el código de arriba por el siguiente:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; NotifyPropertyChanged([CallerMemberName] &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)
        {
            var handler = PropertyChanged;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;null&lt;/span&gt; != handler)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (App.UiDispatcher.CheckAccess())
                    handler(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName));
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                    App.UiDispatcher.BeginInvoke(() =&amp;gt; handler(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName)));
            }
        }  &lt;/pre&gt;


&lt;p align="justify"&gt;Ahora, si os fijáis, si el cambio de vuestra propiedad se realiza dentro del hilo principal, se llamará directamente, y si lo hace desde otro lo hará dentro del &lt;i&gt;Dispatcher&lt;/i&gt; de la UI.&lt;/p&gt;

&lt;p align="justify"&gt;¿Por qué una propiedad y no llamar siempre a &lt;i&gt;Current.RootVisual.Dispatcher&lt;/i&gt;? Pues porque podría interesarnos tener diferentes &lt;i&gt;dispatchers&lt;/i&gt; para otras cosas, pero esa es otra guerra que hay que combatir en otro momento. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207697" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/tips/default.aspx">tips</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>ReSharper para Visual Studio</title><link>http://geeks.ms/blogs/rfog/archive/2012/11/17/resharper-para-visual-studio.aspx</link><pubDate>Sat, 17 Nov 2012 12:55:10 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207457</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=207457</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=207457</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/11/17/resharper-para-visual-studio.aspx#comments</comments><description>&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Esta es una historia un tanto extraña porque ni en mis más locos sueños hubiera yo decidido usar este complemento en Visual Studio. No porque no me guste la empresa, ni porque piense que el producto sea malo.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Simplemente porque no soy yo mucho de añadir complementos a mi herramienta de trabajo más allá de las cosas imprescindibles, más que nada porque los tiempos de carga se alargan en extremo, y la estabilidad de Visual Studio decae en picado.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Por ejemplo, si ya la versión 2010 de VS anda algo inestable, con vahídos extraños, cuando le añades el SDK de Windows Phone la cosa empeora y te encuentras con que a veces el compilador se encuentra errores fantasma que sólo él ve, o simplemente el IDE se queda autista.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Añádele alguna herramienta más y eres un firme candidato a lanzar tu ordenador por la ventana y dedicarte a criar setas en el sótano de tu abuelo.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Sin embargo Visual Studio 2012 parece más estable, y he estado como dos semanas usándolo sin que hiciera cosas raras, incluso tras añadirle el citado SDK, que es imprescindible para mi en estos momentos.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;De repente a un compañero que trabaja en la aplicación de Java de mi empresa le compraron el &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt; y comenzó a comentar las bondades del producto y cómo había pasado de desesperarse y tirarse de los pelos con la cosa esa del Eclipse a tener un IDE en condiciones.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Eso me llevó a recordar que cuando asisto a alguna charla virtual suelen regalar un ReSharper a los asistentes… y una cosa me llevó a la otra, y es que la envidia es tiñosa, y muy mala malosa, y yo soy el peor de todos. Por lo tanto entré en la web de &lt;a href="http://www.jetbrains.com/index.html"&gt;JetBrains&lt;/a&gt; y me bajé el &lt;a href="http://www.jetbrains.com/resharper/"&gt;producto&lt;/a&gt; en su &lt;a href="http://www.jetbrains.com/resharper/download/index.html"&gt;versión demo&lt;/a&gt; de treinta días y…&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;¡¡MADRE DEL AMOR HERMOSO!!&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;¡Como alguien me quite el producto me lo como con ropa y todo! ¿Cómo he podido vivir yo sin eso?&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;A ver, que no estoy exagerando ni mucho menos. El producto cuesta sus pelas, pero os aseguro que las vale. Ahora que estoy desarrollando en C# porque no tengo más cojones, se me ha hecho prácticamente indispensable y eso que lo llevo usando tan sólo unas dos semanas.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Os cuento lo que hace. Y ya me conocéis, que yo no me caso con nadie y no tengo pelos en la lengua.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;ReSharper es una extensión a Visual Studio (creo que soportan todas las versiones del producto desde la 2003 menos las Express). En mi caso lo instalé en mi Visual Studio Ultimate de la MSDN.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Lo que hace el producto es ayudarte a teclear código, pero a todos los niveles. Hay que verlo para creerlo. Cuando está instalado lo que más llama la atención es que te coloca una tira vertical al lado derecho de la ventana de edición, similar a la de la derecha en donde pones los breakpoints, bookmarks y el IDE te marca el código modificado.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;En esa columna te coloca una serie de rayitas horizontales de colorines. Rojo para los errores. Naranja para las mejoras (ahora os cuento), verde para las sugerencias. Creo que hay más colores, pero en este momento no me acuerdo (son las cosas de estar tirado en el sofá tecleando en mi MacBook). Arriba del todo hay una marca global que te dice el &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Cuando posas el ratón sobre la rayita, te dice de qué va la cosa, y si haces clic te lleva al código fuente en cuestión. &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Y aquí es donde viene lo interesante. Te ofrece la mejora o la solución, y si le dices que sí, te lo corrige. &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Pero os aseguro que es algo terrorífico. Hay cosas más o menos chorras, como cambiar un tipo por una variable automática, pero otras dan miedo.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Es capaz de cambiar tus bucles for o foreach por sentencias LINQ. Con eso ya os lo he dicho todo. A mi al menos eso me da mucho miedo. Del bueno, ojo. Que coja tres bucles anidados y te los convierta en una sentencia LINQ de una línea me deja embobado.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Peor hay más. Simplifica los operadores lambda, te transforma bloques de código en otros menos agresivos con la aplicación, te formatea el código, te ofrece lo que vas a escribir a continuación…&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;No sé, cada vez que hago algo nuevo me sorprendo por las posibilidades que te ofrece. Otra de las cosas que me trae loco es que es capaz de eliminar código redundante, como la creación de delegados o la eliminación de código redundante.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Os pongo un ejemplo que me dejó todo loco.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Yo solía poner sentencias del tipo:&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Debug.WriteLine(String.Format(“bla bla {0} bla bla {1}”,a.Hola,a.Adios));&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Pues bien, él me sugiere&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Debug.WriteLine(“bla bla {0} bla bla {1}”,a.Hola,a.Adios);&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Vale. Tú lo sabes. Yo no lo sabía hasta que no me lo ofreció ReSharper. Y así con muchas cosas más, pero lo que de verdad me admira son las transformaciones a LINQ y viceversa. No me canso de repetirlo. Bucles a LINQ. Bucles a LINQ.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;También tiene soporte en XAML. Es decir, editar XAML pasa de ser una pesadilla a ser bastante mejor. Si tu usas Blend, mejor para ti. Yo la última vez que intenté hacer algo con el producto terminé hasta la coronilla. Entre excepciones y la *** manía de ponerle márgenes hasta a su madre… Pues bien, con ReSharper editar a mano XAML también mejora la cosa.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Refactoring. Todo lo que te puedas imaginar y más. Si añadimos las reglas para estilo de código, te detecta las variables y los métodos que no lo siguen, ofreciéndote cambiarlos si así lo deseas. Y es una cosa a la que vas a decir que sí, porque esas rayitas naranjas no molan nada, y que no te las vea el jefe… :-P&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Lo dicho, en cuanto te sales de las guías de estilo el producto no solo te lo dice sino que te ofrece la posibilidad de cambiarlo. Por supuesto puedes definir las tuyas, no las que el programa quiera. &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Como abras la pantalla de opciones te vas a caer de culo, porque puedes configurar cualquier cosa. Por tener hasta tienes “juegos de configuración”, pudendo cargar la que quieras cuando quieras, por si tienes un proyecto con unas reglas y otro con otras.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;También tiene algunas chorradillas (es un decir) interesantes, como que te pinta una raya de color debajo de un número que represente un código ARGB, por poner un ejemplo. Son cosas que no se echan en falta hasta que no las tienen y luego te las quitan.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Ya para terminar comentaros los Find Usages. Algo así como Find all references pero con muchos esteroides. Pones el cursor sobre un símbolo, le das a la opción con el botón derecho del ratón y goza. Así he encontrado un par de problemas serios de sincronización que me tenían todo loco, y encima en un rato de nada.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Opciones que no he probado han sido la de limpiar el código de toda la solución de una tacada y otras que seguro se me escapan.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Bueno, pues lo dicho, si quieres aumentar tu productividad de forma bastante seria, prueba el producto. Seguro que luego pasas por caja. Y si entráis en la Web de JetBrains podréis ver capturas de pantallas y algún vídeo enseñando lo que es capaz de hacer.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207457" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/licencias/default.aspx">licencias</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>Viendo el código fuente de .NET con Visual Studio 2012</title><link>http://geeks.ms/blogs/rfog/archive/2012/09/15/viendo-el-c-243-digo-fuente-de-net-con-visual-studio-2012.aspx</link><pubDate>Sat, 15 Sep 2012 11:19:14 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206758</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=206758</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=206758</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/09/15/viendo-el-c-243-digo-fuente-de-net-con-visual-studio-2012.aspx#comments</comments><description>&lt;p&gt;Quien tenga una versión anterior de Visual Studio seguro que sabe que se puede navegar por las tripas de .NET y ver cómo Microsoft ha implementado todo el tema. Pues bien, más o menos a &lt;a href="http://blogs.msdn.com/b/dotnet/archive/2012/08/15/announcing-the-release-of-net-framework-4-5-rtm-product-and-source-code.aspx"&gt;mediados de agosto del corriente&lt;/a&gt; (2012) se anunció la disponibilidad del código fuente de .NET 4.5, lo que nos permite meternos en las tripas del Framework y, lo que es mucho más interesante, mirar cómo funciona todo lo nuevo relacionado con Windows 8.&lt;/p&gt;  &lt;p&gt;El artículo citado da un somero repaso a las novedades no específicas de la biblioteca, entre las que se pueden destacar el añadido de métodos asíncronos en conjunción con las clases de tareas, y que ahora el &lt;i&gt;jitter&lt;/i&gt; es capaz de optimizar el código para los procesadores multinúcleo. También se mejora el rendimiento de casi todo (como siempre dicen, lo que a veces no es cierto), y se potencia el acceso de .NET a nueva parte nativa de Windows 8 (o RT o Metro o como quieras llamarlo), que es código nativo escrito en C++ y C++/CX, permitiendo a este lenguaje acceder, también, a código escrito en otros lenguajes .NET gracias a su parte CX (que como ya he dicho varias veces, es nativa).&lt;/p&gt;  &lt;p&gt;Como en otras versiones, el código fuente está disponible para &lt;a href="http://referencesource.microsoft.com/netframework.aspx"&gt;descarga directa&lt;/a&gt;, o para ser visto desde nuestro propio código, y también como símbolos de depuración.&lt;/p&gt;  &lt;p&gt;La captura de abajo nos muestra una aplicación Metro por defecto, detenida en un punto de interrupción, tal y como se ve en mi Visual Studio 2012 sin cambiar la configuración por defecto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image002_5F00_2B0EE603.jpg"&gt;&lt;img title="clip_image002" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="clip_image002" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image002_5F00_thumb_5F00_084DAE46.jpg" width="244" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Fijaos en que la ventana de &lt;i&gt;Call Stack&lt;/i&gt; estgá prácticamente vacía, y si hacemos &lt;i&gt;Step Into&lt;/i&gt; simplemente saltamos a la siguiente línea de nuestro código fuente.&lt;/p&gt;  &lt;p&gt;Vamos a habilitar la posibilidad de meternos dentro del código de Microsoft.&lt;/p&gt;  &lt;p&gt;Nos vamos a TOOLS -&amp;gt; PROPERTIES, abrimos la pestaña lateral de &lt;i&gt;Debugging&lt;/i&gt;, y cambiamos las siguientes opciones:&lt;/p&gt;  &lt;p&gt;· Marcar &lt;i&gt;Enable Just My Code&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Marcar &lt;i&gt;Enable .NET Framework source stepping&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Desmarcar &lt;i&gt;Step over porperties and operators (Managed only)&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Marcar &lt;i&gt;Enable source server support&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Desmarcar &lt;i&gt;Require source files to exactly match the original version&lt;/i&gt;.&lt;/p&gt;  &lt;p&gt;Dejadlo todo más o menos como en la imagen:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image003_5F00_0A1E040D.png"&gt;&lt;img title="clip_image003" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="clip_image003" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image003_5F00_thumb_5F00_675CCC4F.png" width="244" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ahora, en la pestaña de &lt;i&gt;Symbols&lt;/i&gt;, hay que añadir una nueva dirección de descarga de los mismos: &lt;a href="http://referencesource.microsoft.com/symbols"&gt;http://referencesource.microsoft.com/symbols&lt;/a&gt;. Como en la capura.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image004_5F00_0BF0EA85.png"&gt;&lt;img title="clip_image004" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="clip_image004" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image004_5F00_thumb_5F00_1DD00F03.png" width="244" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Finalmente, cuando le deis a OK el IDE se quedará bajando ficheros. Hay que esperar a que termine, y dependiendo de lo rápida que sea tu conexión, tendrás que esperar bastante tiempo.&lt;/p&gt;  &lt;p&gt;Con esta configuración, cada vez que se necesite algo, el IDE irá a los servidores de Microsoft, por lo que la carga y depuración de vuestro programa podría ser muy lenta a veces… por lo que se pueden bajar todos los símbolos de una tacada e instalarlos de forma local, apuntando la URL anterior a done los hayamos instalado. Podéis bajarlos de &lt;a href="http://referencesource.microsoft.com/netframework.aspx"&gt;aquí&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;La siguiente captura muestra algo de las tripas de Metro:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image006_5F00_2D0677D0.jpg"&gt;&lt;img title="clip_image006" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="clip_image006" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image006_5F00_thumb_5F00_25E9CC09.jpg" width="244" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vale. Ahora el tío de la rebaja. ¿Habéis intentado profundizar en el código fuente, en métodos como el &lt;i&gt;Activate()&lt;/i&gt; de la primera captura? No entra, ¿verdad? No muestra código fuente, sino que simplemente salta sobre la llamada.&lt;/p&gt;  &lt;p&gt;Un gallinfante a quien adivine por qué es. &lt;/p&gt;  &lt;p&gt;Vale: es código nativo. Es decir, la parte Metro del .NET Framework no es código manejado, sino nativo. Es decir, está escrita en C++/CX, en donde la parte CX actúa como &lt;i&gt;Sugar Syntax&lt;/i&gt; de todo el perifostio COM y COM+ que finalmente es .NET&lt;/p&gt;  &lt;p&gt;Y todavía me atrevería a añadir algo más. Metro esconde en la manga algunos trucos de desarrollo que a MS no le interesa que se sepan, y ya visteis &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/06/05/ingenier-237-a-inversa-de-una-aplicaci-243-n-metro-m-225-s-f-225-cil-que-nunca.aspx"&gt;lo fácil que es hacer ingeniería inversa de una aplicación .NET&lt;/a&gt;. Si toda esa parte hubiera estado hecha con .NET, sería facilísimo meterle mano.&lt;/p&gt;  &lt;p&gt;¡Y qué cojones, donde esté C++ que se quite cualquier lenguajucho de mala muerte! ;-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206758" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx">C++/CX</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category></item><item><title>No puedo editar las propiedades en XAML ("Property editing not available")</title><link>http://geeks.ms/blogs/rfog/archive/2012/09/11/no-puedo-editar-las-propiedades-en-xaml-quot-quot-property-editing-not-available-quot.aspx</link><pubDate>Tue, 11 Sep 2012 09:55:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206705</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=206705</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=206705</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/09/11/no-puedo-editar-las-propiedades-en-xaml-quot-quot-property-editing-not-available-quot.aspx#comments</comments><description>&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;Ayer me pas&amp;oacute; algo muy curioso con Visual Studio 2010SP1, y es que, de repente, el editor XAML se qued&amp;oacute; tonto del todo y la ventana para editar las propiedades dijo que &amp;ldquo;&lt;em&gt;Property editing not available&lt;/em&gt;&amp;rdquo;&amp;hellip; y ah&amp;iacute; se qued&amp;oacute; el jod&amp;iacute;o, ense&amp;ntilde;ando ese texto y nada m&amp;aacute;s.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;Y no, no estaba experimentando ni haciendo ninguna guarrer&amp;iacute;a con el editor. De hecho estaba tecleando c&amp;oacute;digo en un &lt;em&gt;BackgroundWorker&lt;/em&gt; que nada tiene que ver con la interfaz, y menos con la ventana (perd&amp;oacute;n, &lt;em&gt;Page&lt;/em&gt;, que ahora ando con esto del Windows Phone) que fall&amp;oacute;.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;La cosa era muy curiosa, porque el editor XAML funcionaba bien, y si dejabas caer alg&amp;uacute;n componente sobre la ventana este se a&amp;ntilde;ad&amp;iacute;a sin problemas. Lo que no funcionaba era la ventana de propiedades.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;En &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/513755/property-editing-not-available-when-editing-xaml-of-silverlight-business-application-in-vb-net"&gt;&lt;em&gt;Connect&lt;/em&gt; hay recogido un bug&lt;/a&gt; que se supone fue solucionado en la RTM, pero yo acabo de comprobar que no ha sido as&amp;iacute;. Quiz&amp;aacute;s hayan rebajado un poco la incidencia, pero sigue ah&amp;iacute;.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;De nuevo quiero reiterar que no toqu&amp;eacute; nada. Estaba en una ventana editando c&amp;oacute;digo e hice clic sobre la que mostraba el &lt;em&gt;Page&lt;/em&gt;, dividida entre XAML y parte visual. Al redibujarse, el &lt;em&gt;Page&lt;/em&gt; dio un salto &amp;eacute;l solo, pasando de 80% a 100% y todo dej&amp;oacute; de funcionar.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;En el citado enlace se dan varias soluciones, que a mi no me funcionaron. Incluso cerr&amp;eacute; y abr&amp;iacute; el IDE, recompil&amp;eacute;, volv&amp;iacute; a abrir todas las ventanas&amp;hellip; Nada.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;Lo &amp;uacute;nico que solvent&amp;oacute; el tema fue limpiar la soluci&amp;oacute;n, cerrando el IDE inmediatamente despu&amp;eacute;s. Al abrirlo de nuevo, aparecieron un par de &lt;em&gt;warnings&lt;/em&gt; y &lt;em&gt;errores&lt;/em&gt; sin mucho sentido en relaci&amp;oacute;n a dicho &lt;em&gt;Page&lt;/em&gt;. Una vez reconstruida la soluci&amp;oacute;n, todo volvi&amp;oacute; a la normalidad.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;Lo dicho, aviso para navegantes y c&amp;oacute;mo lo solucion&amp;eacute; yo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206705" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>Multiplataforma de la buena (mismo código fuente)</title><link>http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx</link><pubDate>Tue, 03 Jul 2012 18:32:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205955</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205955</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205955</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Antes de empezar, y de que me deis ca&amp;ntilde;a de la buena, quiero decir que todo esto son elucubraciones personales m&amp;iacute;as y que lo m&amp;aacute;s seguro nadie est&amp;eacute; de acuerdo conmigo. Dicho esto, vamos al meollo del asunto.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ya sab&amp;eacute;is que me he ido distanciando un poco de la plataforma Windows a la vez que me he acercado a la de Apple sin realizar el cambio total. De Linux no quiero hablar, porque cada vez que tengo que hacer algo con &amp;eacute;l, sudo tinta china y al final, tras muchos cabezazos, suelo terminar desistiendo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo &amp;uacute;ltimo fue compilar el SDK de lector del libros electr&amp;oacute;nicos Boox i62HD. Tras instalar una Debian 6 x86 virtual en vmWare Fusion (el Workstation del MAC) por segunda vez, ya que la primera fall&amp;oacute; estrepitosamente porque el instalador s&amp;iacute; que reconoci&amp;oacute; el discos duro SCSI pero luego el kernel instalado no, fui incapaz de compilarlo.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Primero me encontr&amp;eacute; con una serie de paquetes que no estaban presentes y que el comprobador del SDK no avis&amp;oacute; que faltaban, lo que te obliga a recorrer la cadena de errores para descubrir que te falta esto o aquello.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo &amp;uacute;ltimo, y que todav&amp;iacute;a est&amp;aacute; sin solucionar, es que falta una dependencia en un fichero de proyecto, en concreto incluir &amp;ldquo;-l z&amp;rdquo; en el lugar correcto, que es enlazar con la biblioteca zlib. En mi caso el problema no es saber qu&amp;eacute; falta, sino d&amp;oacute;nde a&amp;ntilde;adirlo. Tras varios intentos infructuosos y muchas p&amp;aacute;ginas de internet le&amp;iacute;das, no consegu&amp;iacute; solucionarlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Hab&amp;iacute;a un bug similar si instalabas el SDK en un linux x64, pero el m&amp;iacute;o era x86, y el parche existente intentaba modificar ficheros que no existen (al menos en mi instalaci&amp;oacute;n).&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pues bien, ni me han hecho ni *** caso ni tampoco lo han solucionado, lo que me lleva a preguntarme c&amp;oacute;mo cojones est&amp;aacute;n programando. Y menos mal que us&amp;eacute; una Debian, que es la misma distribuci&amp;oacute;n que usan los que han creado el SDK, que si llego a instalarme otra cosa&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto es un ejemplo de la desidia reinante en Linux. Lo dije en un foro hace tiempo. Los programadores de linux me parecen muy poco profesionales, tendentes a montar cualquier cosa que les parezca &lt;em&gt;c00l&lt;/em&gt; y luego, cuando viene la hora de la verdad y demostrar que se es un programador con dos cojones, pasan del tema porque eso de solucionar bugs ya no es tan fascinante como lo otro, y encima solventar cualquier cosa son un mont&amp;oacute;n de horas en las que no estamos subiendo nuestra supuesta &lt;em&gt;cach&amp;eacute; c00l&lt;/em&gt; en la comunidad.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte de deleznable, me parece una pr&amp;aacute;ctica muy poco seria y que sigue dejando a Linux como lo que es: o bien un juguete para ni&amp;ntilde;os falsamente &lt;em&gt;interesantes&lt;/em&gt;, o bien algo destinado a servidores de bajo coste, y si no contadme c&amp;oacute;mo es el &amp;uacute;nico sistema operativo que ha reventado con el segundo extra a&amp;ntilde;adido hace unos d&amp;iacute;as.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, para mi el desarrollo en Linux queda completamente descartado a corto y largo plazo, por lo menos hasta que se pongan un cohete en el culo, cosa que dudo mucho que ocurra jam&amp;aacute;s (y espero equivocarme).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Luego vino el tema del &lt;em&gt;swtiching&lt;/em&gt;. Lo cierto es que tras el entusiasmo inicial, la cosa deja mucho que desear en cuanto a usabilidad y, s&amp;iacute;, rendimiento. Ya lo he ido comentando por este blog con anterioridad. OS X Lion y Mountain Lion, si los comparamos con XP, son la rehostia, pero comparados con Windows 7 dejan mucho, pero mucho que desear. La usabilidad es p&amp;eacute;sima, aparte de ciertos problemas de ergonom&amp;iacute;a a los que al final uno termina acostumbr&amp;aacute;ndose.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tambi&amp;eacute;n es cierto que cuando le coges el tranquillo ya no hay vuelta atr&amp;aacute;s, m&amp;aacute;s que nada por la integraci&amp;oacute;n de todos los elementos, m&amp;aacute;s todav&amp;iacute;a si tienes un iPad o un iPhone. Puedes conseguir casi lo mismo en Windows, pero no de forma tan integrada ni coherente.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Respecto al rendimiento, dir&amp;eacute; que por fin tengo un MAC que funciona como yo quiero, tras gastarme m&amp;aacute;s de 300 euros en a&amp;ntilde;adirle un segundo disco SSD al iMac de 27&amp;rdquo;. Es decir, en este momento mi m&amp;aacute;quina principal es un iMac de mediados del 2011 con un i7 a 3.4 GHz, un disco SSD de 256GB como disco de sistema para el OS X y uno de 1TB como secundario para datos. En este momento el disco FireWire de 2TB que usaba como secundario lo tengo como copia de Time Machine y, aparte de que arranca en 8 segundos (antes tardaba m&amp;aacute;s de dos minutos y el disco segu&amp;iacute;a rascando hasta casi los diez), s&amp;oacute;lo veo la roseta multicolor de la muerte cuando se para el disco mec&amp;aacute;nico y tiene que arrancar. Adem&amp;aacute;s, la carga de aplicaciones, incluso las pesadas como Pages o Word, es pr&amp;aacute;cticamente instant&amp;aacute;nea.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y justo ahora, mientras escribo esto en Scrivener, tengo abierta una m&amp;aacute;quina virtual en Unity con Windows 7 x86 en la que se est&amp;aacute; instalando el SP1 de Visual Studio 2010 porque he instalado el AtmelStudio, que es un IDE basado en el Microsoft para generar ejecutables para los microprocesadores de Atmel.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Acabo de hacer una pausa para lanzar el JTAG MK-II, conectarlo a Windows y verificar que el AtmelStudio lo reconoce y funciona, todo ello virtualizado. Que es una de las cosas a las que quer&amp;iacute;a llegar. Con un buen producto de virtualizaci&amp;oacute;n, uno puede tener lo mejor de ambos mundos. Un equipo silencioso a m&amp;aacute;s no poder que ejecuta de forma transparente tanto aplicaciones Windows como OS X sin mayor complicaci&amp;oacute;n que molestarse un poco en configurar las cosas, y encima con un rendimiento equivalente a si se ejecutara en real.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Evidentemente tenemos BootCamp, pero os aseguro que Windows no funciona igual que en un PC real, y perdemos todas las cosas buenas que puedes hacer con un MAC.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero no es a eso a lo que me refiero. M&amp;aacute;s bien todo esto es una especie de parche o pegote. De lo que realmente quiero hablar es de desarrollar para al menos Windows y MAC sin tener que crear dos programas diferentes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Descartamos de entrada que un mismo ejecutable pueda funcionar en ambas plataformas. Por parte de los dos contendientes queda descartado. Microsoft podr&amp;iacute;a haber hecho .NET para OS X o Apple Cocoa para Windows, pero no creo que eso vaya a ocurrir nunca jam&amp;aacute;s.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La &amp;uacute;nica posible soluci&amp;oacute;n es Mono, pero ignoro sin un EXE de Windows se lanzar&amp;aacute; en un MAC o no, y lo voy a descartar por razonamientos que expondr&amp;eacute; m&amp;aacute;s adelante.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, la otra posible soluci&amp;oacute;n es compatibilidad en el c&amp;oacute;digo fuente. Que yo conozca, s&amp;oacute;lo tenemos dos grandes contendientes: QT y lo que ahora es Embarcadero pero que todos conocemos como Delphi y/o C++Builder.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;De QT he hablado ya por aqu&amp;iacute;, pero no como plataforma cruzada. He estado us&amp;aacute;ndolo un poco, en un proyecto en donde trabajaba, pero s&amp;oacute;lo para generar aplicaciones Windows.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En principio QT es multiplataforma si no te sales del propio Framework, y de hecho he podido compilar un mismo c&amp;oacute;digo fuente en ambas plataformas sin m&amp;aacute;s que compilar o bien desde Windows o bien desde OS X. Hay que tener mucho cuidado y usar el propio Creator de QT, y todos los ficheros servir&amp;aacute;n sin problema. Eso s&amp;iacute;, necesitas dos ordenadores, uno para cada plataforma. Tres si quieres tambi&amp;eacute;n Linux.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto nos trae a lo que hemos tratado antes. Como no es posible ejecutar OS X desde una m&amp;aacute;quina Windows (no sin violar licencias y sin &lt;em&gt;hacks&lt;/em&gt; y sin limitaciones y fallos aleatorios), la &amp;uacute;nica soluci&amp;oacute;n es tener un MAC m&amp;aacute;s o menos potente y usar un Windows virtualizado, compartiendo la carpeta de desarrollo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En mi caso, pese a no estar haciendo nada m&amp;aacute;s que estudiar ahora que estoy en paro y tengo tiempo para &lt;em&gt;jugar&lt;/em&gt; con todo esto, tengo una carpeta en donde est&amp;aacute; todo mi c&amp;oacute;digo fuente, carpeta que est&amp;aacute; compartida con SkyDrive y de ese modo puedo verla tambi&amp;eacute;n en mi ordenador Windows (no el virtualizado), aparte de hacer copia de seguridad de forma autom&amp;aacute;tica.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ojo con sincronizar mediante SkyDrive entre real y virtual, porque el tema no es instant&amp;aacute;neo y puedes armar un buen jaleo. La soluci&amp;oacute;n es compartir una carpeta de tu MAC en tu Windows virtual. Con Fusion la cosa funciona muy bien, y hasta Embarcadero ha solucionado los problemas que ten&amp;iacute;a para compilar sobre carpetas de red (Microsoft siempre lo ha tenido resuelto, incluso dando la posibilidad de cachear localmente los ficheros intermedios).&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Si nos damos cuenta, con QT tenemos que compilar y ejecutar en cada m&amp;aacute;quina, lo que en principio no es un gran problema, pero s&amp;iacute; cuando quieres algo que no est&amp;aacute; en el Framework. Ah&amp;iacute; si que tienes que, mediante compilaci&amp;oacute;n condicional, sacarte tu mismo las casta&amp;ntilde;as del fuego. Dada mi escasa experiencia con QT multiplataforma, no puedo asegurar si es algo muy habitual o no.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El otro participante es Embarcadero, con su FireMonkey bajo Delphi/C++ Builder. La historia de todo esto es un poco rocambolesca, ya que la empresa ha llevado muchos a&amp;ntilde;os implementando compilaci&amp;oacute;n condicional en su VCL. S&amp;oacute;lo hay que mirar el c&amp;oacute;digo fuente de cualquier versi&amp;oacute;n (creo que desde la 2009) y ver c&amp;oacute;mo muchos ficheros tienen secciones para Windows, MAC y Linux.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Uno, por tanto, se esperaba que cualquier d&amp;iacute;a anunciaran que la VCL se hab&amp;iacute;a convertido en multiplataforma y que se podr&amp;iacute;a compilar para estos tres sistemas operativos.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero no, Embarcadero compr&amp;oacute; un producto a medio hacer y en seis meses lo transform&amp;oacute; en su FireMonkey, que anunci&amp;oacute; a bombo y platillo con su nueva versi&amp;oacute;n de RAD Studio XE2. Que por cierto se encuentra completamente lleno de bugs y no hay entrada de blog explicando esta o aquella caracter&amp;iacute;stica que no hable de que hay un problema y que han tenido de resolverlo de alguna manera. Y es que seis meses es muy poco tiempo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;FireMonkey es una gran idea implementada muy pobremente. La idea es usar el IDE de Delphi o de C++ Builder para, a partir de un mismo c&amp;oacute;digo fuente, generar un ejecutable Windows o MAC, pero siempre desde Windows, por lo que estamos ante el mismo problema que antes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La ventaja aqu&amp;iacute; es que puedes hacerlo todo desde Windows, hasta depurar. Es decir, es necesario instalar un servidor en el lado MAC, servidor que te va a permitir enviar el &lt;em&gt;bundle OS X&lt;/em&gt; al MAC y depurarlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y como todo primer producto, est&amp;aacute; completamente lleno de bugs y da muchos problemas, tanto el IDE como la depuraci&amp;oacute;n remota y el framework en s&amp;iacute;. Embarcadero lleva sacados cinco parches, uno de ellos tan grande que exige reinstalarlo todo, que mejoran algo pero no mucho.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y para m&amp;aacute;s INRI, son aplicaciones de 32 bits, cosa que en los MAC se est&amp;aacute; acabando a pasos agigantados.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esperemos que el XE3, que saldr&amp;aacute; este verano, mejor algo la cosa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Nos falta comentar Mono, el C# multiplataforma y de c&amp;oacute;digo abierto. Ya he hablado algo de &amp;eacute;l &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx"&gt;aqu&amp;iacute;&lt;/a&gt; con anterioridad, pero ahora voy a matizar un poco m&amp;aacute;s. Mono engloba una serie de tecnolog&amp;iacute;as m&amp;aacute;s o menos integradas que comparten un mismo lenguaje de programaci&amp;oacute;n: C#.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Basado en &lt;em&gt;ports&lt;/em&gt;, todo el meollo se centra en un IDE (disponible para ambas plataformas, como el de QT) que permite crear aplicaciones basadas en los ya citados &lt;em&gt;ports&lt;/em&gt;, de los que disonemos de varios seg&amp;uacute;n qu&amp;eacute; plataforma.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por un lado tenemos el de Windows.Forms, que nos permitir&amp;aacute; generar c&amp;oacute;digo compatible con la tecnolog&amp;iacute;a de Microsoft y ejecutar en Windows, MAC y Linux. GTK# es otro de ellos. Tambi&amp;eacute;n est&amp;aacute; MonoMAC, en exclusiva para MAC. Hay m&amp;aacute;s pero nos detenemos aqu&amp;iacute;.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La idea es que cada &lt;em&gt;port&lt;/em&gt; conserva la idiosincrasia de cada &lt;em&gt;origen&lt;/em&gt;. Es decir, el API de GTK# es el GTK pero traducido a C#, y as&amp;iacute; con todos. Es una buena idea y en general, se puede generar c&amp;oacute;digo para Windows y MAC sin problemas mayores que los que tendr&amp;iacute;amos con QT.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero ahora viene el t&amp;iacute;o de la rebaja. Hemos visto algunas pegas que tienen todos estos sistemas de desarrollo, pero no son las peores de todas. De todos modos, si desarrollas para MAC necesitar&amp;aacute;s un MAC, y lo mismo para Windows, as&amp;iacute; que llevar a cabo esas tareas en ambas m&amp;aacute;quinas no es todo lo malo que se puede esperar, y de hecho en todos los casos existen soluciones bastante &amp;oacute;ptimas, aunque lo m&amp;aacute;s deseable ser&amp;iacute;a el acercamiento de Embarcadero, con compila en un sitio, ejecuta en dos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La mayor pega de todas consiste en que pr&amp;aacute;cticamente ninguno de estos sistemas pinta los controles como nativos. QT podr&amp;iacute;a salvarse por los pelos, pero ni FireMonkey ni Mono, salvo MonoMac, aparecen como aplicaciones nativas. En la documentaci&amp;oacute;n de algunos productos la llaman hasta &amp;ldquo;alien&amp;rdquo;. Ya os pod&amp;eacute;is imaginar. Y si bien en Windows un usuario normal puede aceptar ciertos interfaces ex&amp;oacute;ticos, un fanboy (perd&amp;oacute;n, maquero) de pro seguro que te manda a la mierda con todas sus palabras, y encima con raz&amp;oacute;n.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El caso de MonoMac no se aplica, ya que no podremos compartir c&amp;oacute;digo fuente con Windows puesto que se trata de un envoltorio sencillo sobre el propio Cocoa con la idiosincrasia de OS X.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, el &amp;uacute;nico Framework que s&amp;eacute; de forma fehaciente que ha entrado en la App Store de los MAC ha sido QT tras aplicar unos parches para evitar que el propio QT modificara ficheros dentro del &lt;em&gt;bundle&lt;/em&gt;. De todos modos no s&amp;eacute; qu&amp;eacute; pasar&amp;aacute; con el Sandboxing y si QT (y los dem&amp;aacute;s) lo soportan.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Finalmente, est&amp;aacute; completamente claro que, a fecha de hoy, desarrollar en multiplataforma de manera coherente continua prohibido, principalmente por limitaciones de los Frameworks existentes que de problemas t&amp;eacute;cnicos, dado que el rendimiento y las herramientas base (como compiladores de plataforma cruzada o lenguajes comunes en diferentes plataformas), est&amp;aacute;n m&amp;aacute;s que maduros.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tan s&amp;oacute;lo habr&amp;iacute;a que crear un Framework que utilizara los controles nativos de cada plataforma, cosa que a fecha de hoy no existe (m&amp;aacute;s sobre esto luego).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;&amp;iquest;Qu&amp;eacute; nos queda, pues? Tan sencillo y tan complejo como dividir nuestra aplicaci&amp;oacute;n en dos partes. La primera, la parte visual, tendremos que hacerla diferente para cada plataforma. Objective-C en MAC, Win32 (MFC, o cualquier otro que pinte nativo), y la parte no visual o el n&amp;uacute;cleo de nuestro programa en alg&amp;uacute;n lenguaje com&amp;uacute;n, como puede ser C++ y STL y mantener al loro todo el tema para que compile y funcione en todos los sistemas de destino&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Es m&amp;aacute;s trabajo, pero creo que es la &amp;uacute;nica forma de mantener un interfaz visual nativo y coherente. El problema viene cuando nuestra aplicaci&amp;oacute;n es demasiado simple de modo que mantener esta estructura es m&amp;aacute;s costoso que crear dos programas de forma independiente.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte, claro est&amp;aacute;, la bajada de rendimiento al tener que desacoplar ambas partes, aunque esto es muy bueno y deber&amp;iacute;a ser una constante en cualquier desarrollo no trivial, aunque estemos haci&amp;eacute;ndolo solo para Windows o s&amp;oacute;lo para MAC. No obstante, a veces la ca&amp;iacute;da de rendimiento es tal, o el programa es tan meramente visual que este acercamiento no es aplicable.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Si os dais cuenta no he entrado en el tema de c&amp;oacute;digo abierto versus c&amp;oacute;digo cerrado, y es que para el programador medio, se la trae floja si tiene el fuente o no de lo que est&amp;eacute; usando: no lo va a mirar porque o bien no tiene tiempo o bien no est&amp;aacute; capacitado.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tampoco he cubierto el tema Metro de Windows 8, que est&amp;aacute; de lado del tema m&amp;oacute;vil, en el que no he entrado pese a haber tambi&amp;eacute;n Frameworks gen&amp;eacute;ricos. Aqu&amp;iacute; estamos igual, pero ahora las plataformas son Windows Phone, Windows Metro (o RT), Android e iOS, y si las de Windows y MAC son disparejas, no os digo estas. Y, a fecha de hoy, que yo sepa, no hay ning&amp;uacute;n Framework multiplataforma y compatible. FireMonkey promete llegar a Android, Metro y a C++ en pr&amp;oacute;ximas versiones, pero si ya con dos plataformas la cosa est&amp;aacute; como est&amp;aacute;, no quiero saber cuando haya tantas&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Me falta hablar de un jugador que no he nombrado y que tiene muy buena pinta, quiz&amp;aacute;s la mejor de todas pero, como apenas lo he probado, lo dejo para una futura entrada. Se llama wxWidgets y hace tiempo que habl&amp;eacute; de &amp;eacute;l aqu&amp;iacute;, pero para Windows. Estamos ante un Framework con mucha solera en el mundo del desarrollo y que usan empresas como Google en su producto Google Drive a trav&amp;eacute;s de wxPython.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y la mayor ventaja est&amp;aacute; en que, aparte de estar disponible para alguna que otra plataforma embebida, los controles son los nativos de cada sistema operativo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/qt.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/qt.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;QT en Windows y OS X (Fijaos c&amp;oacute;mo los controles son casi nativos en cada sistema).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/firemonkey.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/firemonkey.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;FireMonkey en Windows y OS X (Esto no pasa la MAC App Store ni a golpe de talonario. Por no aparecer ni el men&amp;uacute; aparece donde debe).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx1.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx2.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;WxWidgets en OS X (Todos los controles son nativos).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205955" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx">C++ Builder</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/QT/default.aspx">QT</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>Visual C++ 2012 soportará Windows XP</title><link>http://geeks.ms/blogs/rfog/archive/2012/06/15/visual-c-2012-soportar-225-windows-xp.aspx</link><pubDate>Fri, 15 Jun 2012 20:49:28 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205620</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205620</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205620</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/06/15/visual-c-2012-soportar-225-windows-xp.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Dicho así, a bote pronto, puede parecer una tontería, pero no lo es. Los que hayan estado probando las diferentes versiones alfas, betas y &lt;em&gt;omicrones&lt;/em&gt; de Visual C++ 11 se habrán dado cuenta de que no generan código para Windows XP.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;El motivo no era otro más que se han hecho una serie de mejoras al &lt;em&gt;runtime&lt;/em&gt; de C++ (ya sabéis, la biblioteca de C y de C++) que se basan en una serie de funciones de Win32 que no están presentes en Windows Xp y sí en Vista y siguientes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;La respuesta fácil sería decir que han hecho eso para empezar a ir descartando a XP como sistema operativo soportado y forzar que los nuevos programas no funcionen con él, pero a la vista de las noticias no ha sido así. De hecho, hace poco tiempo alguien publicó la forma de soportar XP con las versiones beta ya publicadas mediante un truco. No me preguntéis cómo porque no lo he mirado.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Independientemente de eso, cuando un programa debe ejecutarse en un sistema que no tiene todas las importaciones de, por ejemplo, Kernel32.DLL, lo que hace es realizar una carga parcial o suministrar funciones &lt;em&gt;dummy&lt;/em&gt; para que el sistema funcione. Es decir, si por ejemplo el &lt;em&gt;runtime&lt;/em&gt; de C++ llama a una supuesta función de Kernel32.DLL llamada &lt;em&gt;UnaFuncion()&lt;/em&gt; que no está en, digamos, XP pero sí en Windows 7, lo que se hace es, o bien esas se marcan como &lt;em&gt;delayed&lt;/em&gt; (retardadas) y sólo se cargan manualmente una vez que el &lt;em&gt;runtime&lt;/em&gt; ha comprobado que el sistema operativo la posee, o bien se suministra una vacía o con emulación.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;No me preguntéis más porque realmente no sé cómo se hace ya que nunca me ha hecho falta, y tampoco sé si está documentado de forma oficial o no, pero es un mecansimo más o menos conocido que usa al menos la propia Microsoft para soportar sistemas operativos obsoletos y no tener varios juegos de ficheros.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Y ya que estamos en el tema, os comento otra cosa. Hace unos días se anunció que las versiones Express (todas) de Visual Studio 2012 sólo soportarían crear aplicaciones Metro en Windows 8 y que, si queríamos escritorio, deberíamos seguir usando las 2010 para ello.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Hablamos, claro está, de las gratuitas. La versión &lt;em&gt;Professional&lt;/em&gt; y superiores sí que iban a poder crear ambos tipos de aplicaciones, y todo bajo un mismo IDE tal y como estamos acostumbrados. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;[Para los despistados, diré que con las versiones Express, si uno necesita crear un proyecto mixto, digamos una DLL hecha en C, C++ ó C++/CLI para que luego una aplicación en C# la use, tienes que instalar los productos por separado y manejar cada tipo de proyecto también por separado, y nada de depurar y saltar de código manejado a nativo y viceversa. Con las versiones de pago todo está en un mismo IDE y se pueden manejar de forma conjunta].&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;En principio la imposibilidad de crear aplicaciones de escritorio con la Express 2012 puede parecer trivial ya que tenemos las 2010, pero lo cierto es que perdemos muchas mejoras en todos los lenguajes. Podría citar como ejemplo los métodos asíncronos en C# y toda la nueva parafernalia del C++11 para C++, que no es poco.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Pero ha sido tal el clamor popular (y no tan popular, porque algunos MVP le han dado caña de la buena a MS -no, esta vez yo no he movido un dedo), que Microsoft ha reaccionado y va a sacar una versión 2012 &lt;em&gt;Desktop&lt;/em&gt; para crear aplicaciones de escritorio.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Es decir, que vamos a tener al menos dos C# Express, dos C++ Express y demás, una para aplicaciones Metro y otra para escritorio. Y lo que es mejor, las versiones escritorio creo, y digo creo porque no lo tengo claro, va a ser un solo IDE que va a soportar todos los lenguajes como las versiones de pago…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Enlaces originales:&lt;/p&gt;
&lt;ul style="list-style-type:disc;"&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Helvetica;"&gt;&lt;a href="http://blogs.msdn.com/b/vcblog/archive/2012/06/15/10320645.aspx"&gt;Targeting Windows XP with C++ in Visual Studio 2012&lt;/a&gt;&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Helvetica;"&gt;&lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2012/06/08/visual-studio-express-2012-for-windows-desktop.aspx"&gt;Visual Studio Express 2012 for Windows Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205620" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category></item><item><title>MonoTouch: muy bonito pero una guarrería</title><link>http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx</link><pubDate>Wed, 30 May 2012 09:17:01 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205305</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205305</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205305</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Ayer estuve jugando un poco con MonoTouch, más que nada por curiosidad. Para los que no lo sepáis, es un IDE más una biblioteca que envuelve de forma conveniente todo el desarrollo para iOS, tanto iPhone como iPad y que permite a un programador de C# desarrollar para estas plataformas sin tener que aprender nada de Objective-C y demás zarandajas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Es un decir, porque realmente no es más que un envoltorio fino a todo eso. Por lo tanto, si estás desarrollando para Windows o Silverlight, no esperes sentarte y ponerte a ello porque aparte de usar la sintaxis de C#, todo lo demás es iOS. Incluso se usa el IDE de xCode para crear los elementos gráficos y su interactuación, como son los &lt;em&gt;outlets&lt;/em&gt; (propiedades) y las &lt;em&gt;actions&lt;/em&gt; (los eventos).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;La ventaja es que al ser una capa fina apenas introduce sobrecarga y todo es nativo. El inconvenientes es que tienes que aprenderte todas las idiosincrasias del iOS.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y otra cosa que no me creo mucho es el tema de la compartición de código. No esperes tener el mismo código fuente de tu aplicación y compilar para Android, iOS, OS X y Windows. Podrás compartir bloques de código, pero nada más.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Otra cosa es que estas herramientas son de pago. Desde 400$ la más barata hasta viarios miles de dólares. Depende de qué quieras y cómo. Las versiones gratuitas para Android e iOS no caducan pero sólo permiten ejecutar código en el simulador.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Las versiones para escritorio son completamente gratuitas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Se me olvidaba decir &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Ahora bien, como decidas desinstalar algo… arreglado vas. Aparte de que no hay desinstalador, los procesos para hacerlo son completamente insuficientes y te dejan el sistema hecho unos zorros con miles de archivos desperdigados por todo el disco. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Versiones anteriores traían un desinstalador embebido dentro del PKG que realizaba la instalación, pero al menos la que yo he instalado no lo trae.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Primero ejecuta los comandos descritos &lt;a href="http://stackoverflow.com/questions/74902/uninstall-mono-from-mac-os-x-v10-5-leopard"&gt;aquí&lt;/a&gt;. Eso te va a limpiar digamos que las partes públicas del entorno. Y si tienes la última versión de xCode instalada, te puedes cargar la carpeta /Developer de un plumazo sin problemas porque sólo tendrás el Mono de los cojones en ella. Pero antes de hacerlo, míralo por si acaso.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Una vez pasado ese script, si te pica la curiosidad, haz una búsqueda global con la palabra “mono”.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En mi caso he usado CleanMyMac para limpiar el ordenador de basura, pero tu puedes hacerlo a mano o con otra herramienta. Ojo con los ficheros que no son del mono.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Finalmente tenemos que desinstalar MonoDevelop. En mi caso, de nuevo con CleanMyMac.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y creo, sólo creo, que tengo limpio de nuevo el sistema.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Hay que joderse.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205305" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/configuraci_26002300_243_3B00_n/default.aspx">configuraci&amp;#243;n</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>Ocultación de datos y paso de variables</title><link>http://geeks.ms/blogs/rfog/archive/2012/04/24/ocultaci-243-n-de-datos-y-paso-de-variables.aspx</link><pubDate>Tue, 24 Apr 2012 09:45:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204620</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=204620</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=204620</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/04/24/ocultaci-243-n-de-datos-y-paso-de-variables.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Leo en Twitter un par de preguntas m&amp;aacute;s que curiosas sobre dos cosas que se dan por supuestas en el desarrollo orientado a objetos. Aunque una de ellas est&amp;aacute; formulada al rev&amp;eacute;s, yo aqu&amp;iacute; le voy a dar el sentido correcto, e intentar&amp;eacute; responder, en la medida de mis conocimientos, a ambas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;La primera de ellas es &amp;ldquo;&amp;iquest;por qu&amp;eacute; las variables de una clase no deben ser p&amp;uacute;blicas?&amp;rdquo;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Es una de las primeras cosas que nos ense&amp;ntilde;an en la POO. Extendiendo la pregunta al &amp;aacute;mbito completo, el concepto se conoce como &amp;ldquo;ocultaci&amp;oacute;n de datos&amp;rdquo;, y se extiende no s&amp;oacute;lo a las variables de clase, sino tambi&amp;eacute;n a los objetos en s&amp;iacute; y en general al programa completo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Por poner un caso extremo, en la mayor&amp;iacute;a de &lt;em&gt;Frameworks&lt;/em&gt; serios, el punto de entrada de un programa cualquiera deber&amp;iacute;a ser:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;MiApp theApp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;theApp.Run();&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Vale, es un poco extremo, pero a ese nivel es lo que necesitamos: una aplicaci&amp;oacute;n, y que la vamos a ejecutar. No nos hace falta nada m&amp;aacute;s ni tenemos que conocer nada m&amp;aacute;s a ese nivel.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Es decir, uno de los motivos de la ocultaci&amp;oacute;n de datos es dar a conocer &amp;uacute;nicamente lo estrictamente necesario, y de hecho no nos importa si &lt;em&gt;theApp&lt;/em&gt; tiene una variable llamada &lt;em&gt;Juanito &lt;/em&gt;o &lt;em&gt;Pepito&lt;/em&gt; porque no tiene utilidad conocerlo a ese nivel.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y de hecho no nos interesa que nadie sepa la estructura interna de &lt;em&gt;MiApp&lt;/em&gt; porque sencillamente ah&amp;iacute; no podemos y no debemos hacer nada m&amp;aacute;s que ejecutar el objeto que es la representaci&amp;oacute;n en memoria de nuestra aplicaci&amp;oacute;n. Quiz&amp;aacute;s, o bien en el constructor o bien en el m&amp;eacute;todo &lt;em&gt;Run()&lt;/em&gt;, pasar los argumentos con los que ha sido llamada la aplicaci&amp;oacute;n, pero s&amp;oacute;lo si es pertinente y nos interesa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;La regla nos dice que si no lo necesitamos a ese nivel, no lo hagamos p&amp;uacute;blico. Pero claro, todav&amp;iacute;a no he explicado &lt;em&gt;por qu&amp;eacute;&lt;/em&gt;. Simplemente he definido la regla: oculta todo lo que puedas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Jorge Serrano, respondiendo en Twitter, lo ha dicho bastante claro: No te interesa que nadie te pueda cambiar los zapatos sin tu consentimiento. Yo dir&amp;iacute;a que cada perro debe lamerse su pijo, expresi&amp;oacute;n m&amp;aacute;s castiza. Imagina que vas andando por el monte, y alguien te cambia tus botas de &lt;em&gt;trekking&lt;/em&gt; por unas chanclas de playa sin tu consentimiento&amp;hellip; O que est&amp;aacute;s en una reuni&amp;oacute;n de alto copete y una chavala empieza a esto&amp;hellip;, lamerte el tema&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Reformulado en c&amp;oacute;digo, y retrocediendo un poco, la idea es bastante interesante.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En la programaci&amp;oacute;n procedural cl&amp;aacute;sica (es decir, C y similares), y tal y como lo dijo Stroustrup en no recuerdo qu&amp;eacute; lugar, un programa es un conjunto de funciones que menean un conjunto de datos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En teor&amp;iacute;a, cualquier funci&amp;oacute;n podr&amp;iacute;a &lt;em&gt;tocar&lt;/em&gt; cualquier dato. Digo en teor&amp;iacute;a porque en C y similares tambi&amp;eacute;n hay m&amp;eacute;todos, m&amp;aacute;s primitivos, para ocultar datos. Quien haya desarrollado aplicaciones m&amp;aacute;s o menos grandes con esta filosof&amp;iacute;a, se habr&amp;aacute; encontrado con serios problemas:&lt;/p&gt;
&lt;ul style="list-style-type:disc;"&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;M&amp;eacute;todos que cambian datos que no deber&amp;iacute;an cambiar.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Datos que deber&amp;iacute;an ser diferentes pero que por un despiste tienen el mismo nombre y que son combinados por el enlazador como uno solo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Poni&amp;eacute;ndolo en otras palabras: se pueden dar situaciones en las que la modificaci&amp;oacute;n de un dato genere efectos laterales que terminen en un comportamiento no deseado, o incluso generar una &lt;em&gt;onda de interferencia&lt;/em&gt; que termine tumbando la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo mismo podr&amp;iacute;a pasar con dos variables que accidentalmente han sido nombradas igual. Un compilador moderno deber&amp;iacute;a avisar de este &amp;uacute;ltimo caso a nivel de enlazador, y en general, al menos con Visual C++, as&amp;iacute; ocurre. Otra cosa es que el programador novel le haga caso o se d&amp;eacute; cuenta del aviso. Y no todos los compiladores notifican de este hecho, sobre todo los de plataforma cruzada para sistemas embebidos, que suelen ser bastante antiguos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Volviendo al tema central, la OO intenta solucionar este problema con las clases y la ocultaci&amp;oacute;n de datos. Es decir, una clase es una serie de m&amp;eacute;todos que definen c&amp;oacute;mo &lt;em&gt;tocar&lt;/em&gt; a una serie de datos de forma auto contenida. Y hasta la fecha es la mejor soluci&amp;oacute;n que se ha podido encontrar, y si alguien conoce alguna mejor (que no sea una paja mental), le vaticino los laureles del &amp;eacute;xito m&amp;aacute;s absoluto y arrollador.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En otras palabras: una clase es una &lt;em&gt;entidad&lt;/em&gt; con un comportamiento definido por su c&amp;oacute;digo y es algo opaco a cualquier cosa que intente ver su interior excepto un interfaz p&amp;uacute;blico que sirva para tratar con ella.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y hay varias razones, todas ellas muy poderosas, para que esto deba ser as&amp;iacute;, lo que lleva impl&amp;iacute;cito una serie de obligaciones: ocultaci&amp;oacute;n de datos, interfaz p&amp;uacute;blica y autocontenci&amp;oacute;n. Otras caracter&amp;iacute;sticas como polimorfismo extienden pero no obligan, por lo que las vamos a obviar.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Volviendo al ejemplo de los zapatos, pensemos en un objeto &lt;em&gt;zapato&lt;/em&gt; gen&amp;eacute;rico. Cuando construyamos una persona, a la clase &lt;em&gt;persona&lt;/em&gt; le a&amp;ntilde;adimos dos objetos &lt;em&gt;zapatos&lt;/em&gt; (que podr&amp;iacute;an ir en un array, pero no es imprescindible).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y ahora viene el &lt;em&gt;truco del almendruco&lt;/em&gt;. Atarse los cordones. Podemos hacerlo de varias formas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;La m&amp;aacute;s chapucera es acceder al m&amp;eacute;todo miembro &lt;em&gt;cord&amp;oacute;n&lt;/em&gt; de cada &lt;em&gt;zapato&lt;/em&gt; y atarlo, ejecutando una serie de acciones (c&amp;oacute;digo) sobre dichos cordones. Para ello necesitamos que &lt;em&gt;cord&amp;oacute;n&lt;/em&gt; sea p&amp;uacute;blico.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;&amp;iquest;Pero qu&amp;eacute; pasa si tenemos varios tipos de zapatos? Por ejemplo, unos que lleven hebillas. Ups. El c&amp;oacute;digo para atar zapatos que est&amp;aacute; en la clase &lt;em&gt;persona&lt;/em&gt; ya no nos sirve&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Si embargo, si definimos un &lt;em&gt;zapato&lt;/em&gt; padre que tenga un m&amp;eacute;todo llamado &lt;em&gt;AtarCordones()&lt;/em&gt; y que internamente use el dato miembro &lt;em&gt;cord&amp;oacute;n&lt;/em&gt; para realizar la misma operaci&amp;oacute;n que antes hac&amp;iacute;amos desde la clase &lt;em&gt;persona&lt;/em&gt;, cuando heredemos de dicho &lt;em&gt;zapato&lt;/em&gt; una nueva clase llamada &lt;em&gt;sandalia&lt;/em&gt;, tan s&amp;oacute;lo tendremos que redefinir el m&amp;eacute;todo &lt;em&gt;AtarCordones()&lt;/em&gt; que, en lugar de usar &lt;em&gt;cord&amp;oacute;n&lt;/em&gt;, usar&amp;aacute; &lt;em&gt;hebilla&lt;/em&gt; y una serie de acciones con ellas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y lo que es m&amp;aacute;s importante, la clase contenedora, &lt;em&gt;persona&lt;/em&gt;, se desentiende de qu&amp;eacute; zapato tenemos, de si tiene hebillas o cordones. Simplemente llama a &lt;em&gt;zapato.AtarCordones()&lt;/em&gt; y la acci&amp;oacute;n estar&amp;aacute; hecha.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;[Hablando m&amp;aacute;s seriamente, deber&amp;iacute;amos tener una clase base virtual llamada, por ejemplo, &lt;em&gt;ZapatoGen&amp;eacute;rico&lt;/em&gt; que defina un m&amp;eacute;todo virtual llamado &lt;em&gt;AtatCordones()&lt;/em&gt;. Y luego deber&amp;iacute;amos heredar de ah&amp;iacute; el &lt;em&gt;Zapato&lt;/em&gt; normal y la &lt;em&gt;Sandalia&lt;/em&gt;. Y quiz&amp;aacute;s otras variantes de calzado.]&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, al ocultar los datos internos y dejar una interfaz p&amp;uacute;blica, ganamos muchas cosas:&lt;/p&gt;
&lt;ul style="list-style-type:disc;"&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Los objetos que manipulen nuestro objeto lo har&amp;aacute;n a trav&amp;eacute;s de una interfaz definida y que debe ser siempre la misma (con la salvedad de los pasos de refactorizaci&amp;oacute;n que sean necesarios y que cambien los nombres o la propia interfaz).&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;El punto de arriba mejora la claridad del c&amp;oacute;digo, &lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Nos evita tener que depurar los objetos llamadores porque no ha cambiado nada en ellos,&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Nos permite cambiar el comportamiento interno del objeto manipulado sin tener que preocuparnos de la clase manejadora,&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Permite el &lt;em&gt;efecto biblioteca&lt;/em&gt; (comentado por Herb Sutter en su &lt;em&gt;Rationale&lt;/em&gt; a C++/CLI, que su vez lo toma de Stroustrup): podemos meter la clase &lt;em&gt;Zapato&lt;/em&gt; en una biblioteca, y podremos cambiar su comportamiento interno sin tener que recompilar el c&amp;oacute;digo que la use,&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Oculta la visibilidad, permitiendo un c&amp;oacute;digo mucho m&amp;aacute;s limpio y con menos interferencias y s&amp;iacute;mbolos globales, que al menos en C++ pueden lentificar la compilaci&amp;oacute;n en grado sumo. &lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Acelera la carga en tiempo de ejecuci&amp;oacute;n, porque el cargador del sistema, al tener menos s&amp;iacute;mbolos p&amp;uacute;blicos, tiene que inicializar y relacionar menos cosas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Vale, creo que no se me escapa nada, y si lo hiciera, con los puntos de arriba hay suficiente.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Todo esto nos lleva a una serie de reglas de dise&amp;ntilde;o con las clases que, al menos yo, llevo a rajatabla:&lt;/p&gt;
&lt;ul style="list-style-type:disc;"&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Oculta todo lo que puedas. &lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Usa el nivel m&amp;aacute;s cerrado posible: &lt;em&gt;private&lt;/em&gt; en C++ para todo lo que puedas. Luego, cuando refactorices y necesites que algo sea conocido por clases hijas, p&amp;aacute;salo a &lt;em&gt;protected&lt;/em&gt;, pero con sumo cuidado ya que si hay (o se quiere) efecto lateral, mejor pon un m&amp;eacute;todo protegido en el padre que pueda ser llamado por el hijo para acceder a ese miembro privado.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Define interfaces p&amp;uacute;blicos, pero los menos posibles. Si un zapato no va desatar los cordones, no lo definas. Si lo necesitas, ya lo definir&amp;aacute;s. (Aqu&amp;iacute; hay que mantener cierto equilibrio, porque si sabes que lo puedes necesitar, mejor lo declaras pero no lo defines &amp;ndash;cuerpo vac&amp;iacute;o-, ya que podr&amp;iacute;a ser peor luego tener que cambiar la interfaz ya definida y usada).&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Documenta por qu&amp;eacute;, no c&amp;oacute;mo (el c&amp;oacute;mo ya te lo dice el propio c&amp;oacute;digo, a no ser que sea alg&amp;uacute;n algoritmo complejo, y en ese caso en el 99% de las veces seguro que se puede hacer de otra forma m&amp;aacute;s sencilla).&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Finalmente esto nos lleva a un problema que plantea mucha gente, y es que toda esa ocultaci&amp;oacute;n y esos m&amp;eacute;todos de acceso pueden volver un programa extremadamente lento.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Os lo puedo asegurar: eso fue en tiempos pasados, cuando los compiladores eran animales mitol&amp;oacute;gicos y se sab&amp;iacute;a poco sobre ellos.&amp;nbsp; Ahora, cualquier compilador medio decente se va a comer tus miles de l&amp;iacute;neas de c&amp;oacute;digo en un santiam&amp;eacute;n y va a generar mejor c&amp;oacute;digo que el que tu pudieras hacer a mano salt&amp;aacute;ndote todos esos pasos. Al menos en C++ y quiero creer que tambi&amp;eacute;n en C#.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Bueno, ahora viene la segunda pregunta, que reformulo pues est&amp;aacute; planteada con los conceptos cambiados: &amp;ldquo;&amp;iquest;Alguno sabe la raz&amp;oacute;n de por qu&amp;eacute; las variables se pasan por valor y los objetos por referencia?&amp;rdquo; Hablamos de C#, ya que en C++ y C++/CLI podemos pasarlos como nos salga de la pepitilla&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Para responder a esta pregunta debemos meternos un poco en c&amp;oacute;mo funcionan los compiladores.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Una variable nativa, digamos un entero, ocupa 4 bytes (por decir algo, todo depende de d&amp;oacute;nde ejecutemos). Un objeto ocupa tanto como la suma de sus datos miembro y una o varias vtable en caso de que tenga m&amp;eacute;todos virtuales y del nivel de anidaci&amp;oacute;n de la herencia (as&amp;iacute; como de lo bueno que sea el compilador).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;[Una vtable es un array de punteros a funci&amp;oacute;n que, en tiempo de ejecuci&amp;oacute;n, determinan qu&amp;eacute; m&amp;eacute;todo se va a ejecutar dentro de un objeto con m&amp;eacute;todos virtuales. Un buen compilador resumir&amp;aacute; esto en cambiar un &lt;em&gt;call&lt;/em&gt; directo a un &lt;em&gt;call&lt;/em&gt; indirecto en base a un &amp;iacute;ndice almacenado en alg&amp;uacute;n lugar.]&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Cuando nosotros definimos una clase, y a partir de ella instanciamos un objeto, el compilador (y en tiempo de compilaci&amp;oacute;n) hace un &lt;em&gt;pase de manos&lt;/em&gt; y agrupa todos los m&amp;eacute;todos miembro en un bloque que junta con los dem&amp;aacute;s m&amp;eacute;todos miembro de las dem&amp;aacute;s clases, a&amp;ntilde;adiendo unas firmas especiales a los nombres de funci&amp;oacute;n.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Digamos que una vez compilado, un programa OO se convierte en un programa no OO que tiene una serie de funciones globales que acceden y modifican una serie de datos&amp;hellip; &amp;iquest;Os suena, verdad? Es que es la &amp;uacute;nica forma de hacerlo, os lo puedo asegurar. La ventaja est&amp;aacute; en que, salvo oscur&amp;iacute;simos errores del compilador que cada vez ocurren con menos frecuencia, a todos los efectos, el comportamiento final simula ser completamente orientado a objetos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Bueno, cuando pasamos par&amp;aacute;metros en una llamada a m&amp;eacute;todo, el sistema usa una pila, que es un &amp;aacute;rea de la memoria especialmente destinada a las tareas descritas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;No vamos a entrar en detalles t&amp;eacute;cnicos, pero la cosa funciona as&amp;iacute;: el compilador pone en la pila los datos a pasar, copi&amp;aacute;ndolos quiz&amp;aacute; de otro punto de la pila. Entonces hace un &lt;em&gt;call&lt;/em&gt; en ensamblador a la funci&amp;oacute;n que hemos llamado, y cuando entremos en ella, sabr&amp;aacute; que en la cima de la pila tiene sus par&amp;aacute;metros.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Cuando pasamos un par&amp;aacute;metro por valor, estamos copiando dicho valor en la pila. Si es un entero, ocupar&amp;aacute; 4 bytes. Si es un objeto, ocupar&amp;aacute; tantos bytes como datos miembro tenga (ojo, s&amp;oacute;lo los datos, no el c&amp;oacute;digo), m&amp;aacute;s las tablas virtuales m&amp;aacute;s alg&amp;uacute;n que otro elemento m&amp;aacute;s que hace la funci&amp;oacute;n de &lt;em&gt;metadatos&lt;/em&gt; del objeto pasado.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Si el objeto ocupa 10 bytes, se copiar&amp;aacute;n, y si ocupa 100, 1K o 100K, se tendr&amp;aacute;n que copiar absolutamente todos los bytes. Dependiendo de qu&amp;eacute; objeto, la copia podr&amp;iacute;a ser onerosa en tiempo de ejecuci&amp;oacute;n y gasto de memoria.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Cuando pasamos un objeto por referencia, estamos pasando un &lt;em&gt;puntero&lt;/em&gt; al dato. No importa en qu&amp;eacute; lenguaje estemos, siempre es un puntero. Todo lo dem&amp;aacute;s lo hace el &lt;em&gt;sugar syntax&lt;/em&gt; del lenguaje, que nos &lt;em&gt;endulza&lt;/em&gt; la sintaxis y el operar con ellos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En este caso, de media, una referencia a un objeto en C#, y si no lo han cambiado, ocupa unos 10 bytes independientemente de qu&amp;eacute; tama&amp;ntilde;o real tenga el objeto en s&amp;iacute;.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, ahora vemos por qu&amp;eacute; en C# un objeto se pasa por referencia y un tipo nativo por valor: optimizaci&amp;oacute;n.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto genera una serie de idiosincrasias en C# que al menos a mi no me gustan mucho, ya que estamos obligando al programador a que lo haga al estilo del lenguaje y no como uno quiera (ya sab&amp;eacute;is, eso de &amp;ldquo;programar en&amp;rdquo; y &amp;ldquo;programar con&amp;rdquo;).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;La optimizaci&amp;oacute;n es la adecuada para la mayor&amp;iacute;a de casos, pero a veces querr&amp;iacute;amos hacerlo de otra forma, y es cuando uno ve las limitaciones del lenguaje. En el caso que nos ocupa, un objeto no se puede pasar por valor, lo que fuerza a copiarlo a mano si vamos a modificarlo y no queremos que el original sufra cambios. Y a veces eso es dif&amp;iacute;cil, ya que en algunos casos la copia es de nuevo por valor y no se produce la mutaci&amp;oacute;n a nuevo objeto cuando modificamos la referencia creada, y no podemos hacer nada porque el C# (y el .NET) &lt;em&gt;son as&amp;iacute;&lt;/em&gt;.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Sin embargo s&amp;iacute; que podemos pasar un tipo nativo por referencia, a&amp;ntilde;adiendo &lt;em&gt;ref&lt;/em&gt; al par&amp;aacute;metro (con lo cual modificaremos su valor desde dentro de la funci&amp;oacute;n llamada). No obstante, la implementaci&amp;oacute;n es una chapuza como un castillo, ya que la cosa funciona as&amp;iacute; dadas las severas limitaciones de la m&amp;aacute;quina virtual .NET: El valor a pasar por referencia se copia al mont&amp;iacute;culo (&lt;em&gt;heap&lt;/em&gt; en ingl&amp;eacute;s, que es donde se guardan los objetos y dem&amp;aacute;s elementos instanciados por referencia) y entonces se pasa, en la pila, una referencia a ese valor puesto en el mont&amp;iacute;culo. Cuando salimos de la funci&amp;oacute;n llamada, el sistema coge del mont&amp;iacute;culo el valor modificado y lo vuelve a poner en la pila.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Es lo que se llama &lt;em&gt;box/unbox&lt;/em&gt;, y viene determinado por la limitaci&amp;oacute;n del .NET de acceder a la pila cuando el elemento a tocar no est&amp;aacute; encima de ella. La &amp;uacute;nica ventaja que obtenemos de esto es que es mucho m&amp;aacute;s dif&amp;iacute;cil generar una inyecci&amp;oacute;n de c&amp;oacute;digo mediante el envenenamiento de los par&amp;aacute;metros de retorno de la pila.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Para aquellos que quieran tener una visi&amp;oacute;n m&amp;aacute;s amplia de la orientaci&amp;oacute;n a objetos, as&amp;iacute; como muchas explicaciones, les recomiendo el libro de Bertrand Meyer, &lt;a href="http://www.amazon.es/Object-Oriented-Software-Construction-Prentice-Hall-International/dp/0136291554/ref=sr_1_2?ie=UTF8&amp;amp;qid=1335260520&amp;amp;sr=8-2"&gt;&lt;span style="color:#103ffb;text-decoration:underline;"&gt;&lt;em&gt;Construcci&amp;oacute;n de software orientado a objetos&lt;/em&gt;&lt;/span&gt;&lt;/a&gt; Segunda Edici&amp;oacute;n, que es un tocho de m&amp;aacute;s de mil p&amp;aacute;ginas denso como &amp;eacute;l solo&amp;hellip; Pese al proselitismo hacia &lt;em&gt;Eiffel&lt;/em&gt;, es un gran libro. Hay edici&amp;oacute;n en castellano de Prentice Hall (que es la que yo tengo), pero no s&amp;eacute; si se podr&amp;aacute; encontrar o no.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Otro no menor pero m&amp;aacute;s pr&amp;aacute;ctico, es &lt;a href="http://www.amazon.es/Code-Complete-Costruction-Construction-Professional/dp/0735619670/ref=sr_1_1?s=foreign-books&amp;amp;ie=UTF8&amp;amp;qid=1335260633&amp;amp;sr=1-1"&gt;&lt;span style="color:#103ffb;text-decoration:underline;"&gt;&lt;em&gt;Code Complete 2&lt;/em&gt;&lt;/span&gt;&lt;/a&gt; de Steven C. McConnell. Este es mucho m&amp;aacute;s pr&amp;aacute;ctico y orientado hacia el c&amp;oacute;digo real que escribimos las personas normales.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204620" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B002F00_cli/default.aspx">c++/cli</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>Windows Phone y las petisoperías</title><link>http://geeks.ms/blogs/rfog/archive/2012/04/12/windows-phone-y-las-petisoper-237-as.aspx</link><pubDate>Thu, 12 Apr 2012 07:45:58 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204405</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=204405</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=204405</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/04/12/windows-phone-y-las-petisoper-237-as.aspx#comments</comments><description>&lt;p&gt;Hay que joderse, que dijo aquél. Este podría ser el resumen de esta entrada. Ahora mismo veréis por qué.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Estoy empezando a jugar de forma más o menos seria con Windows Phone. Ya cuando salió, el no poder ejecutar código nativo básicamente me hizo pensar que Microsoft había perdido el tiempo y que WP iba a ser un gran y nuevo fracaso de la compañía que había perdido el norte, el sur, el este y el oeste…&lt;/p&gt;  &lt;p&gt;Pasa el tiempo y pese a todos los intentos de MS, WP no levanta cabeza. Ni cuota de mercado ni aplicaciones, comparándolo con Android e iOS, que crecieron mucho más rápido.&lt;/p&gt;  &lt;p&gt;Ahora sé algunas razones, imposibilidad de usar C++ incluída.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Windows Phone 7.0 no tiene sockets. Toma ya. Increíble. Para los legos: no hay posibilidad de crear ningún tipo de aplicación de chat, ni de comunicación remota a servidores ni nada parecido. Todo hay que hacerlo mediante HTTP, que no conserva el estado y necesita sobredimensionar el lado servidor frente al cliente…&lt;/p&gt;  &lt;p&gt;Whidows Phone 7.5 tiene sockets… de aquella manera. Cuando la aplicación pasa a background el socket se cierra, con lo que pierdes la persistencia en la comunicación. Aquí lo puedes solucionar mediante técnicas Push (que todavía no he visto e ignoro las limitaciones y ventajas que puedan tener). Pero de momento, aplicaciones verticales que requieran una conexión permanente tampoco están permitidas.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Ahora llega la última versión, con dispostivos de 256 MB de memoria… &lt;a name="http://www.developer.nokia.com/Community/Wiki/Best_practice_tips_for_delivering_apps_to_Windows_Phone_with_256_MB"&gt;&lt;/a&gt;&lt;a href="http://www.developer.nokia.com/Community/Wiki/Best_practice_tips_for_delivering_apps_to_Windows_Phone_with_256_MB"&gt;Y la vuelven a cagar.&lt;/a&gt; Dadas las limitaciones de los mismos, dejan de funcionar las tareas periódicas y las intensivas… Y te dicen que cuando lances la aplicación mires en qué dispositivos estás ejecutando y uses secuencias if/else para cambiar el comportamiento.&lt;/p&gt;  &lt;p&gt;En primer lugar eso es una soberana imbecilidad como una casa. ¿Tienes que codificar las cosas dos veces? Pues no, tendrás que hacerlo todo con la limitación predicha, porque si lo puedes hacer sin esos elementos, es una soberana gilipollez repetir el código. El problema vendrá cuando sin eso no puedas hacerlo.&lt;/p&gt;  &lt;p&gt;En segundo lugar, mientras los demás fabricantes implementan mejoras y optimizan el código de sus sistemas operativos, Microsoft hace lo contrario. Apple pasa de dispositvos de 256 MB de RAM a 512 y luego a 1024. Microsof pasa de 512 a 256, llevándose cosas de en medio.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Recuerdo la presentación de Windows Phone: que si sólo .NET, que si sólo procesadores multicore, que si sólo dispositivos de gama alta… Al final tienen que pasar por el aro, pero en lugar de abrir el Windows CE interno al lenguaje C y/o C++ y quitar la mierda del .NET, que seguro consume 40 de los 60 MB de la huella de memoria de cada proceso, van y quitan prestaciones… porque lo de las tareas asíncronas es sólo una de tantas limitaciones impuestas, que podéis leer en la entrada que os enlazo más arriba.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Resumendo, que van de mal en peor. RFOG dixit.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204405" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+CE/default.aspx">Windows CE</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>C++/CX (II). C++/CX vs WRL</title><link>http://geeks.ms/blogs/rfog/archive/2011/11/04/c-cx-ii-c-cx-vs-wrl.aspx</link><pubDate>Fri, 04 Nov 2011 19:13:32 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201533</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=201533</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=201533</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/11/04/c-cx-ii-c-cx-vs-wrl.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Bueno, una vez que hemos visto lo que hay &lt;a href="http://geeks.ms/blogs/rfog/archive/2011/10/31/c-cx-windows-8-y-el-nuevo-subsistema-winrt-i.aspx"&gt;dentro del nuevo Windows 8&lt;/a&gt;, y comprobado que WinRT &lt;a href="http://geeks.ms/blogs/rfog/archive/2011/11/02/191-winrt-un-subsistema-no-no-lo-es.aspx"&gt;no es un subsistema&lt;/a&gt; sino algo por encima de Win32 como es .NET, vamos a contaros las dos formas que hay de programar con C++ para la interfaz Metro.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Ya lo he comentado antes, pero voy a repetirlo aquí por mor de claridad. En Windows 8 hay dos escritorios diferentes. Por un lado tenemos el clásico de toda la vida que es prácticamente idéntico al de Windows 7, y por otro el de la interfaz Metro. Si no cambian las cosas, los equipos que lleven un procesador x86 tendrán acceso indistinto a los dos, mientras que aquellos que lleven procesador ARM sólo verán la interfaz Metro.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Eso quiere decir que habrá dos tipos de aplicaciones: las clásicas y las Metro. Las primeras sólo podrán compilarse para x86 (de 32 o de 64 bits) y sólo funcionarán en las máquinas Intel. Si estamos en la interfaz Metro y lanzamos una aplicación de este tipo, el sistema cambiará al escritorio clásico.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Las segundas podrán compilarse para x86 o para ARM y en ambos casos funcionarán en sus propios sistemas, pero siempre bajo la interfaz Metro. Es decir, si queremos que nuestra aplicación Metro escrita con código nativo pueda correr en los dos tipos de arquitectura, tendremos que proveer dos compilaciones.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Con .NET (C# y &lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt;) viene a pasar lo mismo, aunque en este caso creo que con especificar AnyCPU será suficiente para que la aplicación corra en ambas arquitecturas. Y de nuevo tendremos los dos tipos de aplicaciones: de escritorio y Metro, con las mismas reglas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Por lo tanto, cualquier programa escrito en cualquier lenguaje que funcione ahora mismo en Windows 7, no debe tener ningún problema en ejecutarse en la siguiente versión, pero siempre en el escritorio clásico. Y podremos seguir escribiéndolos como hasta ahora.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Eso quiere decir que tenemos dos API diferentes e incompatibles entre sí. Por un lado tenemos el API de Win32 clásico y tradicional, sobre el que se construyen bibliotecas de terceros y el .NET. Aquí podemos meter VB6, Delphi, C#, C++/CLI, QT… Vamos, lo que hasta ahora.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Y para Metro hay una nueva API que se llama WinRT. Creo que hay cosas compartidas con Win32, pero no me hagáis mucho caso porque todavía no he visto nada. De todos modos si las hubiera, podemos tomarlas como si fueran nuevas, porque son excluyentes, al menos de momento.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Es decir, o bien desarrollas para Win32 o bien para WinRT, pero no puedes tener un ejecutable que use partes del otro más allá de las que MS ha querido compartir, y entre ellas no se encuentra C++/CX.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Por lo tanto también hay dos versiones de .NET. La de la interfaz Metro se construye sobre WinRT, y la clásica sobre Win32. Nos podemos hacer a la idea de que, aunque tengamos un API con nombres similares, por dentro funciona todo diferente (lo que no es cierto, pero a efectos prácticos sí que lo es, ya que las aplicaciones Metro deberán ir firmadas y el proceso de firmado garantiza que no vas a salirte de las API estándar -¿De qué me sonará eso?).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;No obstante, WinRT no está escrito con C++/CX si no que está hecho con C++ clásico. Y en cierto modo es lógico, ya que no es más que una extensión a Win32, que es C y C++. Además, independientemente de mis diatribas personales, es algo bueno que le añada funcionalidad a un API que lleva tanto tiempo funcionando con regularidad y sin grandes problemas. Imaginaos los bugs que podría tener algo escrito desde cero.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Por lo tanto, podemos desarrollar aplicaciones para Metro sin usar .NET ni C++/CX. Podemos utilizar C++ y una biblioteca de plantillas llamada WRL (Windows Runtime Library), que viene a ser algo así como el ATL de Metro.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Microsoft no recomienda usarla, más que nada porque es compleja y porque de momento no hay documentación alguna sobre ella, pero está ahí, y es la base de Metro.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Si queremos echarle un vistazo, podemos acercarnos a “Program Files (x86)\Windows Kits\8.0\Include\winrt\wrl” y ver qué hay dentro. Tomaos un par de aspirinas antes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Básicamente se trata de toda la infraestructura y parafernalia para acceder a los objetos COM y componentes de Metro.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;C++/CX ocupa el nicho de lenguaje nativo para Metro, con lo que es más rápido que C# y que &lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt;, y es con el único con el que se puede acceder a DirectX (y por tanto a la creación de juegos). También es nativo. Es decir, que no es .NET y compila al código máquina que todos conocemos y de hecho es idéntico al C++ de toda la vida.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Lo que ocurre es que contiene una serie de extensiones que nos van a facilitar la vida a la hora de operar con Metro y sus componentes. Soporta clases parciales, se entiende bien con XAML e instanciar o crear un componente COM es un juego de niños comparado a como se hace con Win32.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Digamos que con esas extensiones nos ahorramos una buena faena a la hora de programar, y será el compilador el que sustituya esa &lt;em&gt;azúcar sintáctica&lt;/em&gt; por el código necesario.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;En siguientes entradas os contaré más sobre C++/CX.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201533" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx">C++/CX</category></item><item><title>El compilador como servicio</title><link>http://geeks.ms/blogs/rfog/archive/2011/10/21/el-compilador-como-servicio.aspx</link><pubDate>Fri, 21 Oct 2011 17:16:52 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201299</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=201299</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=201299</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/10/21/el-compilador-como-servicio.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Me he quedado poco menos que estupefacto con &lt;a href="http://blogs.msdn.com/b/somasegar/archive/2011/10/19/roslyn-ctp-available-now.aspx"&gt;esta entrada&lt;/a&gt; del blog de SomaSegar. Y no, no penséis mal, que no es malo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Básicamente viene a decirnos que está disponible la CTP de “Roslyn”, que según entiendo es una extensión -de momento- a Visual Studio 2010 SP1. De hecho nos la &lt;a href="http://msdn.microsoft.com/es-es/roslyn"&gt;podemos bajar&lt;/a&gt; y jugar con ella.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Comienza diciendo que los compiladores se han venido haciendo en C++ nativo, pero que ya es hora de cambiar y que han rehecho los compiladores de C# y de Visual Basic desde cero en… Visual Basic.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Hay que joderse. La primera en la boca. ¿Pero no decían que el compilador y el propio .NET estaban hechos en C# (lo siento, no encuentro la referencia)? Ahora no, ahora resulta que C# está escrito en C++.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Y la segunda, también: C# está hecho en Visual Basic.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;O están tontos, o yo no me entero, o mienten más que hablan. Para nada me extraña de que hubieran mentido en lo de hacer C# en C++, de hecho es lo lógico y coherente, ¡pero construirlo todo en VB?&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;De todos modos dejemos esto aquí, corramos un estúpido velo, y centrémonos en el meollo del artículo: compilador como servicio.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Es decir, en Visual Studio 11 los compiladores de C# y VB no serán ejecutables, sino servicios expuestos al público (espero que haya uno para invocarlo desde la línea de comandos), de modo que cualquiera podrá compilar.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;No solo eso, sino que dejarán de ser una &lt;em&gt;caja negra&lt;/em&gt; que, a partir de un código fuente, genera una salida compilada, sino que podremos acceder a los diferentes estados del proceso de compilación, e incluso podremos realizar solo unos pasos, como análisis semántico o la obtención del código IL (ensamblador del .NET).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Eso posibilita la creación de &lt;em&gt;scripts&lt;/em&gt; en una consola interactiva. ¿Recuerdan la consola aquella que tenía el Visual FoxPro que permitía ir encadenando comandos como si programáramos? Pues lo mismo, pero en VB y en C#. Vamos, que reinventan la rueda.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;En la entrada original hay un par de imágenes enseñando lo que puede hacer.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;min-height:17.0px;"&gt; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201299" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>WinTablet.info: Windows 8 y los Tablet</title><link>http://geeks.ms/blogs/rfog/archive/2011/09/25/wintablet-info-windows-8-y-los-tablet.aspx</link><pubDate>Sun, 25 Sep 2011 09:43:55 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200711</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=200711</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=200711</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/09/25/wintablet-info-windows-8-y-los-tablet.aspx#comments</comments><description>&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Ya sabéis que me gusta meter baza en los nuevos productos de Microsoft más que a un pollo la mierda. No creo que os pille de sorpresa, pero en este caso estamos hablando de caviar Beluga ya que encima tenemos dominio y web propia.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Sí, lo que leéis, el RFOG ha sido invitado a participar en un &lt;a href="http://wintablet.info/"&gt;blog&lt;/a&gt; de temática exclusiva sobre Windows 8 y su orientación hacia los Tablet. Sin restricción de temática, sin censura y con libertad total de publicar lo que quiera (no, que no se os abran los ojos como platos, de momento no voy a poner porno).&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Bueno, después de la presentación chula, vienen los detalles. Nos hemos juntado cuatro interfectos de entre los indeseables de la internet y que encima somos granos en el culo de las grandes corporaciones y nos hemos decidido a poner los puntos sobre las íes en el tópico descrito más arriba. La idea fue originalmente de &lt;a href="http://tinta-e.blogspot.com/"&gt;Juan Luis Chulilla&lt;/a&gt;, quien la propuso a &lt;a href="http://ultramobilepc-tips.blogspot.com/"&gt;Ctitanic&lt;/a&gt; y a mi. No hace falta decir que tardamos 100 milisegundos en decir que sí, que es el tiempo medio de reacción entre el ojo y el cerebro (para aquellos que tengan neuronas, claro). Luego se nos unió Mahjong, y así formamos el &lt;em&gt;cuarteto concertante&lt;/em&gt; (la referencia es de Verne).&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Dicho y hecho, sólo faltaba arremangarse y empezar a escribir, así que el sitio ya contiene entradas chulas, aunque todavía anda algo en obras y debéis poneos casco no sea que se os caiga algún ladrillo en la cocorota.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Para aquellos que todavía estéis en Babia, os comento. Windows 8 es la siguiente versión de Windows 7, y viene en &lt;em&gt;modo dual&lt;/em&gt;. Es decir, que trae dos&lt;em&gt;Shell&lt;/em&gt; de usuario. La primera es la que todos ya conocemos, con su menú inicio, su explorador y su Internet Explorer, con las &lt;em&gt;mejoras&lt;/em&gt; pertinentes. Lo pongo en cursiva porque hay mucha gente a la que la &lt;em&gt;Ribbon&lt;/em&gt; en el Explorador no les mola nada… a mí sí.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;La segunda interfaz se llama Metro y está destinada a los Tablet, sean del tipo que sean. Si habéis visto Windows Phone ya tenéis una idea de qué es. Como siempre con las tecnologías de Microsoft, debajo hay más de lo que parece, y también ahora ocurre así.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;A simple vista Metro parece nada más que una interfaz de apretar botones, pero dentro existe un motor basado en DirectX muy potente e interesante, envuelto en una capa que se programa con C# y una variante de C++/CLI. Y no es .NET, es nativa. De esto os contaré más aquí, pero en otro momento.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Finalmente también hay una &lt;em&gt;preview&lt;/em&gt; de la siguiente versión de Visual Studio que es capaz de generar ejecutables para esta nueva plataforma, y de esto también hablaré por aquí.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Bueno, lo dicho, daos una vuelta por &lt;a href="http://wintablet.info/"&gt;WinTablet.info&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200711" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B002F00_cli/default.aspx">c++/cli</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx">C++ Builder</category></item><item><title>Un caso de fracaso... o dos</title><link>http://geeks.ms/blogs/rfog/archive/2010/11/04/un-caso-de-fracaso-o-dos.aspx</link><pubDate>Thu, 04 Nov 2010 21:28:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:184369</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=184369</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=184369</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2010/11/04/un-caso-de-fracaso-o-dos.aspx#comments</comments><description>&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Bueno, esta es otra de esas entradas nada t&amp;eacute;cnicas y personal&amp;iacute;simas, en la que voy a contar varias cosas, respoder a las inquietudes que &lt;i&gt;asertus&lt;/i&gt; ha comentado en la &lt;a href="http://geeks.ms/blogs/rfog/archive/2010/11/01/el-rfog-se-ha-vuelto-un-fanboy-o-casi.aspx"&gt;&lt;span class="s1"&gt;entrada anterior&lt;/span&gt;&lt;/a&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Generalmente los &lt;i&gt;casos de &amp;eacute;xito&lt;/i&gt; se suelen airear a lo grande, a bombo y platillo, con grandes titulares, pero los fracasos se suelen ocultar debajo de la alfombra, y cuanto menos se sepa de ellos, mejor.&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Pues bien, yo voy a contar aqu&amp;iacute; un proyecto que ha fracasado, o al menos lo ha hecho seg&amp;uacute;n el planteamiento original, y luego comentar&amp;eacute; algo sobre Evernote 4 y su bajada de WPF&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Aparte del firmware, y a veces junto con &amp;eacute;l, suelo entregar una aplicaci&amp;oacute;n para PC que se encarga de lidiar con la electr&amp;oacute;nica que vendemos, o simplemente demuestra su funcionamiento, aunque las m&amp;aacute;s de las veces sirve como herramienta de configuraci&amp;oacute;n y verificaci&amp;oacute;n.&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Es un proyecto bastante complejo que ha arrancado y parado varias veces, ha mutado y vuelto a mutar, pero al final estuvo claro qu&amp;eacute; se quer&amp;iacute;a, y c&amp;oacute;mo. Fue tiempo de ponerse a picar c&amp;oacute;digo como un loco. De eso hace unos meses, y m&amp;aacute;s o menos el esfuerzo dur&amp;oacute; como dos meses hasta que nuevas y m&amp;aacute;s urgentes tareas volvieron a pausarlo, pero esta vez no porque se llegara a un callej&amp;oacute;n sin salida (y no me refiero a t&amp;eacute;cnico, sino comercial o de concepto), sino porque se vio que hab&amp;iacute;a tareas de mayor prioridad.&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Se detuvo en un punto interesante: la parte del PC estaba casi terminada, por lo menos la primera fase, y ya iba a pasar al hardware, aunque estim&amp;eacute; que necesitar&amp;iacute;a otra semana m&amp;aacute;s para estar listo y empezar con la interoperabilidad entre el PC y la electr&amp;oacute;nica. Una siguiente iteraci&amp;oacute;n, cuando programa y placa se hablaran entre ellos, volver&amp;iacute;a al PC para finiquitarlo y dedicar el resto del tiempo al desarrollo embebido, &lt;i&gt;cienes y cienes&lt;/i&gt; de variantes del firmware que el programa del PC deber&amp;iacute;a ensamblar e insertar en la placa&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Esos dos meses fueron un poco como de pesadilla. Entusiasmado y emocionado, con mucha ilusi&amp;oacute;n, comenc&amp;eacute; a hacerlo con el Feature Pack de Visual Studio 2008. S&amp;iacute;, ya sab&amp;eacute;is, la Ribbon, las ventanas estilo Visual Studio y todo eso, la &amp;uacute;ltima versi&amp;oacute;n de MFC. De esa pelea, porque pelea sin cuartel fue, ten&amp;eacute;is las &amp;uacute;ltimas entradas de mi &lt;a href="http://www.elguille.info/MFC/Default.aspx"&gt;&lt;span class="s1"&gt;secci&amp;oacute;n MFC en el Guille&lt;/span&gt;&lt;/a&gt;. En concreto iba a aprovechar todo un esqueleto de Visual Studio incluyendo el control de propiedades igual que se trabaja con .NET. Es decir, el programa tendr&amp;iacute;a un Editor de Propiedades y una &amp;ldquo;Paleta de Componentes&amp;rdquo; como las tiene el .NET. Pero relacionadas con mi firmware, y el usuario podr&amp;iacute;a coger &lt;i&gt;pedazos&lt;/i&gt; de firmware, echarlos sobre un contenedor y luego ir cambiando las propiedades. Finalmente, una opci&amp;oacute;n enviar&amp;iacute;a dicho firmware a la placa.&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Bonito, &amp;iquest;no?&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Bueno, pues fue un fracaso. No solo tuve que pelearme con todas y cada una de las cosas que iba a&amp;ntilde;adiendo, sino que luego no funcionaban ni como estaban documentadas (en el caso de que lo estuvieran) ni como dicta la raz&amp;oacute;n. Entre las cosas que me cost&amp;oacute; mucho hacer funcionar est&amp;aacute; el personalizar las barras de herramientas, hacer funcionar el editor de propiedades, y que el modelo Documento/Vista funcionara como yo quer&amp;iacute;a&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;No voy a contar ninguna pelea, ni voy a poner el grito en el cielo, ya no, ya me he cansado de predicar en el desierto. B&amp;aacute;sicamente me tuve que leer medio internet, y navegar hasta las profundidades del c&amp;oacute;digo fuente de MFC para, en primer lugar saber c&amp;oacute;mo funcionaba y por qu&amp;eacute; hac&amp;iacute;a lo que hac&amp;iacute;a, y en segundo para saber c&amp;oacute;mo heredar y cambiar el comportamiento y mirar por qu&amp;eacute; no funcionaba como se esperaba&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;El summum de la desesperaci&amp;oacute;n vino cuando pas&amp;eacute; el proyecto a Visual Studio 2010 y empezaron a aparecerme fugas de memoria que en la versi&amp;oacute;n 2008 no hab&amp;iacute;a (o si las hab&amp;iacute;a no eran detectadas)&amp;hellip; as&amp;iacute; que volv&amp;iacute; a la versi&amp;oacute;n 2008SP1.&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Pero ah&amp;iacute; no terminan las cosas, las cosas terminan cuando, de repente, los di&amp;aacute;logos dejaron de funcionar. Me explico. Tengo varias clases base heredadas de CDialogEx que usan una plantilla de di&amp;aacute;logo y que implementan el contenido com&amp;uacute;n. Luego heredo de ellas una jerarqu&amp;iacute;a pero sin plantilla y con pocas l&amp;iacute;neas modifico el comportamiento. No son muchas, son cuatro clases base de las que heredan cuatro hijas de cada una de ellas, pero que creadas de esta forma ahorran muchos dolores de cabeza y concentran la funcionalidad siempre en un mismo sitio.&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Pues bien, eso dej&amp;oacute; de funcionar, de repente, sin tocar nada. No he investigado mucho, pero parece ser que la cadena de constructores se interrumpe cuando uno de ellos es incapaz de encontrar el recurso de di&amp;aacute;logo en el ejecutable, di&amp;aacute;logo que seguro existe, no tiene ning&amp;uacute;n problema y que puedo ver en el editor de Visual Studio. El constructor retorna a medio construir, y cuando se llama a ShowDialog() se dispara un ASSERT que pone un insulso mensaje en la ventana de Debug y ni se abre el di&amp;aacute;logo, ni se genera una excepci&amp;oacute;n, ni pasa nada de nada. Como el silencio administrativo pero en programa.&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Ah&amp;iacute; fue cuando decid&amp;iacute; parar la vez anterior, o m&amp;aacute;s bien lleg&amp;oacute; la fecha l&amp;iacute;mite y tuve que cambiar a otra cosa. A &amp;uacute;ltimos de la semana pasada retom&amp;eacute; el proyecto, v&amp;iacute; lo de los construtores y&amp;hellip; &lt;b&gt;lo mand&amp;eacute; a tomar por culo&lt;/b&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Con esas misma palabras.&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;El martes empec&amp;eacute; una versi&amp;oacute;n limitada en funcionalidad, en Windows Forms y C#. B&amp;aacute;sicamente se abre un di&amp;aacute;logo que deja elegir entre unos m&amp;oacute;dulos, y luego, Form a Form, permite modificar el comportamiento. Y finalmente d&amp;aacute;ndole a un bot&amp;oacute;n env&amp;iacute;as el resultado. La aplicaci&amp;oacute;n se guarda a s&amp;iacute; misma, la informaci&amp;oacute;n est&amp;aacute; en ficheros INI de texto, y tiene casi toda la funcionalidad que la anterior, pero hecho de forma bastante m&amp;aacute;s chapucera.&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Tambi&amp;eacute;n me he encontrado con alg&amp;uacute;n tropiezo, pero en su mayor&amp;iacute;a debido a mi propia torpeza. De todos modos estamos a jueves (han pasado tres d&amp;iacute;as) y&amp;hellip; &amp;iexcl;Ya estoy en la misma fase en la que acab&amp;eacute; la otra vez! Es decir, he tardado 3 d&amp;iacute;as a hacer en .NET lo que en MFC me llev&amp;oacute; casi dos meses. Evidentemente no es la misma aplicaci&amp;oacute;n ni de lejos, ni tan bonita ni tan funcional como era la otra, y creo que no me atrever&amp;iacute;a a hacer algo de complejidad similar en C#. Ya no me f&amp;iacute;o despu&amp;eacute;s de c&amp;oacute;mo las he pasado con .NET&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;No me malinterpret&amp;eacute;is, con esto que os he contado no quiero decir que .NET sea la rehostia, que no lo es, de hecho ahora tengo un problema con un thread que me parece que es una limitaci&amp;oacute;n (que no un bug) de .NET&amp;hellip;&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Por otro lado, y es un consenso entre varios MVP de C++ y entre los programadores en general, que el Feature Pack es algo &lt;i&gt;bloated&lt;/i&gt;, a-funcional y lleno de enormes torpezas. Complejo a conciencia, escasamente documentado, y la versi&amp;oacute;n 2010 tiene fugas de memoria internas (Haced la prueba: construid una aplicaci&amp;oacute;n de cuadro de di&amp;aacute;logo sin m&amp;aacute;s, ejecutadla y cerradla. La ventana de depuraci&amp;oacute;n os dar&amp;aacute; fugas de memoria sin que el usuario haya a&amp;ntilde;adido una sola l&amp;iacute;nea de c&amp;oacute;digo).&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;A&amp;ntilde;adamos que nos genera ejecutables de m&amp;aacute;s de 2 megas de tama&amp;ntilde;o&amp;hellip; Ciertamente un fracaso, y no propio. Yo al menos me he sacado las casta&amp;ntilde;as del fuego en tres d&amp;iacute;as, a ver lo que tarda Microsoft.&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;***&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Otra de las noticias que est&amp;aacute; corriendo como la p&amp;oacute;lvora es que Evernote 4 ha abandonado WPF en pro de C++ y del c&amp;oacute;digo nativo. M&amp;aacute;s o menos cuentan lo que yo ya dije hace mucho tiempo: .NET no vale para aplicaciones de sistema ni para nada medianamente complejo que no sea para lo que se ha pensado, que son aplicaciones verticales de bases de datos sin muchos Forms (ni muy complejos) y como competencia directa de Java (que todav&amp;iacute;a vale menos, IMHO).&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Una prueba de ellos es que, a fecha de hoy, ninguna aplicaci&amp;oacute;n de Microsoft est&amp;aacute; enteramente hecha en .NET. No Office, ni partes interesantes de Windows, ni otras herramientas &lt;i&gt;enterprise&lt;/i&gt;. Lo m&amp;aacute;s cercano es el editor de Visual Studio 2010, que no est&amp;aacute; mal pero que funciona sensiblemente m&amp;aacute;s lento que el del 2008, y cuando digo m&amp;aacute;s lento es m&amp;aacute;s lento. En mi caso, a veces ni siquiera me pilla un doble clic r&amp;aacute;pido. Adem&amp;aacute;s, como muestra un bot&amp;oacute;n, ya que la gente que estaba haciendo el editor tuvo que ponerse seria con la que hac&amp;iacute;a WPF para que solucionaran serios problemas tanto de rendimiento como de funcionalidad, o al menos eso es lo que se deja entrever en algunas noticias y se comenta en los mentideros de la red.&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Hay un tercer problema, y es que la supuesta unificaci&amp;oacute;n del API de .NET para deshacerse del de Win32 se est&amp;aacute; convirtiendo, con el tiempo, igual de disparejo, con las mismas inconsistencias entre diferentes partes&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Es muy posible que en fechas no muy lejanas veamos morir a m&amp;aacute;s lenguajes .NET, seguro que C++/CLI entre ellos. De momento en Visual C++ 2010 no tiene IntelliSense porque al parecer no les dio tiempo a implementarlo, pero es que tampoco se ha actualizado para a&amp;ntilde;adir algunas de las cosas de .NET 4.0&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;As&amp;iacute; que, una vez desaparecido &amp;eacute;ste, gente del Visual Basic, poneros a remojo. Y los Accesseros tambi&amp;eacute;n. Son mis 2 c&amp;eacute;ntimos sin usar informaci&amp;oacute;n privilegiada de ning&amp;uacute;n tipo, pero son cosas que se ven venir. Y ya de paso metamos a Windows Phone, que tampoco creo que dure mucho y eso que acaba de nacer&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Volviendo a Evernote, y habiendo hecho un an&amp;aacute;lisis somero, parece ser que han utilizado WTL, ATL y STL, con librer&amp;iacute;as de terceros, pero no MFC (No me extra&amp;ntilde;a). De hecho, aplicaciones masivamente utilizadas como Chrome o Picasa no usan ni MFC ni WPF (ni .NET). Por algo ser&amp;aacute;.&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Tampoco han usado QT, cosa que en principio me extra&amp;ntilde;a un poco porque es EL FRAMEWORK de moda y de &amp;eacute;xito&amp;hellip; Yo llevo bastante tiempo detr&amp;aacute;s de aprender QT, pero no me decido. Cojo un libro, leo un par de cap&amp;iacute;tulos y lo dejo, para repetir al cabo de unos meses. Ahora con el iMAC en marcha veo QT de otra forma, y de hecho los dos libros de Cocoa (el de la Vespa y el Unleashed) creo que van a dormir el sue&amp;ntilde;o de los justos&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span style="font-size:small;"&gt;Ah, por cierto, esta entrada ha sido escrita con Word 2008 para MAC,  guardada como un fichero HTML, cargado en el IE 7 con una máquina virtual windows, visto su código fuente y copiado directamente como HTML en el editor WEB del blog (cosas de la interoperabilidad). Las aplicaciones Windows han estado corriendo en modo Unity y, Asertus, de momento tengo tanta faena en el curro que cuando llego a casa (antes no llegaba a casa, &lt;i&gt;estaba &lt;/i&gt;en casa) s&amp;oacute;lo tengo tiempo y ganas de bajarme el correo personal, navegar un rato e irme a dormir. Tengo instalado QT tanto en la virtual Windows como en el iMAC, pero apenas lo he usado por encima, y eso que me est&amp;aacute; rondando una idea para un juego que&amp;hellip;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=184369" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category></item><item><title>Sobre delegados, closures, punteros y la falacia del puntero loco</title><link>http://geeks.ms/blogs/rfog/archive/2010/07/30/sobre-delegados-closures-punteros-y-la-falacia-del-puntero-loco.aspx</link><pubDate>Fri, 30 Jul 2010 10:45:20 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:180059</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=180059</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=180059</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2010/07/30/sobre-delegados-closures-punteros-y-la-falacia-del-puntero-loco.aspx#comments</comments><description>&lt;p align="justify"&gt;Leía esta mañana –mientras se carga una serie de gráficos en mi actual proyecto- el blog de &lt;a href="http://geeks.ms/blogs/mposadas/"&gt;Marino Posadas&lt;/a&gt; que, aunque publica poco, publica bien, y me he quedado más que estupefacto con lo que nos ha contado. He de matizar que en ningún momento dudo de la palabra de Marino, y es por eso por lo que me ha llamado tanto la atención de lo que nos ha contado.&lt;/p&gt;  &lt;p align="justify"&gt;Antes de seguir aquí lo mejor es que leáis su &lt;a href="http://geeks.ms/blogs/mposadas/archive/2010/07/28/anders-191-por-qu-233-creaste-los-delegados.aspx?CommentPosted=true#commentmessage"&gt;entrada&lt;/a&gt;, y volváis a esta.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;El primer malentendido sobre el texto nos lo ha solucionado el propio Marino en los comentarios: no, Anders no se tiró seis meses para &lt;i&gt;inventar&lt;/i&gt; los delegados, sino que estuvo tal tiempo creando el .NET, y durante el cual salió la idea del delegado. Haremos la vista gorda e ignoraremos el hecho de que en Delphi (y C++ Builder) el propio Anders ya tenía algo así.&lt;/p&gt;  &lt;p align="justify"&gt;Además, siempre he dicho que el delegado es el paso siguiente al puntero a función y/o función de retrollamada (o &lt;i&gt;callback&lt;/i&gt;, como le se suele citar habitualmente). Eso también queda fuera de toda discusión.&lt;/p&gt;  &lt;p align="justify"&gt;Cuenta Marino que Anders primero analizó que una mayoría de las BSOD en Windows venían a cuenta de drivers defectuosos, y que otra &lt;i&gt;mayoría&lt;/i&gt; venía causada por una variación sobre un mismo tema: el moldeo o &lt;i&gt;casting&lt;/i&gt; incorrecto de punteros a función, algo que es bastante común en el desarrollo de sistemas.&lt;/p&gt;  &lt;p align="justify"&gt;Por lo tanto, para acabar con el segundo problema, decidió implementar los delegados en .NET. Aquí tenemos la primera falacia de todas, y encima autocontenida. Es decir, los delegados están en .NET, pero no en la creación de drivers, ni en la de software de sistemas, que se sigue haciendo en C++, así que solución, nada de nada.&lt;/p&gt;  &lt;p align="justify"&gt;Claro, a no ser que pensara que el mundo™ iba a abandonar sus millones de líneas de código™ y se iba a pasar derechito al .NET™, acabando en un par de meses con el &lt;i&gt;infierno de los punteros&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Espero que ya se haya dado cuenta de que no, que el .NET está y sirve para lo que está y sirve, y para nada más. Por lo tanto, está claro que &lt;i&gt;no ha acabado con el problema de los punteros locos&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Lo que ha hecho ha sido crear una plataforma de desarrollo en la que se minimiza el problema, pero el código nativo (nuevo y viejo) sigue adoleciendo del mismo. Además, en .NET un delegado vacío, hasta donde llego, lanza una excepción, de igual forma que la ejecución de un puntero a función nulo lanza, también, una excepción, que si eres buen programador, habrás capturado. &lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Vamos ahora a por la segunda falacia. ¿Sabéis qué es en realidad un delegado? Pues un delegado es una clase normal y corriente, pero que está cableada en cierta medida dentro del compilador de C#. De hecho, en C++/CLI podemos usarla como una clase más. Podéis leer algo sobre esto &lt;a href="http://rfog.cmact.com/CppCLI/Eventos_a_la_net.pdf"&gt;aquí&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;¿Y qué hace esa clase? Pues tiene un constructor que viene a recibir un puntero a método o función global. Tiene un método que es el que ejecutará ese puntero recibido. Y tiene una serie de eventos y sobrecarga de operadores que nos permiten la semántica de utilizar “+=” y “-=” para añadir/quitar punteros a función. &lt;/p&gt;  &lt;p align="justify"&gt;Y cuando mandamos ejecutar el delegado, lo que hace es comprobar si el puntero es válido, y si lo es, lo ejecuta. Y si se trata de un delegado &lt;i&gt;multicast&lt;/i&gt;, entonces contiene una &lt;i&gt;bolsa&lt;/i&gt; de punteros a función que va comprobando que sean válidos y ejecutando uno detrás de otro.&lt;/p&gt;  &lt;p align="justify"&gt;Ni más ni menos.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Ahora vamos a lo que vamos, que es la tercera falacia y la más importante de todas. ¿Sabíais que con C++ hacer eso mismo es casi trivial? ¿Sabíais que ya está hecho en Boost (no lo he mirado, pero me apuesto un gallifante a que los hay, y seguro que de varios tipos)? ¿Realmente quería Anders acabar con el tema de los problemas con las funciones de retrollamada? No lo creo, ya que si eso realmente hubiera estado en su agenda, lo que se habría hecho es modificar Win32 para que aceptara un objeto de tipo delegado creado con alguna clase de C++, con un operador puntero para C.&lt;/p&gt;  &lt;p align="justify"&gt;Porque niños, hacer eso mismo en C++ no sólo es trivial, sino mucho más directo, ya que podemos sobrecargar el operador de llamada a función y el de puntero, como nos lo demuestran los predicados de la STL… Pero claro, Anders tiene que barrer para casa y expresar las &lt;i&gt;genialidades&lt;/i&gt; de .NET y C#...&lt;/p&gt;  &lt;p align="justify"&gt;En fin…&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=180059" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B002F00_cli/default.aspx">c++/cli</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>Uniones en C#</title><link>http://geeks.ms/blogs/rfog/archive/2010/04/28/uniones-en-c.aspx</link><pubDate>Wed, 28 Apr 2010 18:09:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:175601</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=175601</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=175601</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2010/04/28/uniones-en-c.aspx#comments</comments><description>&lt;p align="justify"&gt;Hay veces que uno no encuentra lo que busca, y cuando no lo está buscando, lo encuentra. O algo así. El hecho está en que empecé a hacer una pequeña utilidad interna en C# que necesitaba bastantes estructuras y encima con campos repetidos.&lt;/p&gt;  &lt;p align="justify"&gt;Eso en C++ es fácil de solventar. Un se crea una jerarquía de estructuras igual que podría hacerlo de clases, y listo. Es decir, si yo necesito tres estructuras diferentes que tengan, por ejemplo, varios campos del mismo nombre y tipo, lo más fácil es crear una estructura base y heredar de ella. Algo así:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;struct Base
{
    string Nombre;
    string NombreAlternativo;
};

struct Casa:public Base
{
    string Dirección;
};

struct Coche:public Base
{
    string Propietario;
};&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;De este modo ahorro escritura, ya que tanto la estructura Casa como Coche tendrán los campos Nombre y NombreAlternativo sin haberlos tenido que teclear. Suena un poco trivial pero cuando tienes diez o doce estructuras lo agradeces, incluso de esta forma te evitas los errores de tecleo y pones en una de ellas un campo con “Nonbre” en lugar de Nombre.&lt;/p&gt;

&lt;p align="justify"&gt;Eso en C++, en C# llega uno tan contento, se pone a picar código y… ¡ñas, no deja! El compilador protesta como un loco…&lt;/p&gt;

&lt;p align="justify"&gt;Me voy a la ayuda y, efectivamente, una limitación más del .NET: pese a que ellas mismas heredan de ValueType e indirectamente de Object (por cierto realizando una metástasis muy extraña y pasando de ser un tipo-referencia, como es Object, a un tipo-valor…)&lt;/p&gt;

&lt;p align="justify"&gt;Pero sigo leyendo para abajo y me encuentro con una sorpresa, y es cómo hacer uniones aprovechando los atributos. &lt;/p&gt;

&lt;p align="justify"&gt;El tema está &lt;a href="http://msdn.microsoft.com/en-us/library/aa288471(v=VS.71).aspx"&gt;aquí&lt;/a&gt;, y básicamente viene a decir, en la sección “Attributes on Structs”, que utilizando los atributos “LayoutKind.Explicit” y “FieldOffset”, podemos definir el punto de inicio de cada elemento de la estructura de forma manual.&lt;/p&gt;

&lt;p align="justify"&gt;Veamos un ejemplo muy socorrido en C/C++ en relación a las direcciones IP, que todos hemos manejado alguna vez. Una dirección IP se puede ver como un entero sin signo de 32 bits (que es como las ve el software) o como cuatro números situados entre 0 y 255. Esto en C/C++ se puede expresar así:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;union IP
{
    __int32 As32bits;
    unsigned char asBytes[4];
};&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Para referirnos a ellas, podemos usar ambas partes y ambas serán el mismo valor:&lt;/p&gt;

&lt;pre&gt;IP miIP;
miIp.AsBytes[0]=192;
miIp.AsBytes[0]=168;
miIp.AsBytes[0]=1;
miIp.AsBytes[0]=1;&lt;/pre&gt;

&lt;p align="justify"&gt;Y como miIP.As32bits tendremos en valor equivalente.&lt;/p&gt;

&lt;p align="justify"&gt;Pues bien, en C# esto se puede conseguir más o menos así:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;using System.Runtime.InteropServices;
[StructLayour(LayoutKind.Explicit)]
struct IP
{
    [FieldOffset(0)]
    Public Int32 As32bits;
    [FieldOffset(0)]
    Public byte a;
    [FieldOffset(1)]
    Public byte b;
    [FieldOffset(2)]
    Public byte c;
    [FieldOffset(3)]
    Public byte d;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Y podríamos acceder a ella tanto asignando los valores a, b, c, d como As32bits. También podríamos añadirlo como un array, pero eso queda de ejercicio de clase. &lt;/p&gt;

&lt;p align="justify"&gt;(NOTA: La entrada está escrita sin comprobar el código, por lo que podría haber algún gazapo. De todos modos, la esencia del código es correcta.)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=175601" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Algunos bugs del Compact Framework</title><link>http://geeks.ms/blogs/rfog/archive/2010/04/21/algunos-bugs-del-compact-framework.aspx</link><pubDate>Wed, 21 Apr 2010 09:51:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:171010</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=171010</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=171010</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2010/04/21/algunos-bugs-del-compact-framework.aspx#comments</comments><description>&lt;p&gt;No llevo ni mil l&amp;iacute;neas de c&amp;oacute;digo de un nuevo proyecto embebido en C# y ya me he encontrado con al menos cinco bugs. En su momento abandon&amp;eacute; C# para escritorio porque era un juguetito que apenas daba de s&amp;iacute; para realizar aplicaciones de sistemas medianamente complejas. El mayor problema estribaba en que como te salieras de lo que los &lt;i&gt;sabios&lt;/i&gt; hab&amp;iacute;an determinado, aquello no funcionaba ni para atr&amp;aacute;s. Cosas que fallaban, muchas. Las m&amp;aacute;s flagrantes eran serios problemas con los constructores est&amp;aacute;ticos, agravados en el caso de que se produjera una excepci&amp;oacute;n dentro de ellos, excepciones que no se lanzaban cuando deb&amp;iacute;an, y un largo etc&amp;eacute;tera en relaci&amp;oacute;n a elementos de Windows Forms.&lt;/p&gt;
&lt;p&gt;Tengo constancia de que muchos de esos problemas han sido solucionados con los distintos Service Packs que le han ido saliendo a la versi&amp;oacute;n 2.0 del .NET Framework, y pensaba que ya que el Compact tambi&amp;eacute;n lleva unos cuantos, no tendr&amp;iacute;a problemas con &amp;eacute;l.&lt;/p&gt;
&lt;p&gt;Pero no es as&amp;iacute; en relaci&amp;oacute;n al Compact. Fijaros que no estoy hablando del 3, ni del 3.5, sino del 2.0, que lleva una buena porrada de a&amp;ntilde;os en la calle y que ya deber&amp;iacute;a funcionar medianamente bien. No quiero yo ver la porquer&amp;iacute;a que ser&amp;aacute;n el 3 y 3.5 (recuerdo haber encontrado y reportado 5 bugs en una &amp;uacute;nica sesi&amp;oacute;n de media hora de jugar con ellos, de los cuales la mayor&amp;iacute;a ser&amp;iacute;an resueltos en &lt;i&gt;next version&lt;/i&gt;, que es la forma pol&amp;iacute;ticamente correcta que tiene Microsoft de quitarse a los pesados de encima y decirte con buenas palabras que no lo van a solucionar).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Los m&amp;aacute;s triviales del Compact 2.0&lt;/strong&gt; se encadenan en torno al componente Tab Control, y b&amp;aacute;sicamente tienen que ver con el tama&amp;ntilde;o del mismo y la posici&amp;oacute;n de las p&amp;aacute;ginas. Hablamos del .NET Compact Framework 2.0 con todos sus parches en compilaci&amp;oacute;n &lt;i&gt;AnyCPU&lt;/i&gt;, no de la versi&amp;oacute;n de escritorio.&lt;/p&gt;
&lt;p&gt;Cuando el componente es m&amp;aacute;s grande que la ficha y sale por debajo porque est&amp;aacute; anclado por arriba a la misma, .NET dibuja una barra de desplazamiento vertical que permite contener el componente completo. Sin embargo, si la anclamos por debajo, la barra de desplazamiento no aparece, y entonces los controles que haya en la parte superior ocultos a la vista no ser&amp;aacute;n visibles.&lt;/p&gt;
&lt;p&gt;El siguiente tambi&amp;eacute;n tiene relaci&amp;oacute;n con este, y se presenta de forma aleatoria (o al menos yo no he sido capaz de poder reproducirlo siempre). El control no se redimensiona. Ya puedes ponerle el Width o el Heigth al valor que quieras, que &amp;eacute;l seguir&amp;aacute; con el que tenga en tiempo de dise&amp;ntilde;o. Parece estar relacionado tambi&amp;eacute;n con el tipo de anclaje y de &lt;i&gt;dock&lt;/i&gt;, pero no estoy seguro.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;El gordo&lt;/span&gt;&lt;/strong&gt;. Este problema clama al cielo, es para llorar, ya ver&amp;eacute;is. Crea un proyecto embebido en C# para Windows CE con el asistente y para el Compact 2.0. A&amp;ntilde;ade un PictureBox al Form. Clica en la propiedad Image y carga un fichero JPG. Una vez hecho esto deberemos estar viendo la imagen en tiempo de dise&amp;ntilde;o. Ejecutemos sobre un emulador o sobre un dispositivo real.&lt;/p&gt;
&lt;p&gt;&amp;iexcl;Tach&amp;aacute;n! Excepci&amp;oacute;n al canto, la imagen no aparece por ning&amp;uacute;n lado. Os adjunto una imagen, para que ve&amp;aacute;is que no hay trampa ni cart&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_793C0956.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_thumb_5F00_4F686896.png" width="244" height="154" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;A la izquierda est&amp;aacute; el editor abierto por la excepci&amp;oacute;n y mostrando esta, del tipo &amp;ldquo;Exception&amp;rdquo;. A la derecha est&amp;aacute; el Form mostrando la imagen, y m&amp;aacute;s a la derecha el emulador.&lt;/p&gt;
&lt;p&gt;Para m&amp;aacute;s inri y jocosidad (aunque es para llorar), el tipo de excepci&amp;oacute;n es &amp;ldquo;Exception&amp;rdquo;, as&amp;iacute;, a pelo. No del tipo recurso no encontrado, ni fichero no encontrado, ni nada de eso. Simplemente una &amp;ldquo;excepci&amp;oacute;n&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Pero todav&amp;iacute;a hay m&amp;aacute;s, porque al menos en Windows CE te salta la excepci&amp;oacute;n, en Windows Mobile, por ejemplo, simplemente falla, sin disparar ning&amp;uacute;n tipo de excepci&amp;oacute;n ni nada.&lt;/p&gt;
&lt;p&gt;No os vay&amp;aacute;is, porque &amp;iexcl;s&amp;iacute;, hay m&amp;aacute;s!: incluso poni&amp;eacute;ndola a mano como un recurso normal, luego en el ejecutable &amp;iexcl;no hay imagen! Es decir, que lo que quiera que haga de linker en el C# pasa ol&amp;iacute;mpicamente de este tipo de recurso.&lt;/p&gt;
&lt;p&gt;&amp;iquest;Es para llorar o no? Pues eso, que se le quitan a uno las ganas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;V2.0&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bueno, lo de arriba fue escrito y programado para que se publicara el 21 de abril, ya que tengo entradas preparadas hasta esa fecha, pero resulta que mientras llega el citado d&amp;iacute;a, segu&amp;iacute; con el tema a ratos, porque no es un proyecto del curro, sino personal. Si lo contado hasta ahora clama al cielo, no os digo ya lo que viene a continuaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Unos d&amp;iacute;as despu&amp;eacute;s de desistir con el tema, vi el dispostivo con Windows CE por encima de la mesa y me dije que iba a reintentarlo, y as&amp;iacute; lo hice. Conect&amp;eacute; el aparato (un JE200 vuelto a convertir en un cacharro CE puro para los curiosos) y para escarnio y befa personal, &amp;iexcl;funcion&amp;oacute; a la primera! Bueno, no realmente, porque para evitarme la descarga de todo el Compact sobre el dispositivo, y sabiendo que &amp;eacute;l tra&amp;iacute;a ya una versi&amp;oacute;n 2.0, desconect&amp;eacute; la opci&amp;oacute;n de cargar siempre la &amp;uacute;ltima versi&amp;oacute;n en el aparato/emulador.&lt;/p&gt;
&lt;p&gt;Y entonces funcion&amp;oacute;. O en otras palabras, la imagen se embebi&amp;oacute; en el ejecutable y este funcion&amp;oacute; perfectamente. No obstante, hab&amp;iacute;a ahora un nuevo problema: el color de fondo de los botones no se cambiaba por el que yo hab&amp;iacute;a decidido (suma bug y sigue).&lt;/p&gt;
&lt;p&gt;Me da por probar en un emulador de Windows Mobile 2003 y funciona todo perfecto, incluso lo de los botones. De vuelta al emulador del CE, me dice que el .NET instalado es muy viejo. &amp;iquest;C&amp;oacute;mo que muy viejo? Si lo que pasa es que no hay .NET (Si lo sabr&amp;eacute; yo que . Otro m&amp;aacute;s al cesto.&lt;/p&gt;
&lt;p&gt;Para resolver lo anterior, reactivo lo de bajar la &amp;uacute;ltima versi&amp;oacute;n del Compact, lo hizo, carg&amp;oacute; y funcion&amp;oacute;, aunque el tema de los botones sigui&amp;oacute; sin funcionar&amp;hellip; Lo cierto es que funcion&amp;oacute; s&amp;oacute;lo la primera carga. En la dem&amp;aacute;s ya dej&amp;oacute; de hacerlo. Suma y sigue.&lt;/p&gt;
&lt;p&gt;Bueno, al final, resumiendo: tras al menos dos Service Packs y varias &amp;ldquo;actualizaciones de seguridad&amp;rdquo;, el Compact no s&amp;oacute;lo es la misma mierd@ que antes, si no incluso peor, con regresiones que ni siquiera estaban presentes en la RTM.&lt;/p&gt;
&lt;p&gt;Personalmente se me cae la cara de verg&amp;uuml;enza ajena con esto, lo que reafirma y confirma algo que he dicho por aqu&amp;iacute; no hace poco: los test no valen para nada. Y me da para otra entrada sobre este tema que ya estoy empezando a barruntar. Permaneced atentos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=171010" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+CE/default.aspx">Windows CE</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Hemos leído: Adam Nathan: Windows Presentatio Foundation Unleashed</title><link>http://geeks.ms/blogs/rfog/archive/2009/10/31/hemos-le-237-do-adam-nathan-windows-presentatio-foundation-unleashed.aspx</link><pubDate>Sat, 31 Oct 2009 12:25:16 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:159728</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=159728</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=159728</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2009/10/31/hemos-le-237-do-adam-nathan-windows-presentatio-foundation-unleashed.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;a href="http://www.adamnathan.net/wpf/" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="image" border="0" alt="image" align="left" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_799C798C.png" width="203" height="261" /&gt;&lt;/a&gt; La idea de adelantar casi un año la lectura de este &lt;a href="http://www.adamnathan.net/wpf/"&gt;libro&lt;/a&gt; respecto a mi plan ha sido la de hacer un programa utilizando WPF, pero al final ha sido peor el remedio que la enfermedad. O dicho de otro modo: pese a ser enormemente potente, pese a soportar temas, pese a contener ideas relativamente nuevas y bien implementadas... no lo voy a hacer con WPF. Simplemente es que no me gusta cómo ha sido expresada dicha potencia. Me han dicho que quizás si leyera el libro equivalente de Petzold lo vería de otro modo, pero de Petzold ya tuve bastante con el de &lt;a href="http://www.amazon.com/Programming-Microsoft-Windows-Charles-Petzold/dp/0735613702"&gt;&lt;i&gt;Programación en Windows con C#&lt;/i&gt;,&lt;/a&gt; que contenía más errores que aciertos. &lt;/p&gt;  &lt;p align="justify"&gt;Sí, ya sé que los libros de Petzold sobre Win32 y C son una referencia de base, de hecho tengo tres ediciones de las cinco que hay, pero por eso mismo: la referencia son estos, no los nuevos. No creo que nadie pueda negarme que el de C# no tenga errores.&lt;/p&gt;  &lt;p align="justify"&gt;Sin embargo, el de Nathan es otra cosa, y pese a tener ya más de tres años, sigue siendo actual y no desmerece para nada. Me dicen que pasa lo mismo con el de &lt;a href="http://www.amazon.com/gp/product/0735619573/ref=cap_pdp_dp_0"&gt;Petzold&lt;/a&gt;, que quizás compre y lea.&lt;/p&gt;  &lt;p align="justify"&gt;Dividido en cinco partes, ninguna tiene desperdicio. En la primera se nos presenta XAML y lo que significa para WPF, así como los conceptos que hay detrás de todo esto. Lo más destacable es que, a partir de un fichero de marcas como es XAML (que no es más que una variación de XML), el sistema es capaz de construir el tipo de interfaces que es capaz de hacer. Aunque suene un poco como a magia, no lo es, ya que la construcción del fichero y los &lt;i&gt;tags&lt;/i&gt; son complejos.&lt;/p&gt;  &lt;p align="justify"&gt;Otras cosas interesantes son las propiedades propagadas, en las que si tu modificas una de ellas, todos los hijos las modificarán de acuerdo al cambio, con lo que variar aspectos de la UI puede llegar a ser trivial en muchos casos. En los eventos ocurre parecido: si uno hace clic en un componente que no tiene dicho evento asignado, éste irá subiendo por el árbol hasta llegar a alguien que lo maneje. Si bien esto último puede sonar espectacular en .NET, en MFC y otros &lt;i&gt;frameworks &lt;/i&gt;es el comportamiento habitual.&lt;/p&gt;  &lt;p align="justify"&gt;La segunda parte nos presenta los controles de que disponemos en WPF. Pese a toda su enorme potencia a veces resultan escasos, porque básicamente son una serie de contenedores. A los programadores de GTK o de QT les deben sonar los componentes de &lt;i&gt;layouts&lt;/i&gt; y fluentes en el sentido de que reordenan los hijos de forma automática. Aparte de los botones, los cuadros de lista, los combos y los &lt;i&gt;labels&lt;/i&gt;, pocos más hay. También nos cuenta cómo juntar todo esto en un programa, y crea una especie de clon de las ventanas de Visual Studio, y digo &amp;quot;especie de&amp;quot; porque realmente el soporte de &lt;i&gt;docking&lt;/i&gt; está como ausente, pero aceptaremos pulpo pese a no haber hablado de arrastrar y soltar (que me temo WPF no soporta directamente).&lt;/p&gt;  &lt;p align="justify"&gt;En la tercera nos explica cómo trabajar con recursos, enlace a datos y el soporte para estilos, plantillas (de estilos), pieles (&lt;i&gt;skins&lt;/i&gt;) y temas. Aquí me he llevado otro pequeño desengaño, ya que pese a la potencia de todo esto, resulta sensiblemente difícil añadir o cambiar el aspecto de una aplicación. Para hacerlo es necesario al menos saber XAML, y presenta un potencial y enorme agujero de seguridad ya que dicho XAML puede contener código arbitrario...&lt;/p&gt;  &lt;p align="justify"&gt;La penúltima parte cubre la multimedia: cómo hacer gráficos 2D y 3D, animaciones, vídeo y audio. Pese al soporte ampliado, la verdad es que no hay mucha mejora respecto a otras tecnologías.&lt;/p&gt;  &lt;p align="justify"&gt;La quinta y última parte sí que es interesante, por lo menos para mi: Interoperabilidad con Win32, C++/CLI, COM, ActiveX y Windows Forms. De todos modos, nada nuevo bajo el sol, y para ver interoperabilidad entre C++/CLI y WPF y/o Windows Forms de verdad, el libro de &lt;a href="http://geeks.ms/blogs/rfog/archive/2007/12/16/hemos-le-237-do-c-cli-in-action-nishant-sivakumar-manning.aspx"&gt;Sivakumar&lt;/a&gt;. También vemos cómo crear controles personalizados y de usuario.&lt;/p&gt;  &lt;p align="justify"&gt;No os llevéis a engaño por mis comentarios. El libro es muy bueno, lo explica todo perfectamente, pero la tecnología me ha desilusionado un poco. No sé, esperaba más. No más complejidad (que ya tiene bastante), sino más facilidad y menos picar código (aunque sea XAML)... Sí, ya sé que tenemos el Expression Blend, pero creo que aprender a manejar esa bestia parda tampoco es tarea de un rato...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=159728" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/libros/default.aspx">libros</category></item></channel></rss>