<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Sector 7G</title><link>http://kartones.net/blogs/sector7g/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/pedroafa" type="application/rss+xml" /><feedburner:emailServiceId>pedroafa</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Review: Scrum y XP desde las Trincheras</title><link>http://feedproxy.google.com/~r/pedroafa/~3/o-JLBbKSzbM/review-scrum-y-xp-desde-las-trincheras.aspx</link><pubDate>Wed, 08 Jul 2009 06:44:00 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:50189</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=50189</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/07/08/review-scrum-y-xp-desde-las-trincheras.aspx#comments</comments><description>&lt;p&gt;&lt;img style="MARGIN:0px 5px 0px 0px;DISPLAY:inline;" align="left" src="http://kartones.net/images_posts/sector7g/Review_Scrum_and_XP_from_the_Trenches.jpg" alt="Review_Scrum_and_XP_from_the_Trenches.jpg" /&gt;&lt;b&gt;Título: &lt;/b&gt;&lt;a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches"&gt;Scrum and XP from the Trenches&lt;/a&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;&lt;b&gt;Autor:&lt;/b&gt; &lt;a href="http://www.amazon.com/exec/obidos/search-handle-url/ref=ntt_athr_dp_sr_1?%5Fencoding=UTF8&amp;amp;search-type=ss&amp;amp;index=books&amp;amp;field-author=Henrik%20Kniberg"&gt;Henrik Kniberg&lt;/a&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;&lt;b&gt;Nº Páginas:&lt;/b&gt; 140&lt;/p&gt;
&lt;p&gt;En &lt;b&gt;&lt;i&gt;Scrum and XP from the Trenches&lt;/i&gt;&lt;/b&gt; su autor &lt;b&gt;&lt;i&gt;Henrik Kniberg&lt;/i&gt;&lt;/b&gt; habla sobre su experiencia con estas metodologías. Cuenta como ha aplicado y combinado estas dos metodologías los equipos de desarrollo de su empresa. Esto hace que se trate de un libro muy práctico, ameno y de fácil lectura. &lt;/p&gt;
&lt;p&gt;Henrik no profundiza mucho en los conceptos, pero sí que hace una descripción breve sobre ellos. Se centra más en explicar cómo ha aplicado las diferentes herramientas de Scrum y cuáles han sido sus conclusiones después de ver cómo funcionaban. Además habla de cómo ha combinado Scrum con XP y de los resultados obtenidos de ello.&lt;/p&gt;
&lt;p&gt;Lo interesante de este libro es justo el enfoque dado por el autor. Ver Scrum desde la práctica y la experiencia y no solamente desde el papel y la teoría. &lt;/p&gt;
&lt;p&gt;A lo largo del libro, Henrik habla de cómo realizar las pilas de producto, de cómo planificar los Sprints, cómo hacer retrospectivas del sprint, de cómo hacer pruebas, etc.… Concretamente el índice es el siguiente:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Introducción &lt;/li&gt;
&lt;li&gt;Cómo hacemos pilas de producto &lt;/li&gt;
&lt;li&gt;Cómo nos preparamos para la planificación de Sprint &lt;/li&gt;
&lt;li&gt;Cómo hacemos la planificación de Sprint &lt;/li&gt;
&lt;li&gt;Cómo comunicamos los Sprints &lt;/li&gt;
&lt;li&gt;Cómo hacemos pilas de Sprint &lt;/li&gt;
&lt;li&gt;Cómo distribuimos la sala del equipo &lt;/li&gt;
&lt;li&gt;Cómo hacemos Scrum diarios &lt;/li&gt;
&lt;li&gt;Cómo hacemos la demo de sprint &lt;/li&gt;
&lt;li&gt;Cómo hacemos retrospectivas de sprint &lt;/li&gt;
&lt;li&gt;Descansos entre Sprints &lt;/li&gt;
&lt;li&gt;Cómo combinamos Scrum con XP &lt;/li&gt;
&lt;li&gt;Cómo hacemos pruebas &lt;/li&gt;
&lt;li&gt;Cómo manejar múltiples equipos Scrum &lt;/li&gt;
&lt;li&gt;Cómo gestionamos equipos distribuidos geográficamente &lt;/li&gt;
&lt;li&gt;Lista de comprobación del Scrum Master &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Además al final de libro, el propio autor recomienda una serie de lecturas bastante interesantes sobre el tema:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Managing-Design-Factory-Donald-Reinertsen/dp/0684839911/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121382&amp;amp;sr=8-1"&gt;Managing the Design Factory&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Implementing-Lean-Software-Development-Addison-Wesley/dp/0321437381/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121452&amp;amp;sr=1-1"&gt;Implementing Lean Software Development: From Concept to Cash&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Agile-Estimating-Planning-Robert-Martin/dp/0131479415/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121511&amp;amp;sr=1-1"&gt;Agile Estimating and Planning&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Joel-Software-Occasionally-Developers-Designers/dp/1590593898/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121592&amp;amp;sr=1-1"&gt;Joel on Software&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Lean-Software-Development-Agile-Toolkit/dp/0321150783/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121695&amp;amp;sr=1-1"&gt;Lean Software Development: An Agile Toolkit&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Balancing-Agility-Discipline-Guide-Perplexed/dp/0321186125/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121751&amp;amp;sr=1-1"&gt;Balancing Agility and Discipline: A Guide for the Perplexed&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Agile-Software-Development-Scrum/dp/0130676349/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121821&amp;amp;sr=1-1"&gt;Agile Software Development with Scrum&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121878&amp;amp;sr=1-1"&gt;The Mythical Man-Month: Essays on Software Engineering&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Agile-Project-Management-Microsoft-Professional/dp/073561993X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121935&amp;amp;sr=1-1"&gt;Agile Project Management with Scrum&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Extreme-Programming-Explained-Embrace-Change/dp/0321278658/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246121992&amp;amp;sr=1-1"&gt;Extreme Programming Explained: Embrace Change&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Peopleware-Productive-Projects-Teams-Second/dp/0932633439/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246122045&amp;amp;sr=1-1"&gt;Peopleware: Productive Projects and Teams&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;El libro lo podréis contra en varios idiomas, también en español, aunque personalmente os recomiendo la versión en inglés. &lt;/p&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=50189" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6KFuJgiC9u0QYKRd9ZTod0wHB7s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6KFuJgiC9u0QYKRd9ZTod0wHB7s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6KFuJgiC9u0QYKRd9ZTod0wHB7s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6KFuJgiC9u0QYKRd9ZTod0wHB7s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/o-JLBbKSzbM" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/Agile+Methods/default.aspx">Agile Methods</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/XP/default.aspx">XP</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/Scrum/default.aspx">Scrum</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/07/08/review-scrum-y-xp-desde-las-trincheras.aspx</feedburner:origLink></item><item><title>Localización de una Aplicación Basada en PRISM</title><link>http://feedproxy.google.com/~r/pedroafa/~3/fLYSTa0MgN0/localizaci-243-n-de-una-aplicaci-243-n-basada-en-prism.aspx</link><pubDate>Wed, 01 Jul 2009 19:57:00 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:50172</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=50172</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/07/01/localizaci-243-n-de-una-aplicaci-243-n-basada-en-prism.aspx#comments</comments><description>&lt;p&gt;Es difícil localizar una aplicación WPF con las herramientas proporcionadas en el .Net Framework 3.5. El proceso para realizarlo sería el siguiente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Generar un diccionario de recursos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enlazar el diccionario a la aplicación en el App.xaml.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ejecutar el MSBuild script para generar un Id único para cada control localizable en la aplicación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ejecutar la herramienta LocBaml (incluida en el SDK) para extraer todos los Aid en un archivo separado por comas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copiar el archivo generado por LocBaml a una carpeta (una para cada lenguaje).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Volver a ejecutar la herramienta LocBaml para importas todas las entradas dentro del diccionario.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Compilar. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Esta forma de hacerlo tiene algunos problemas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sólo puedes tener un archivo de diccionario de recursos por aplicación. Cada módulo no podrá tener el suyo propio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El proceso es difícil y propenso a los errores. Lo que hace que sea costoso de mantener.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No puedes cambiar el lenguaje de la aplicación en tiempo de ejecución. Es necesario reiniciar la aplicación para poder reflejar el cambio de idioma.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Para arquitecturas como PRISM (&lt;i&gt;Composite Application Guidance for WPF&lt;/i&gt;), que se basan en módulos, es muy importante que cada módulo pueda tener sus propios archivos de recursos. Puede que estos módulos sean desarrollados por separado y equipos diferentes. Además es interesante que el proceso de localización sea sencillo y fácilmente mantenible. Normalmente los textos de las traducciones suelen cambiar bastante.&lt;/p&gt;
&lt;p&gt;Para solucionar esto, y solventar todos los problemas existe &lt;a href="http://www.codeplex.com/WPFLocalizeExtension/"&gt;WPFLocalizeExtension&lt;/a&gt;. Se trata de un framework open source. Este framework ha sido modificado para soportar localización de assemblies (plug-in) cargados dinámicamente.&lt;/p&gt;
&lt;p&gt;Este framework se basa en archivos de recursos lo que hace que sea bastante sencillo mantener las traducciones de los diferentes idiomas. Así que cada módulo puede tener su propio archivo de recursos con sus traducciones. Además, permite cambios de idioma en caliente. &lt;/p&gt;
&lt;p&gt;Ahora el proceso de localización es más sencillo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Modificar el archivo de proyecto .csproj añadiendo &lt;b&gt;&lt;i&gt;&amp;lt;UICulture&amp;gt;en-US&amp;lt;/UICulture&amp;gt;&lt;/i&gt;&lt;/b&gt; en el primer tag &lt;b&gt;PropertyGroup&lt;/b&gt;. Este será el lenguaje neutral de la aplicación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Crear un archivo de recursos para el Lenguaje Neutral (&lt;b&gt;Shell.resx&lt;/b&gt;) y añadir una entrada por cada control que se necesite localizar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Para añadir otro idioma copiar y pegar el archivo de recursos (&lt;b&gt;Shell.resx&lt;/b&gt;) y renombrarlo a &lt;b&gt;Shell.es-ES.resx&lt;/b&gt;. Traducir todas las etiquetas a español, en este caso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Para localizar una vista (un archivo .xaml):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Añadir una referencia a la librería de&lt;b&gt;&lt;i&gt; &lt;/i&gt;&lt;/b&gt;&lt;a href="http://www.codeplex.com/WPFLocalizeExtension/"&gt;WPFLocalizeExtension&lt;/a&gt;.&lt;b&gt;&lt;i&gt; xmlns:loc=&amp;quot;clr-namespace:LocalizeExtension.Localization;assembly=LocalizeExtension&amp;quot;&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Para la propiedad que haya que traducir utilizar: &lt;b&gt;&lt;i&gt;{loc:LocText loc:Key=CustomerLabel, loc:Dict=Shell, loc:Assembly=MyAssembly.Shell}&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Key&lt;/b&gt;: Es el nombre del texto a mostrar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Dict&lt;/b&gt;: Es el nombre del archivo de recursos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Assembly&lt;/b&gt;: Es la dll donde se encuentra el archivo de recursos.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compilar.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Este proceso es mucho menos complejo que el estándar y facilita bastante las cosas como se puede ver.&lt;/p&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=50172" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wUo3zvfr5iC1UIhXVnOLk9oWUcU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wUo3zvfr5iC1UIhXVnOLk9oWUcU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wUo3zvfr5iC1UIhXVnOLk9oWUcU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wUo3zvfr5iC1UIhXVnOLk9oWUcU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/fLYSTa0MgN0" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/Composite+Application+WPF/default.aspx">Composite Application WPF</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/WPF/default.aspx">WPF</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/PRISM/default.aspx">PRISM</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/07/01/localizaci-243-n-de-una-aplicaci-243-n-basada-en-prism.aspx</feedburner:origLink></item><item><title>A program on your computer has corrupted your default search provider setting for Internet Explorer</title><link>http://feedproxy.google.com/~r/pedroafa/~3/GX_GXM6vRFk/a-program-on-your-computer-has-corrupted-your-default-search-provider-setting-for-internet-explorer.aspx</link><pubDate>Mon, 29 Jun 2009 21:59:17 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:50171</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=50171</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/06/29/a-program-on-your-computer-has-corrupted-your-default-search-provider-setting-for-internet-explorer.aspx#comments</comments><description>&lt;p&gt;Hace unas semanas el Windows Update decidió actualizar mi versión de Explorer de la versión 7 a la 8 en mi &lt;b&gt;Windows XP&lt;/b&gt;. Desde entonces al abrir el explorer ha estado apareciendo el siguiente mensaje de error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;“A program on your computer has corrupted your default search provider setting for Internet Explorer.&lt;/i&gt;&lt;/p&gt;    &lt;p&gt;&lt;i&gt;Internet Explorer has reset this setting to your original search provider, Live Search (search.live.com).&lt;/i&gt;&lt;/p&gt;    &lt;p&gt;&lt;i&gt;Internet Explorer will now open Search Settings, where you can change this setting or install more search providers.”&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;La solución al problema es bastante sencilla:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;p&gt;Con el IE 8 cerrado ir a esta clave de registro: &lt;b&gt;&lt;i&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\&lt;/i&gt;&lt;/b&gt; &lt;b&gt;&lt;i&gt;Explorer\User Shell Folders&lt;/i&gt;&lt;/b&gt;. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Añadir una nueva clave de registro del tipo &lt;b&gt;&lt;i&gt;Expandable String value&lt;/i&gt;&lt;/b&gt;. Con la &lt;i&gt;key&lt;/i&gt; &lt;b&gt;&lt;i&gt;AppData&lt;/i&gt;&lt;/b&gt; y el campo &lt;i&gt;value&lt;/i&gt; &lt;b&gt;&lt;i&gt;%USERPROFILE%\Application Data&lt;/i&gt;&lt;/b&gt;. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Abrir el IE 8 y verificar que no vuelve a salir el mensaje. &lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=50171" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SnyNPCDbST4Cwj8aeE-PPHqbchQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SnyNPCDbST4Cwj8aeE-PPHqbchQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SnyNPCDbST4Cwj8aeE-PPHqbchQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SnyNPCDbST4Cwj8aeE-PPHqbchQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/GX_GXM6vRFk" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/IE+8/default.aspx">IE 8</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/06/29/a-program-on-your-computer-has-corrupted-your-default-search-provider-setting-for-internet-explorer.aspx</feedburner:origLink></item><item><title>Desarrollando Aplicaciones Cliente y Web con WFP y Silverlight</title><link>http://feedproxy.google.com/~r/pedroafa/~3/VBWriP0wDbs/desarrollando-aplicaciones-cliente-y-web-con-wfp-y-silverlight.aspx</link><pubDate>Wed, 24 Jun 2009 07:54:00 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:50164</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=50164</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/06/24/desarrollando-aplicaciones-cliente-y-web-con-wfp-y-silverlight.aspx#comments</comments><description>&lt;p&gt;El otro día a raíz de un post de Juan, &lt;a href="http://geeks.ms/blogs/jirigoyen/archive/2009/06/17/windows-presentation-foundati-243-n-el-final-de-windows-forms.aspx#comments"&gt;Windows Presentation Foundation. El final de Windows Forms…&lt;/a&gt;, alguien preguntaba si era posible desarrollar la misma aplicación para ejecutarla en un cliente Windows y un cliente web. Posible sí que es y además hay varias opciones para conseguirlo, aunque habrá que tener en cuenta las limitaciones que existen.&lt;/p&gt;
&lt;p&gt;La primera opción que se presenta es crear &lt;b&gt;una aplicación WPF y XBAP&lt;/b&gt;. Esto se puede conseguir usando el Template para Visual Studio, &lt;b&gt;Flexible Application&lt;/b&gt;. Este template lo que hace es proveer en un solo proyecto la capacidad de compilar en exe y xbap. Dependiendo del tipo de compilación utilizado se generará la aplicación para que corra bajo Windows o se ejecute en el Explorer.&lt;/p&gt;
&lt;p&gt;Evidentemente esta práctica tiene sus ventajas e inconvenientes.&lt;/p&gt;
&lt;p&gt;Ventajas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;u&gt;Con un solo desarrollo tiene las dos aplicaciones&lt;/u&gt;. El código va a ser el mismo para los dos entornos, simplemente va a cambiar el tipo de compilación realizada.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Desventajas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;u&gt;Sólo para plataforma Windows&lt;/u&gt;. Cómo XBAP se ejecuta en el cliente, el cliente debe tener instalado el .Net Framework. Esto limita los entornos en los que la aplicación puede ser utilizada.&lt;/li&gt;
&lt;li&gt;&lt;u&gt;XBAP se encuentra limitado al ejecutarse en un &lt;/u&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480229.aspx"&gt;Sandbox&lt;/a&gt;. Esto hace que haya que tener en cuenta estas restricciones de seguridad a la hora de plantear el desarrollo.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Referencias sobre el Template de &lt;b&gt;Flexible Application&lt;/b&gt;: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://scorbs.com/2006/06/04/vs-template-flexible-application/"&gt;VS Template: Flexible Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://scorbs.com/2006/06/04/tips-tricks-for-flexible-application/"&gt;Tips &amp;amp; Tricks for Flexible Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://scorbs.com/vstemplates/Flexible%20Application%20(WPF).zip"&gt;Descargar el Template&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La segunda opción sería realizar dos desarrollos paralelos: &lt;b&gt;uno en WPF y otro en Silverlight&lt;/b&gt;. Para llevar esto acabo habría que realizar un desarrollo específico para cada tecnología. Probablemente las aplicaciones no serían iguales. Silverlight no es igual de potente que WPF, así que habría que tener en cuenta las limitaciones de esta. &lt;/p&gt;
&lt;p&gt;El New York Times recientemente se ha encontrado con esta problemática. Se veían obligados a tener que mantener dos aplicaciones diferentes y que además realmente no ofrecían la misma funcionalidad a los diferentes usuarios. Un usuario de MAC, que sólo puede utilizar la aplicación Silverlight, no contaba con las mismas opciones que uno de Windows con la aplicación WPF. Por este motivo, el New York Times opto por Adobe Air. Abode Air si permite ejecutar sus aplicaciones tanto en entornos Windows como Web.&lt;/p&gt;
&lt;p&gt;Así que la tercera, y última opción, es &lt;b&gt;Silverlight 3&lt;/b&gt;. Silverlight 3 nace con la idea de competir con Adobe Air. Ya que esta nueva versión si permite que la aplicación viva “out of browser”. &lt;/p&gt;
&lt;p&gt;Con Silverlight 3, una aplicación podrá ser ejecutada en un cliente Windows y en un cliente Web. Así que con un solo desarrollo la aplicación podrá correr bajo ambos entornos. Además la aplicación será multiplataforma ya que Silverlight si puede ser utilizado en MAC, por ejemplo. Al ser la misma aplicación también contara con la misma funcionalidad para todos los usuarios de los diferentes entornos.&lt;/p&gt;
&lt;p&gt;El único problema que presenta esta solución es que es necesario conocer las limitaciones de la tecnología. Silverlight 3 todavía no es WPF, aunque empieza a estar cerca. Además hay que tener en cuenta que se ejecuta dentro de un Sandbox de seguridad. Cosa que limitará la funcionalidad de la misma.&lt;/p&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=50164" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wnjaV2-mwy8SVqrwRX89lIqxCmU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wnjaV2-mwy8SVqrwRX89lIqxCmU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wnjaV2-mwy8SVqrwRX89lIqxCmU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wnjaV2-mwy8SVqrwRX89lIqxCmU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/VBWriP0wDbs" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/WPF/default.aspx">WPF</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/Silverlight/default.aspx">Silverlight</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/06/24/desarrollando-aplicaciones-cliente-y-web-con-wfp-y-silverlight.aspx</feedburner:origLink></item><item><title>WPF Blogger</title><link>http://feedproxy.google.com/~r/pedroafa/~3/qbTzYOxH3mQ/wpf-blogger.aspx</link><pubDate>Sat, 20 Jun 2009 09:54:00 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:50155</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=50155</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/06/20/wpf-blogger.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.wpf-blogger.com/"&gt;&lt;img style="MARGIN:0px 5px 0px 0px;DISPLAY:inline;" align="left" src="http://www.kartones.net/images_posts/sector7g/wpfbloggers.png" width="93" height="91" alt="wpfbloggers.png" /&gt; WPF Blogger&lt;/a&gt; es una comunidad de desarrolladores que se dedican a escribir sobre temas relacionados con WPF y Silverlight. No es una comunidad solamente española, sino que también cuentan con un grupo inglés, francés y alemán. Así que recientemente he unido mi blog (&lt;a href="http://kartones.net/blogs/sector7g/"&gt;sectorsieteg.net&lt;/a&gt;) a dicha comunidad. &lt;/p&gt;
&lt;p&gt;Aquí os dejo el feed en español, por si alguno os interesa agregarlo al lector de rss. &lt;a href="http://www.wpf-blogger.com/es/Rss.aspx"&gt;Feed WPF Bloggers Español&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=50155" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VzE2NH-hJ61U93RYq8MlqOEvFl0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VzE2NH-hJ61U93RYq8MlqOEvFl0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VzE2NH-hJ61U93RYq8MlqOEvFl0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VzE2NH-hJ61U93RYq8MlqOEvFl0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/qbTzYOxH3mQ" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/Silverlight+2.0/default.aspx">Silverlight 2.0</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/06/20/wpf-blogger.aspx</feedburner:origLink></item><item><title>Crear una Regla para el Analizador de Código de Visual Studio 2008</title><link>http://feedproxy.google.com/~r/pedroafa/~3/MSnP3axPtdA/crear-una-regla-para-el-analizador-de-c-243-digo-de-visual-studio-2008.aspx</link><pubDate>Sun, 08 Feb 2009 16:22:00 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:37078</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=37078</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/02/08/crear-una-regla-para-el-analizador-de-c-243-digo-de-visual-studio-2008.aspx#comments</comments><description>&lt;p&gt;El analizador de código del Visual Studio 2008 es una herramienta que permite comprobar si el código cumple una serie de reglas. Funciona exactamente igual que FxCop, sólo que se encuentra integrado dentro del propio IDE.&lt;/p&gt;
&lt;p&gt;El propio Visual Studio ya cuenta con un gran número de reglas predefinidas. Aunque este número puede ser aumentado por medio de la creación de nuevas reglas. Esto puede ser muy útil para equipos de trabajo que utilicen una guía de estilos específica. De esta forma, se puede comprobar que todos los miembros del equipo cumplen con los estándares fijados. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Creando una Regla&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Cómo ejemplo vamos a definir una regla que permita comprobar los nombres de las pruebas unitarias. Según esta regla, el nombre de un test debe de tener este formato: NombreDelMetodoAProbar_DescripcionDeLaPruebas_ResultadoEsperado. Ej: GetCustomersById_NullParameter_ArgumentException.&lt;/p&gt;
&lt;p&gt;Para ello habrá que crear un proyecto de tipo librería. Este proyecto debe de tener una referencia a estas tres dlls: &lt;b&gt;FxCopSdk.dll&lt;/b&gt;, &lt;b&gt;FxCopCommon.dll&lt;/b&gt;, &lt;b&gt;Microsoft.Cci.dll&lt;/b&gt;. Estas dlls se pueden encontrar en la carpeta: %&lt;i&gt;ProgramFiles%\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop\&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Para que el analizador de código pueda determinar que clases son reglas. Las clases deben de heredar de la clase abstracta &lt;b&gt;BaseIntrospectionRule&lt;/b&gt;. Esta clase se encuentra dentro del namespace &lt;b&gt;Microsoft.FxCop.Sdk&lt;/b&gt;.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public abstract class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;BaseRule &lt;/span&gt;: &lt;span style="COLOR:#2b91af;"&gt;BaseIntrospectionRule
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;protected &lt;/span&gt;BaseRule(&lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;name)
        : &lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;(name, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;Sector7G.VisualStudio.CodeAnalysisRules.Rules&amp;quot;&lt;/span&gt;, 
        &lt;span style="COLOR:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;BaseRule&lt;/span&gt;).Assembly)
    {
    }

    &lt;span style="COLOR:blue;"&gt;public override &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;TargetVisibilities &lt;/span&gt;TargetVisibility
    {
        &lt;span style="COLOR:blue;"&gt;get
        &lt;/span&gt;{
            &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;TargetVisibilities&lt;/span&gt;.All;
        }
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;Nota&lt;/i&gt;&lt;/b&gt;&lt;i&gt;: En este caso he creado una clase base de la cual heredarán todas mis reglas.&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Al constructor de la clase &lt;b&gt;BaseIntrospectionRule&lt;/b&gt; hay que pasarle como argumentos: El nombre de la regla, el namespace del archivo xml con la definición de la regla, y el ensamblado que tiene la regla.&lt;/p&gt;
&lt;p&gt;Para crear la regla hay que sobre escribir el método &lt;b&gt;Check&lt;/b&gt; de la clase &lt;b&gt;BaseIntrospectionRule&lt;/b&gt;. Dentro de este método deberemos escribir el código de verifique si el nombre de un test es correcto.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public sealed class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;TestMethodsNamesMustHaveThreePartsRule &lt;/span&gt;: &lt;span style="COLOR:#2b91af;"&gt;BaseRule
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public &lt;/span&gt;TestMethodsNamesMustHaveThreePartsRule()
        : &lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;TestMethodsNamesMustHaveThreePartsRule&amp;quot;&lt;/span&gt;)
    {
    }

    &lt;span style="COLOR:blue;"&gt;public override &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;ProblemCollection &lt;/span&gt;Check(&lt;span style="COLOR:#2b91af;"&gt;Member &lt;/span&gt;member)
    {
        &lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;(member == &lt;span style="COLOR:blue;"&gt;null &lt;/span&gt;|| member.NodeType != &lt;span style="COLOR:#2b91af;"&gt;NodeType&lt;/span&gt;.Method)
            &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Problems;

        &lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;(member.HasAttribute(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;TestMethodAttribute&amp;quot;&lt;/span&gt;))
        {
            &lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;(!member.Name.Name.IsCorrectTestMethodName())
            {
                Problems.Add(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Problem&lt;/span&gt;(GetResolution(member.Name.Name)));
                &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Problems;
            }
        }

        &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;Problems;
    }
}&lt;/pre&gt;
&lt;p&gt;En este código se puede ver como se comprueba que método este decorado con el atributo &lt;b&gt;TestMethodAttribute&lt;/b&gt;. De esta forma podemos identificar si el método se trata de una prueba. Seguidamente se comprueba si el nombre cumple con la especificación establecida.&lt;/p&gt;
&lt;p&gt;El código del método &lt;b&gt;HasAttribute&lt;/b&gt; es:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public static class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;RuleHelper
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public static bool &lt;/span&gt;HasAttribute(&lt;span style="COLOR:blue;"&gt;this &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Member &lt;/span&gt;member, &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;type)
    {
        &lt;span style="COLOR:blue;"&gt;var &lt;/span&gt;info = member.Attributes.Where(a =&amp;gt; a.Type.Name.Name == type);
        &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;info != &lt;span style="COLOR:blue;"&gt;null &lt;/span&gt;&amp;amp;&amp;amp; info.Count() != 0;
    }
}&lt;/pre&gt;
&lt;p&gt;El códigio de método &lt;b&gt;IsCorrectTestMethodName&lt;/b&gt; es:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public static class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;NamingHelper
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public static bool &lt;/span&gt;IsCorrectTestMethodName(&lt;span style="COLOR:blue;"&gt;this string &lt;/span&gt;name)
    {
        &lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;String&lt;/span&gt;.IsNullOrEmpty(name))
            &lt;span style="COLOR:blue;"&gt;return false&lt;/span&gt;;

        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;[] parts = name.Split(&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt;[] { &lt;span style="COLOR:#a31515;"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;});
        &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;parts.Length == 3;
    }
}&lt;/pre&gt;
&lt;p&gt;Ya sólo queda incluir un archivo xml con la información de la regla. Este archivo debe incluirse como recurso dentro de la dll, es decir, su propiedad &lt;b&gt;Build Action&lt;/b&gt; debe de ser &lt;b&gt;Embedded Resource&lt;/b&gt;. El nombre de este archivo debe de ser el mismo que declaro en el parámetro &lt;b&gt;resourceName&lt;/b&gt; del constructor de la clase &lt;b&gt;BaseIntrospectionRule&lt;/b&gt;. En el caso del ejemplo se llama Rules.xml y tiene el siguiente formato:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;xml &lt;/span&gt;&lt;span style="COLOR:red;"&gt;version&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="COLOR:red;"&gt;encoding&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;utf-8&lt;/span&gt;&amp;quot; &lt;span style="COLOR:blue;"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Rules &lt;/span&gt;&lt;span style="COLOR:red;"&gt;FriendlyName&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;Sector7G Code Analysis Rules&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Rule &lt;/span&gt;&lt;span style="COLOR:red;"&gt;TypeName&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;TestMethodsNamesMustHaveThreePartsRule&lt;/span&gt;&amp;quot; 
        &lt;span style="COLOR:red;"&gt;Category&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;Sector7G.Naming&lt;/span&gt;&amp;quot; &lt;span style="COLOR:red;"&gt;CheckId&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;S7G0001&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;The name of a test method must have three parts&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Description&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;A test method name must have three parts.&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Description&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Resolution&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
      &lt;/span&gt;The name &amp;quot;&amp;#39;{0}&amp;#39;&amp;quot; does not have three parts. 
      The correct format of a test method name is: 
      name of the method to test, a description and an expected result. Sample: 
      GetCustomerById_NullParameter_ArgumentException
    &lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Resolution&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;MessageLevel &lt;/span&gt;&lt;span style="COLOR:red;"&gt;Certainty&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;95&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;Error&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;MessageLevel&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;FixCategories&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;NonBreaking&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;FixCategories&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Owner&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;Pedro Alvarez Fernandez&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Owner&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Email&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Email&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Url&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;http://www.sectorsieteg.net&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Url&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Rule&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Rules&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Una vez terminado el desarrollo, la regla debe de ser desplegada para poder ser utilizada desde el Visual Studio. Para ello, la dll debe de ser copiada a la carpeta: &lt;i&gt;C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop\Rules&lt;/i&gt;. En esta carpeta encontraras las dlls del resto de reglas que utiliza el Visual Studio.&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=37078" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/00RNzHFYMyVJo35AktIcFoT9jdk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/00RNzHFYMyVJo35AktIcFoT9jdk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/00RNzHFYMyVJo35AktIcFoT9jdk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/00RNzHFYMyVJo35AktIcFoT9jdk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/MSnP3axPtdA" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/Code+Analysis/default.aspx">Code Analysis</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/02/08/crear-una-regla-para-el-analizador-de-c-243-digo-de-visual-studio-2008.aspx</feedburner:origLink></item><item><title>Ribbon Control y Prims</title><link>http://feedproxy.google.com/~r/pedroafa/~3/RH-pQPaadRo/ribbon-control-y-prims.aspx</link><pubDate>Sun, 08 Feb 2009 12:16:00 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:37072</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=37072</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/02/08/ribbon-control-y-prims.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;Prism&lt;/b&gt; o &lt;b&gt;Composite for WPF&lt;/b&gt; se basa en la construcci&amp;#243;n de una aplicaci&amp;#243;n modular. Esto quiere decir, que cada funcionalidad de la aplicaci&amp;#243;n constar&amp;#225; de su propio m&amp;#243;dulo. As&amp;#237; que por ejemplo, si queremos que nuestra aplicaci&amp;#243;n tenga un lugar donde se puedan configurar diferentes valores de la misma, tendremos un m&amp;#243;dulo de &amp;#8220;configuraci&amp;#243;n de la aplicaci&amp;#243;n&amp;#8221;. &lt;/p&gt;  &lt;p&gt;Lo que intenta este post es explicar c&amp;#243;mo dar la posibilidad a cada m&amp;#243;dulo de la aplicaci&amp;#243;n de cargar sus propias opciones en el men&amp;#250;. C&amp;#243;mo men&amp;#250; se utilizar&amp;#225; un control &lt;b&gt;Ribbon&lt;/b&gt;, as&amp;#237; que cada m&amp;#243;dulo debe de ser capaz de a&amp;#241;adir un &lt;b&gt;RibbonTab&lt;/b&gt; cuando &amp;#233;ste sea cargado. De esta manera, cada vez que se agregue m&amp;#225;s funcionalidad a la aplicaci&amp;#243;n, m&amp;#225;s m&amp;#243;dulos, estos ir&amp;#225;n enriqueciendo las opciones del men&amp;#250; presentadas en el &lt;b&gt;Ribbon&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;La mejor aproximaci&amp;#243;n para hacer esto, es utilizar un &lt;b&gt;RegionAdapter&lt;/b&gt;. Los &lt;b&gt;RegionAdapter&lt;/b&gt; permiten asociar una regi&amp;#243;n con un control. De esta manera, cuando un &lt;b&gt;RibbonTab&lt;/b&gt; sea a&amp;#241;adido en una regi&amp;#243;n espec&amp;#237;fica, el &lt;b&gt;RegionAdaptar&lt;/b&gt; a&amp;#241;adir&amp;#225; este &lt;b&gt;RibbonTab&lt;/b&gt; al &lt;b&gt;Ribbon&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;El primer paso es a&amp;#241;adir el control &lt;b&gt;Ribbon&lt;/b&gt; a la aplicaci&amp;#243;n y asociarlo a una regi&amp;#243;n. En este caso es asociado a la regi&amp;#243;n &amp;#8220;&lt;b&gt;RibbonRegion&lt;/b&gt;&amp;#8221;:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;r&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Ribbon &lt;/span&gt;&lt;span style="color:red;"&gt;DockPanel.Dock&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Top&amp;quot;  &lt;/span&gt;&lt;span style="color:red;"&gt;Title&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Sector7G Sample App&amp;quot; 
          &lt;/span&gt;&lt;span style="color:red;"&gt;cal&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;RegionManager.RegionName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;RibbonRegion&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Nota: &lt;/b&gt;&lt;a href="http://www.codeplex.com/wpf/Wiki/View.aspx?title=WPF%20Ribbon%20Preview"&gt;Aqu&amp;#237;&lt;/a&gt; puedes obtener toda la informaci&amp;#243;n para obtener el control &lt;b&gt;Ribbon&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;El siguiente paso debe de ser crear el &lt;b&gt;RegionAdapter&lt;/b&gt;. El &lt;b&gt;RegionAdapter&lt;/b&gt; va a ser el que nos permita a&amp;#241;adir el &lt;b&gt;RibbonTab&lt;/b&gt; de un m&amp;#243;dulo, al &lt;b&gt;Ribbon&lt;/b&gt; de la aplicaci&amp;#243;n.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RibbonControlRegionAdapter &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;RegionAdapterBase&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Ribbon&lt;/span&gt;&amp;gt;
{
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Ribbon &lt;/span&gt;_regionTarget;

    &lt;span style="color:blue;"&gt;protected override void &lt;/span&gt;Adapt(&lt;span style="color:#2b91af;"&gt;IRegion &lt;/span&gt;region, &lt;span style="color:#2b91af;"&gt;Ribbon &lt;/span&gt;regionTarget)
    {
        _regionTarget = regionTarget;
        region.ActiveViews.CollectionChanged += OnActiveViewsChanged;
    }

    &lt;span style="color:blue;"&gt;private void &lt;/span&gt;OnActiveViewsChanged(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;NotifyCollectionChangedEventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:blue;"&gt;switch &lt;/span&gt;(e.Action)
        {
            &lt;span style="color:blue;"&gt;case &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NotifyCollectionChangedAction&lt;/span&gt;.Add:

                &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;RibbonTab &lt;/span&gt;tab &lt;span style="color:blue;"&gt;in &lt;/span&gt;e.NewItems)
                    _regionTarget.Tabs.Add(tab);
                &lt;span style="color:blue;"&gt;break&lt;/span&gt;;

            &lt;span style="color:blue;"&gt;case &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NotifyCollectionChangedAction&lt;/span&gt;.Remove:

                &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;RibbonTab &lt;/span&gt;v &lt;span style="color:blue;"&gt;in &lt;/span&gt;e.NewItems)
                    _regionTarget.Tabs.Remove(v);
                &lt;span style="color:blue;"&gt;break&lt;/span&gt;;
        }
    }

    &lt;span style="color:blue;"&gt;protected override &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IRegion &lt;/span&gt;CreateRegion()
    {
        &lt;span style="color:blue;"&gt;return new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;AllActiveRegion&lt;/span&gt;();
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; &lt;a&gt;Aqu&amp;#237;&lt;/a&gt; puedes encontrar un &lt;b&gt;How To&lt;/b&gt; que explica c&amp;#243;mo crear un &lt;b&gt;RegionAdapter&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Para finalizar con la parte del Shell, ya s&amp;#243;lo queda registrar el nuevo &lt;b&gt;RegionAdapter&lt;/b&gt; dentro del &lt;b&gt;Bootstrapper&lt;/b&gt;. Para ello, hay que sobre escribir el m&amp;#233;todo &lt;b&gt;ConfigureRegionAdapterMappings&lt;/b&gt;. Ello permitir&amp;#225; que al cargar un m&amp;#243;dulo, el &lt;b&gt;RegionAdapter&lt;/b&gt; se ejecute.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;protected override &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RegionAdapterMappings &lt;/span&gt;ConfigureRegionAdapterMappings()
{
    &lt;span style="color:#2b91af;"&gt;RegionAdapterMappings &lt;/span&gt;mappings = &lt;span style="color:blue;"&gt;base&lt;/span&gt;.ConfigureRegionAdapterMappings();
    mappings.RegisterMapping(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Ribbon&lt;/span&gt;), &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RibbonControlRegionAdapter&lt;/span&gt;());
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;mappings;
}&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Una vez llegado a este punto, es necesario crear un m&amp;#243;dulo. En este caso concreto el m&amp;#243;dulo de configuraci&amp;#243;n. En este m&amp;#243;dulo se puede crear una clase que sirva de ayuda para crear el &lt;b&gt;RibbonTab&lt;/b&gt;. &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ToolBarPresenter &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IToolBarPresenter
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;#region &lt;/span&gt;IToolBar Members

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RibbonTab &lt;/span&gt;CreateModuleToolBar()
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;tab = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RibbonTab&lt;/span&gt;();
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;group = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RibbonGroup&lt;/span&gt;();
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;btn = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RibbonButton&lt;/span&gt;();

        tab.Label = &lt;span style="color:#a31515;"&gt;&amp;quot;Configuration&amp;quot;&lt;/span&gt;;
        
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;cmd = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RibbonCommand &lt;/span&gt;{ LabelTitle = &lt;span style="color:#a31515;"&gt;&amp;quot;Configuration&amp;quot;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/span&gt;};
        cmd.Executed += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ExecutedRoutedEventHandler&lt;/span&gt;(cmd_Executed);
        cmd.CanExecute += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CanExecuteRoutedEventHandler&lt;/span&gt;(cmd_CanExecute);

        btn.Command = cmd;
        group.Controls.Add(btn);            
        tab.Groups.Add(group);
      
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;tab;
    }

    &lt;span style="color:blue;"&gt;private void &lt;/span&gt;cmd_CanExecute(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;CanExecuteRoutedEventArgs &lt;/span&gt;e)
    {
        e.CanExecute = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;
    }

    &lt;span style="color:blue;"&gt;private void &lt;/span&gt;cmd_Executed(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;ExecutedRoutedEventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:green;"&gt;//Do something
    &lt;/span&gt;}

    &lt;span style="color:blue;"&gt;#endregion
&lt;/span&gt;}&lt;/pre&gt;

&lt;p&gt;Una vez creado el &lt;b&gt;RibbonTab&lt;/b&gt; simplemente hay que asociarlo a la regi&amp;#243;n espec&amp;#237;fica para el &lt;b&gt;RegionAdapter&lt;/b&gt; actu&amp;#233; al cargar el m&amp;#243;dulo en la aplicaci&amp;#243;n.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;IRegion &lt;/span&gt;ribbom = _regionManager.Regions[&lt;span style="color:#2b91af;"&gt;RegionNames&lt;/span&gt;.RibbonRegion];
&lt;span style="color:blue;"&gt;var &lt;/span&gt;toolbar = _container.Resolve&amp;lt;&lt;span style="color:#2b91af;"&gt;IToolBarPresenter&lt;/span&gt;&amp;gt;();

&lt;span style="color:#2b91af;"&gt;RibbonTab &lt;/span&gt;tab = toolbar.CreateModuleToolBar();
ribbom.Add(tab);
ribbom.Activate(tab);&lt;/pre&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=37072" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TtF7yN7gyDuFqPmR9nbJgpb94WI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TtF7yN7gyDuFqPmR9nbJgpb94WI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TtF7yN7gyDuFqPmR9nbJgpb94WI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TtF7yN7gyDuFqPmR9nbJgpb94WI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/RH-pQPaadRo" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/Composite+Application+WPF/default.aspx">Composite Application WPF</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/02/08/ribbon-control-y-prims.aspx</feedburner:origLink></item><item><title>Probando tipos internos</title><link>http://feedproxy.google.com/~r/pedroafa/~3/U61tG-37feg/probando-tipos-internos.aspx</link><pubDate>Wed, 04 Feb 2009 21:53:00 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:37025</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=37025</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/02/04/probando-tipos-internos.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;Internal&lt;/b&gt; es un operador utilizado para modificar la visibilidad de una tipo en .Net. El operador indica que tipo al que es aplicado sólo será visible dentro de ese ensamblado, es decir, dentro de ese proyecto.&lt;/p&gt;
&lt;p&gt;El uso de este modificador puede suponer un problema a la hora de realizar un test. Ya que su utilización impide que desde el proyecto pueda ser visto el tipo. &lt;/p&gt;
&lt;p&gt;Para permitir que el tipo pueda ser utilizado desde un test, y por lo tanto, poder probar toda la funcionalidad del tipo. El ensamblado del test debe de ser declarado como “amigo”. Para conseguir esto, se debe decorar la dll a probar con el atributo &lt;b&gt;InternalsVisibleToAttribute&lt;/b&gt;. Este atributo especifica que los tipos solamente son visibles dentro del propio ensamblado y visibles desde el ensamblado marcado en el atributo.&lt;/p&gt;
&lt;p&gt;Así que para probar los tipos &lt;b&gt;Internals&lt;/b&gt; de mi ensamblado (&lt;b&gt;Sector7G.Invertis.YahooService&lt;/b&gt;), deberé indicar que mi proyecto de test (&lt;b&gt;Sector7G.Invertis.YahooService.Test&lt;/b&gt;) tiene acceso a estos tipos. Para ello, dentro del archivo &lt;b&gt;AssemblyInfo.cs&lt;/b&gt; del ensamblado &lt;b&gt;Sector7G.Invertis.YahooService&lt;/b&gt; añado la siguiente línea:&lt;/p&gt;&lt;pre class="code"&gt;[&lt;span style="COLOR:blue;"&gt;assembly&lt;/span&gt;: &lt;span style="COLOR:#2b91af;"&gt;InternalsVisibleTo&lt;/span&gt;(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Sector7G.Invertis.YahooService.Test&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;
&lt;p&gt;Con esta decoración ya es posible probar, desde el proyecto de test, todos los tipos como si fueran públicos.&lt;/p&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=37025" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tB1V0f4awG2W5a4O-MXifgupSFA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tB1V0f4awG2W5a4O-MXifgupSFA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tB1V0f4awG2W5a4O-MXifgupSFA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tB1V0f4awG2W5a4O-MXifgupSFA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/U61tG-37feg" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/Testing/default.aspx">Testing</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/02/04/probando-tipos-internos.aspx</feedburner:origLink></item><item><title>[Code-Snipped] Leer Un Tipo Enumerado De Un Xml Con LinQ To Xml</title><link>http://feedproxy.google.com/~r/pedroafa/~3/iuDDC7HC2-4/code-snipped-leer-un-tipo-enumerado-de-un-xml-con-linq-to-xml.aspx</link><pubDate>Tue, 03 Feb 2009 21:49:00 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:37010</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=37010</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/02/03/code-snipped-leer-un-tipo-enumerado-de-un-xml-con-linq-to-xml.aspx#comments</comments><description>&lt;p&gt;El objetivo es cargar la entidad &lt;b&gt;StockQuotes&lt;/b&gt; con los datos contenidos en el xml &lt;b&gt;StockQuotes.xml&lt;/b&gt;. Para ello debemos de tener en cuenta que el tipo &lt;b&gt;StockStates&lt;/b&gt; se trata de un enumerado.&lt;/p&gt;
&lt;p&gt;
&lt;table class="" cellspacing="0" cellpadding="2"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;xml &lt;/span&gt;&lt;span style="COLOR:red;"&gt;version&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="COLOR:red;"&gt;encoding&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="COLOR:blue;"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;StockQuotes&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;StockQuote&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;Santander&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;State&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;Green&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;State&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;StockQuote&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;StockQuote&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;Banesto&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;State&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;Red&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;State&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;StockQuote&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;StockQuotes&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td class=""&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;StockQuote
&lt;/span&gt;{
 &lt;span style="COLOR:blue;"&gt;public string &lt;/span&gt;Name {&lt;span style="COLOR:blue;"&gt;get&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt;;}
 &lt;span style="COLOR:blue;"&gt;public &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;StockStates &lt;/span&gt;State {&lt;span style="COLOR:blue;"&gt;get&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt;;}
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Leer el xml usando Linq To Xml resulta muy sencillo.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;XDocument &lt;/span&gt;xml = &lt;span style="COLOR:#2b91af;"&gt;XDocument&lt;/span&gt;.Load(&lt;span style="COLOR:#a31515;"&gt;@&amp;quot;C:\StockQuotes.xml&amp;quot;&lt;/span&gt;);
&lt;span style="COLOR:blue;"&gt;var &lt;/span&gt;data = &lt;span style="COLOR:blue;"&gt;from &lt;/span&gt;s &lt;span style="COLOR:blue;"&gt;in &lt;/span&gt;xml.Descendants(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;StockQuote&amp;quot;&lt;/span&gt;)
           &lt;span style="COLOR:blue;"&gt;select new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;StockQuote &lt;/span&gt;{
               Name = s.Element(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;).Value,
               State = s.Element(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;State&amp;quot;&lt;/span&gt;).ParseToEnum&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;StockStates&lt;/span&gt;&amp;gt;()
           };&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;La gracia de este código reside en el método extendido &lt;b&gt;ParseToEnum&lt;/b&gt;. Se trata de un método que permite convertir un elemento &lt;b&gt;XElement&lt;/b&gt; en un enumerado.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public static class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;EnumExt
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public static &lt;/span&gt;T ParseToEnum&amp;lt;T&amp;gt;(&lt;span style="COLOR:blue;"&gt;this &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;XElement &lt;/span&gt;node)
    {
        &lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;(node == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)
            &lt;span style="COLOR:blue;"&gt;return default&lt;/span&gt;(T);

        &lt;span style="COLOR:blue;"&gt;try
        &lt;/span&gt;{
            &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;(T)&lt;span style="COLOR:#2b91af;"&gt;Enum&lt;/span&gt;.Parse(&lt;span style="COLOR:blue;"&gt;typeof&lt;/span&gt;(T), node.Value);
        }
        &lt;span style="COLOR:blue;"&gt;catch&lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;Exception&lt;/span&gt;)
        {
            &lt;span style="COLOR:blue;"&gt;return default&lt;/span&gt;(T);
        }
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Un ejemplo de la potencia del lenguaje combinando Genéricos con métodos extendidos. &lt;/p&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=37010" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TSXI7JE0omOqsuiahVk1YBN3mo4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TSXI7JE0omOqsuiahVk1YBN3mo4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TSXI7JE0omOqsuiahVk1YBN3mo4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TSXI7JE0omOqsuiahVk1YBN3mo4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/iuDDC7HC2-4" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/02/03/code-snipped-leer-un-tipo-enumerado-de-un-xml-con-linq-to-xml.aspx</feedburner:origLink></item><item><title>El Nombre 'InitializeComponent' No Existe En El Contexto Actual</title><link>http://feedproxy.google.com/~r/pedroafa/~3/e3Yg4BYRQtE/el-nombre-initializecomponent-no-existe-en-el-contexto-actual.aspx</link><pubDate>Tue, 03 Feb 2009 21:43:00 GMT</pubDate><guid isPermaLink="false">b86c0850-82e5-42ed-a9d8-bde9e8f94ec1:37009</guid><dc:creator>Pedroafa</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://kartones.net/blogs/sector7g/rsscomments.aspx?PostID=37009</wfw:commentRss><comments>http://kartones.net/blogs/sector7g/archive/2009/02/03/el-nombre-initializecomponent-no-existe-en-el-contexto-actual.aspx#comments</comments><description>&lt;p&gt;Estábamos copiando unos &lt;b&gt;UserControls&lt;/b&gt; de un proyecto a otro para unificarlos en un solo proyecto y cuando quisimos compilar nos encontramos con este error. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;The name &amp;#39;InitializeComponent&amp;#39; does not exist in the current context&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Este error puede producirse por tres causas diferentes: &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Primera Causa&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;Que dentro del archivo xaml no esté correctamente referenciado el archivo de code-behind del &lt;b&gt;UserControl&lt;/b&gt;. Ya que el &lt;b&gt;namespace&lt;/b&gt; donde se encuentra la clase, debe de ser el mismo que el declarado en el atributo &lt;b&gt;x:Class&lt;/b&gt; del archivo xaml.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;UserControl &lt;/span&gt;&lt;span style="COLOR:red;"&gt;x&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;:&lt;/span&gt;&lt;span style="COLOR:red;"&gt;Class&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;Sector7G.Invertis.Wpf.Module.StatusBar.Views.StatusBarControl&amp;quot;
    &lt;/span&gt;&lt;span style="COLOR:red;"&gt;xmlns&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;
    &lt;/span&gt;&lt;span style="COLOR:red;"&gt;xmlns&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;:&lt;/span&gt;&lt;span style="COLOR:red;"&gt;x&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;namespace &lt;/span&gt;Sector7G.Invertis.Wpf.Module.StatusBar.Views
{
    &lt;span style="COLOR:blue;"&gt;public partial class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;StatusBarControl &lt;/span&gt;: &lt;span style="COLOR:#2b91af;"&gt;UserControl&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;IStatusBarView
    &lt;/span&gt;{
        &lt;span style="COLOR:blue;"&gt;public &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;IStatusBarPresenter &lt;/span&gt;Presenter { &lt;span style="COLOR:blue;"&gt;get&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt;; }

        &lt;span style="COLOR:blue;"&gt;public &lt;/span&gt;StatusBarControl()
        {
            InitializeComponent();
        }
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Segunda Causa&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;También puede deberse porque falten algunas declaraciones de las propiedades del proyecto. Suele ocurrir cuando se intenta añadir un &lt;b&gt;UserControl&lt;/b&gt; de WPF a una Librería de clases en .NET 2.0. El error es debido a que el proyecto no sabe cómo debe compilar este tipo de controles. Ya que en .NET 2.0 ni existía el concepto WPF, así que hay que convertirlo en un proyecto de tipo WPF.&lt;/p&gt;
&lt;p&gt;Para solucionarlo hay que editar el proyecto (el archivo &lt;b&gt;.csproj&lt;/b&gt;). En el archivo encontraras una línea como la siguiente:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Import &lt;/span&gt;&lt;span style="COLOR:red;"&gt;Project&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=“$(MSBuildBinPath)\Microsoft.CSharp.targets” /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Debajo de esta línea copia esta otra. Esta segunda línea indica al proyecto que es de tipo WPF.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Import &lt;/span&gt;&lt;span style="COLOR:red;"&gt;Project&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=“$(MSBuildBinPath)\Microsoft.WinFX.targets” /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Tercera Causa&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;En nuestro caso habíamos copiado el &lt;b&gt;UserControl&lt;/b&gt; de un proyecto a otro. Así que por alguna razón o fuerza entraña, el tipo de compilación (la propiedad &lt;b&gt;Build&lt;/b&gt; &lt;b&gt;Action&lt;/b&gt;) del archivo xaml se estableció a “&lt;b&gt;CodeAnalysisDictionary&lt;/b&gt;” en vez de quedarse como “&lt;b&gt;Page&lt;/b&gt;”. El &lt;b&gt;build&lt;/b&gt; &lt;b&gt;Action&lt;/b&gt; de un archivo xaml debe de ser &lt;b&gt;Page&lt;/b&gt;.&lt;/p&gt;&lt;img src="http://kartones.net/aggbug.aspx?PostID=37009" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/l1L_nS-_4XnT4-bMTcKpQhDxBks/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l1L_nS-_4XnT4-bMTcKpQhDxBks/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/l1L_nS-_4XnT4-bMTcKpQhDxBks/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l1L_nS-_4XnT4-bMTcKpQhDxBks/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pedroafa/~4/e3Yg4BYRQtE" height="1" width="1"/&gt;</description><category domain="http://kartones.net/blogs/sector7g/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://kartones.net/blogs/sector7g/archive/tags/WPF+3.5/default.aspx">WPF 3.5</category><feedburner:origLink>http://kartones.net/blogs/sector7g/archive/2009/02/03/el-nombre-initializecomponent-no-existe-en-el-contexto-actual.aspx</feedburner:origLink></item></channel></rss>
