<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-142613817781134327</id><updated>2024-10-04T23:08:53.575-03:00</updated><title type='text'>Vicrodg´s blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-4715008939538891233</id><published>2010-12-31T14:40:00.001-03:00</published><updated>2010-12-31T14:40:28.308-03:00</updated><title type='text'>Capitulo 12–Usuarios y seguridad de datos</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;em&gt;Hola nuevamente!! ... perdón la demora. Como actualmente me encuentro en Barcelona trabajando, no he podido hacerme tiempo para mi blog.&lt;/em&gt;&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;em&gt;&lt;b&gt;Espero que algunos ya hayan podido rendir &lt;/b&gt;&lt;b&gt;esta certificación, y para los que no, continúo con el resumen. Espero les sirva.&lt;/b&gt;&lt;/em&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;em&gt;Muchas gracias por los comentarios!. &lt;/em&gt;&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&amp;nbsp; _&lt;strong&gt;&lt;em&gt;____________________________________________________________________&lt;/em&gt;&lt;/strong&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;/font&gt;&lt;/b&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;font color=&quot;#ffff00&quot;&gt;Usuarios y seguridad de datos&lt;/font&gt;&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;En una empresa es importante controlar quién puede acceder a los datos confidenciales.  &lt;p align=&quot;justify&quot;&gt;Por ej., una aplicación para el seguimiento de gastos debe mostrar a los usuarios sus propios gastos, pero los administradores pueden ver los gastos de otras personas.  &lt;p align=&quot;justify&quot;&gt;La protección de datos requiere la coordinación de varias tecnologías diferentes. Seguridad basada en roles (RBS) que permite controlar lo que los usuarios pueden acceder en función de su nombre de usuario y pertenencias a grupos.  &lt;p align=&quot;justify&quot;&gt;Para proteger los datos, el Framework de. NET proporciona herramientas de criptografía para cifrar, validar y firmar datos.  &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;font color=&quot;#ffff00&quot;&gt;Lección 1- Autentificación y autorización de usuarios&lt;/font&gt;&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;Autentificación es identificar al usuario. A partir de PINs o nombres y contraseñas.  &lt;p align=&quot;justify&quot;&gt;Autorización es el proceso de verificar si el usuario tiene permiso de acceder a algo o no. generalmente sucede después de la autentificación.  &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;La clase windowsIdentity&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;i&gt;System.Security.Principal.&lt;/i&gt; WindowsIdentity nos da acceso al nombre de usuario actual de windows, el tipo de autenticación y un número token. Almacena el resultado de la autenticación, incluyendo su username y token.  &lt;p align=&quot;justify&quot;&gt;Para poder crear una instancia de WindowsIdentity se puede llamar a cualquiera de estos métodos:  &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;GetAnonymous&lt;/b&gt;, representa un usuario no autenticado &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;GetCurrent&lt;/b&gt;, devuelve el usuario actual de Windows &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;Impersonate&lt;/b&gt;, devuelve un WindowsImpersonationContext que representa un usuario específico en el sistema.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align=&quot;justify&quot;&gt;Ejemplo:  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVwjAyTyYD9GYNxGkOuvHLCxwH_4YmVrztfvtDv4xTcAco-4Mx0ijdopmyKe0kMrsGVaXFoFm6h8JwTLMUFFXo-eNThqR_1h85GdTzkQL1GBvZTTyWDryT28cOrWqqww57bUbnJkSyq3A/s1600-h/clip_image0014.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image001&quot; border=&quot;0&quot; alt=&quot;clip_image001&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHbJCkihHhbah_kvnFmU9Ci4TpEE8QH3V_nSJ2kpIj-woaTzEsS8Bp1F04bx78czZlnzZdk-G5EB50RsMeSzNlwo-ilXamVP6GLaAv6bPI_3NtpykUvWJbRyDEFs3VEWR5mFdCPNIaAl0/?imgmax=800&quot; width=&quot;489&quot; height=&quot;36&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Después de que la variable es asignada, sus propiedades son:  &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· AuthenticationType, cadena que representa el método de autenticación (NTLM normalmente) &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· IsAnonymous, indica si un usuario anónimo. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· IsAuthenticated, indica si es usuario autenticado. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· IsGuest, indica si el usuario es invitado. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· IsSystem, indica si el usuario es parte del sistema. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· Name, una cadena representando el dominio y username de la forma &quot;DOMAIN\Username&quot;. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· Token, un entero representando el token de autenticación del usuario.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMs_afE1xJl81QOCRyjL4lgPgvhyS7lvjmRt4Qxalv3VeEMojs3RoibfjinGpnL94GR1puAUFM8QKAPlByHVbcycTYzqE-lC6e2nGk9w3a97llYtC-WEyi3Uc_pHgIKzKOYl9Z1VXkbR0/s1600-h/clip_image0025.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image002&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhacLxzKoHTZQ3pf6GhnvH0LkM04mGDPQw3Nrem-pJITan0LCup_vQ-AOPmjWr2fbZNcCZgDOnLmQcGJSYbnOwcPaeSsmc7lSw_0YM0ZsfHulrvtNLFxYw-g-FYsu9VMuovmK4wW7tssHE/?imgmax=800&quot; width=&quot;534&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Clase WindowsPrincipal&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;Esta clase nos brinda acceso al group membership. Se debe crear usando una instancia de WindowsIdentity. Por ejemplo:  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgclPtPjSspTHU8-b9eRDI0HFyrUvLFQGNvTtfUfBwNSgbT6Tbjk95ZfmCU-zjCYmD15ch5yEbLUXQdOVQ8GFOVGM7HNgd8aEpOq7d9YbwBe9nk5Bf0QV2fHnh4bpYjAGVrIk_RQEXpt2I/s1600-h/clip_image0034.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image003&quot; border=&quot;0&quot; alt=&quot;clip_image003&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-A5WrGzcUpZoOD7H9FPfPXIfAM6_lM2WBAsDdFrvVxzCn-7LYB9dFGYlxA24R36yiKru3tpC0QpTOr3iiBIG-RcLyvUz_5xv9TxScd2f0bsG9rQ8t3lUzwnsHF63is8UPgY2rIKeh1Ew/?imgmax=800&quot; width=&quot;516&quot; height=&quot;51&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Otra forma de conseguir una instancia de WindowsPrincipal, es usando el thread principal  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZqDeGle4iQ9ipJieHeCagA5uZNRU4Pb8OYEd54WFGQjEiYTzbEpIDTYmmpBLPD1Grv4ZEu1ZmVKoKYsWAEmj2N2XIwik_Po86CARg9SB_bu8Xy_3eDnam2gqzxdf7S-b6_BN4y2ZmGrs/s1600-h/clip_image0045.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image004&quot; border=&quot;0&quot; alt=&quot;clip_image004&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8IkPhL4en8NWK3rXM2WQdtiXNjnYk9jp4_wikpYTkch8ePevbmCVhMxjooLGYps3zyKPpBfMTr372xTY012TM6CdhEdSIHX2UYlFSWI82sBOw3KmaaL53Ywo5W4KMgnyCGNU11xUpvHA/?imgmax=800&quot; width=&quot;520&quot; height=&quot;36&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;El método más importante de esta clase es: IsInRole. Y se puede usar de la siguiente manera:  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXO9OLs5uAvhBBlwzcxLQ5P5NAK3x9Y2b5PI3aPNFN4CzuYy0UtfsXcGhbCn08VdkX-8GOHHTmnojBtwjvmcqGV-cXiRpoNX1Om3K8K2T9YRCmPgzVrOa6CjnXvaRF5vf2HmOyg-2cPEQ/s1600-h/clip_image0064.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image006&quot; border=&quot;0&quot; alt=&quot;clip_image006&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbVNjqn7kSOpydjv1wIzY4KZdTvSuVOKqLZSiv1ZCjzxET5fzFhcxy9ppqh5QBiMqyr5gDOYErq_J-cWidNpO3wBi3eEHC8OonmnkAEVnF1sgeIODFwagEFz87ryZFdypQEEo_iHNYD2k/?imgmax=800&quot; width=&quot;550&quot; height=&quot;184&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;La mayoría de las veces, no se sabrá el nombre del equipo o el nombre de dominio antes de tiempo como para insertarlo en la cadena que se pasa al método IsInRole. En lugar de esto, se puede usar System.Environment.MachineName para obtener los nombres de grupos de la maquina local, o System.Environment.UserDomainName para especificar los nombres de grupos que existen en maquina local o en un Active Directory Domain.  &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Clase PrincipalPermission&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;La clase PrincipalPermission es útil para realizar acciones de seguridad, imperativas y declarativas. Se pueden combinar cualquiera de las 3 propiedades de esta clase:  &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;Authenticate&lt;/b&gt;, indica si requiere que el usuario este autenticado. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;Name&lt;/b&gt;, string con el username. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;Role&lt;/b&gt;, string que debe coincidir con uno de los roles principales.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align=&quot;justify&quot;&gt;PrinciapalPermission posee el método Demand que verifica si el usuario activo tiene los permisos indicados.  &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Cómo usar la declarativa para realizar peticiones de seguridad para restringir el acceso a los métodos?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;La RBS Declarativa restringe el acceso a un método. El problema que tiene es que si en runtime se lanza una excepción por un evento de windows, este la captura y la aplicación se puede detener.  &lt;p align=&quot;justify&quot;&gt;Para usar RBS declarativa, se debe tener en el código:  &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· El método System.AppDomain.CurrentDomain.SetPrincipalPolicy para especificar la política de seguridad. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· Bloques try/catch para capturar acceso desprivilegiado y mostrarlo como error. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· El Atributo PrincipalPermission para declarar requerimientos de acceso a método.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align=&quot;justify&quot;&gt;Ejemplo:  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9y-TTDR_MjFBhnhVtg4EcLHXgv9WqA01BSaFfXB3_lsERVgHk4ym4lQdtdIvdFWoKaLUqxeqILmr2LSgJ0a0KJcSzU9bUYeLNaqGbGxHHGlPQVuZaWjMdNi0pWYKh5bCVbVLXOhMqCiM/s1600-h/clip_image0075.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image007&quot; border=&quot;0&quot; alt=&quot;clip_image007&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglRFAAxEJq3UcNHcyTdSNSksQ3Pzl1wB7HCotyltGv3lPZVfvN0bITj2Cuq5oNB-kVn3yQp8UOyjsTHSVCKW3zsqEsH_P5ZQt-suYI1DmAz-W6RDJ_6ltqNDUduPOJSWENJQO31EvMzlQ/?imgmax=800&quot; width=&quot;526&quot; height=&quot;104&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Ejemplo con varias declarativas:  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6cgXc-wMep6ZvbIHpec4v6s_-VeacAlcTISckELFzZ2_u3lPufm4C4B7X8P_opHSmvDRYc7CbQ7GXo7Jk3hohT8DZ5UYgeQmFO_v_Z40tr9zn58yjO7uKG9gaDyMKpnoh6pALBJSCyIY/s1600-h/clip_image0096.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image009&quot; border=&quot;0&quot; alt=&quot;clip_image009&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsNADGR_y3bp8CFYLSYCaCyp3uPoP4ss82jyzdQdEE8pGI3OXGF6VARG2Ukp4CKvwEpjuQYTWgwvmyfliNYKUKLcyFV4WFZT-zLHjoEgJ_svLbx62ckgkUdQ_M_FTQPLsTUSK63KQ4s5M/?imgmax=800&quot; width=&quot;550&quot; height=&quot;102&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Cómo&lt;/b&gt;&lt;b&gt; usar el método imperativo de seguridad basado en demandas para crear aplicaciones que restrinjan el acceso a porciones de su lógica?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;El método imperativo de demandas RBS le permiten restringir las porciones de un método, mientras que las demandas RBS declarativa los restringen en su totalidad.  &lt;p align=&quot;justify&quot;&gt;Para usarla se deben de tener 4 elementos:  &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· El método System.AppDomain.CurrentDomain.SetPrincipalPolicy para especificar las políticas de seguridad principales. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· Bloques Try/catch para capturar accesos no privilegiados. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· El objeto PrincipalPermission con propiedades acordes a las restricciones que se quieren imponer. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· Una llamada al método PrincipalPermission.Demand para declarar los requerimientos de acceso al método.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align=&quot;justify&quot;&gt;Ejemplo, el código una lanza excepción (que se captura con System.Security.SecurityException), si el usuario no es miembro del grupo Administrators:  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPyoOEf7xI6f14zf9UGssZYvgbeIesKVMfA0XCuTzRJJz1XzrrNGuS91qnfu_Gwx2k0eOMjjNfNEzIjLpyL5lEWvLkm0VJ8kAoV0RwACZW06ynurJ5pKXmjXlnCmblozPXTFmgCI_vAYs/s1600-h/clip_image0115.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image011&quot; border=&quot;0&quot; alt=&quot;clip_image011&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnlP9Acg3fOnbvyd8qESeVOgL7jbe7ipUm0mr5TgxMlw-uIHn4XN6SekvR2NyLVNxqzF3Cd2wKXVJWevHWsVj-QL0bCizNZwLZKV1Ew0ikyfJZw6ID-LjAh0CuQlUDXrRsaPLqX7y3qyo/?imgmax=800&quot; width=&quot;566&quot; height=&quot;35&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Como implementar usuarios y roles personalizados?&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;Si se necesita autenticar a los usuarios contra una base de datos personalizada, se pueden utilizar las interfaces System.Security.Principal.IIdentity y System.Security.Principal.IPrincipal. Además se pueden ampliar aplicando clases de identidad propias, con propiedades y funcionalidades adicionales.  &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Cómo&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;crear&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;una&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;clase&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;de identidad&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;personalizada?&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;La interfaz IIdentity sirve para crear clases de identidad personalizadas.  &lt;p align=&quot;justify&quot;&gt;WindowsIdentity, FormsIdentity y PassportIdentity son clases que implementan esta interfaz. Mientras que GenericIdentity ofrece una implementación flexible de IIdentity.  &lt;p align=&quot;justify&quot;&gt;Para implementar esta interfaz, se deben usar las siguientes propiedades:  &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;AuthenticationType&lt;/b&gt;, string que almacena la descripción del mecanismo de autenticación del usuario. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;IsAuthenticated&lt;/b&gt;, se setea este valor en true cuando el usuario ha sido autenticado. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;Name&lt;/b&gt;, string que guarda el username.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align=&quot;justify&quot;&gt;Además de este, se debe realizar un constructor que defina cada una de las propiedades.  &lt;p align=&quot;justify&quot;&gt;Ejemplo:  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcos_V5o2UKGPYfeNMDCBZrbAS4zUzUKRaGnZmrx9Ksm17jO2zpbmt3u6g2voCauhLKgIsGzzlFMk00c1Jp7C7hpPOXzIQ1-y6trFik5AJCc8gRzc8ImDYFkJaIZ5cDGZvCXZrkHTw4tA/s1600-h/clip_image0125.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image012&quot; border=&quot;0&quot; alt=&quot;clip_image012&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsX-XtHweQXHZ2Do2lLT5ZXNBkOgWlu4X_6AVSXmJVTBC1ogIKFsXKgxwJBea3HWZGlrjIdXo4mTvX577n7PwQBz3srg71fYAcuOwhJ7wYsPE6IzBIOm__T95Miu2_bdJq0lc__q43XNA/?imgmax=800&quot; width=&quot;474&quot; height=&quot;323&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Cómo&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;crear&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;una&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;clase&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;principal&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;personalizada?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;WindowsPrincipal y GenericPrincipal están basadas en la interfaz IPrincipal. Los objetos basados en esta interfaz representan el contexto de seguridad de un usuario, incluyendo la identidad del usuario y cualquier rol o grupo al que pertenezca.  &lt;p align=&quot;justify&quot;&gt;Para implementar la interfaz IPrincipal, debemos de implementar al menos un constructor, una propiedad y un método. El constructor debe aceptar un objeto IIdentity y un arreglo de strings que contienen los roles de identidad. La propiedad que se debe implementar es IPrincipal.Identity que debe devolver el identity principal del objeto.  &lt;p align=&quot;justify&quot;&gt;El metodo IPrincipal.IsInRole que toma un string y un rol y retorna true cuando el identity principal es un miembro de ese rol; sino retorna false.  &lt;p align=&quot;justify&quot;&gt;También se pueden añadir otras funcionalidades sobrescribiendo IPrincipal:  &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· Añadir una propiedad Roles que devuelva un arreglo de strings conteniendo los roles del usuario. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· Agregar los métodos IsInAllRoles y IsInAnyRole que indiquen si el usuario es miembro de múltiples roles. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· Añadir los métodos IsHigherThanRole y IsLowerThanRole que habiliten jerarquía en los grupos de membresía.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align=&quot;justify&quot;&gt;Ejemplo de implementación:  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv6np6dCAXdRsvWdjlbJ5fCCwYlhkyxO9Ck4FpFZADsc_fEVhX8qxV1umFncHfV6h_V-hnTUuYCPsS92gFqwvuESjaKEscPButv9KtVUQYV8xH8CJ6wk3abMZLfagunBLLdHB8r8jxUZA/s1600-h/clip_image0134.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image013&quot; border=&quot;0&quot; alt=&quot;clip_image013&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuiwvN3TKdA0TCHqelNVZeonRBdi8INZJN3WRmZzuPjEf34k19Gi3GkFZ3aCsi9NrKMQ089kLD73P1X5vfbpNq6LCJY1FRktJjVtDogaYMlyamMTKPUsjaBcEmPQlHX-RyvdUUbf00ELs/?imgmax=800&quot; width=&quot;507&quot; height=&quot;394&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Como crear modelos simples de privilegios de usuario personalizados?&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;Si solo se necesitan las funcionalidades básicas de IIdentity y IPrincipal, se debe usar System.Security.Principal.GenericIdentity y System.Security.Principal.GenericPrincipal. Estas clases implementan solo las propiedades y métodos requeridos por las interfaces. Cada uno ofrece constructores que la aplicación debe de usar para especificar las propiedades de cada clase.  &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;GenericIdentity&lt;/b&gt;: tiene 2 constructores. Se puede usar un username, o un username y el tipo de autenticación.  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1J5ZpRSlr7-b_5n_FYyFIeL-lb_d7cIj80zWydD6GqNpk18W0BJELC3C-x7p5XlNNX15iE7LoWtHWZNK2ysuXdWmrdDTh0Ntk1a2-4ltWzapLsUI-d1AK941ZaesOq1BxZg3Dn_3U4r0/s1600-h/clip_image0156.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image015&quot; border=&quot;0&quot; alt=&quot;clip_image015&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSIVmFnLou-b2vteaWPYrzcmmN1cIvk-xXstvWDdK43QHkQxmuzpUT-kqvsPpoSZeeUyoVMQFC6lkr02GMSf76L6hb1BZyyUMpMByFEUF9P_Eq0pTrxajLy_ZQtjFu6AUnnocIDn7XQjA/?imgmax=800&quot; width=&quot;574&quot; height=&quot;35&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;GenericPrincipal&lt;/b&gt;: tiene un constructor que pide un GenericIdentity y un arreglo de string con los roles de identidad.  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjte18oVSq3PREDC577j1iZGRzkbEgDD48Y2Vcw69z_e7vcSwOz8QJKa3c_NyMYTuWWBGaI1c7YsiuxXmCHQy1fRbCvRTn7Q1-TBVculaFhPvJhDIMloWjGKzCLt4h0Y1wzY9hvXrsZotE/s1600-h/clip_image0164.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;clip_image016&quot; border=&quot;0&quot; alt=&quot;clip_image016&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2-RpnqKwlbau__OY4pHHRlCy9gxAhNReCKIjsLGmbB9-cUckbJW-sHdioVV1wiX49y29hT0LyWpl3hifHbiY_wUhyphenhyphen-riguXBRlgWBNAR06O7HI7X-kfOoyxCHJNke-3xuNI8WcN9HOFk/?imgmax=800&quot; width=&quot;489&quot; height=&quot;52&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Después de crear el objeto principal, principal.IsInRole(&quot;Users&quot;) debería retornar true.  &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Cómo&lt;/b&gt;&lt;b&gt; utilizar demandas RBS con identidades personalizadas y principals?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;Si es que se define custom IIdentity y IPrincipal, o se usa GenericIdentity y GenericPrincipal, se puede usar declarativa e imperativa RBS estos pasos:  &lt;p align=&quot;justify&quot;&gt;1. Crear un objeto IIdentity o GenericIdentity que represente al usuario actual.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;2. Crear un objeto IPrincipal o GenericPrincipal basado en mi objeto IIdentity&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;3. Setear Thread.CurrentPrincipal a mi objeto IPrincipal&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;4. Adherir una declarativa o imperativa RBS.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Manejando excepciones en Streams&lt;/b&gt;  &lt;p align=&quot;justify&quot;&gt;Para manejar autenticaciones remotas, se usa: System.Net.Security.NegotiateStream o System.Net.Security.SslStream.  &lt;p align=&quot;justify&quot;&gt;Estas excepciones pueden ser:  &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;System.Security.Authentication.AuthenticationException:&lt;/b&gt; Una excepción de este tipo indica que se debe solicitar al usuario credenciales diferentes y que vuelva a intentar la autenticación. &lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;· &lt;b&gt;System.Security.Authentication.InvalidCredentialException&lt;/b&gt;: indica que el stream no se encuentra en un estado válido, y no se puede volver a intentar la autenticación.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/4715008939538891233/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/12/capitulo-12usuarios-y-seguridad-de.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4715008939538891233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4715008939538891233'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/12/capitulo-12usuarios-y-seguridad-de.html' title='Capitulo 12–Usuarios y seguridad de datos'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHbJCkihHhbah_kvnFmU9Ci4TpEE8QH3V_nSJ2kpIj-woaTzEsS8Bp1F04bx78czZlnzZdk-G5EB50RsMeSzNlwo-ilXamVP6GLaAv6bPI_3NtpykUvWJbRyDEFs3VEWR5mFdCPNIaAl0/s72-c?imgmax=800" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-3453411738353057750</id><published>2010-11-30T04:21:00.006-03:00</published><updated>2011-03-17T13:00:33.750-03:00</updated><title type='text'>Capitulo 11 - Seguridad de aplicaciones</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 1- entendiendo la seguridad de acceso a código Code Access Security (CAS)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;¿Qué es el código de seguridad de acceso? &lt;/b&gt; &lt;br /&gt;
La seguridad de acceso a código (CAS) es un sistema de seguridad que permite a los administradores y desarrolladores de aplicaciones controlar y autorizar a los usuarios. Con CAS, se puede permitir que una aplicación lea y escriba en el registro. Se puede controlar la autorización usando seguridad basada en roles de sistema (RBS), de:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;El sistema de archivos&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;El registro&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Impresoras&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Los registros de sucesos&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Elementos de seguridad de acceso a código&lt;/b&gt;  &lt;br /&gt;
Cada sistema de seguridad necesita una forma de identificar a los usuarios y determinar lo que un usuario puede o no puede hacer. Como CAS identifica y asigna los permisos a las aplicaciones en lugar de a la gente, que no puede utilizar los nombres de usuario, contraseñas y listas de control de acceso (ACL). En cambio, CAS identifica assemblies usando evidencias. Una evidencia es una manera de identificar la ubicación donde se almacena, un hash del código del assembly, o su firma. Un conjunto de pruebas determina el código de grupo al que pertenece y le otorga permisos.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Qué es la evidencia?&lt;/b&gt;  &lt;br /&gt;
La evidencia es la información que se obtiene en tiempo de ejecución acerca de un assembly a para determinar qué grupos de código pertenece. Las formas comunes de pruebas incluyen la carpeta o el sitio Web donde el assembly se está ejecutando y sus firmas digitales.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Clases del namespace System.Security.Policy:&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;232&quot;&gt;&lt;b&gt;Evidencia&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt;&lt;b&gt;Descripción&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;232&quot;&gt;&lt;b&gt;Application directory&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt;Directorio donde se encuentran los assemblies. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;232&quot;&gt;&lt;b&gt;Hash &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt;El hash criptográfico del assembly, identifica de forma exclusiva una versión específica de un ensamblado. Cualquier modificación al assembly, el hash no es válido.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;232&quot;&gt;&lt;b&gt;Publisher &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt;Firma digital del editor de assemblies, que identifica de forma única el desarrollador de software.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;232&quot;&gt;&lt;b&gt;Site &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt;El sitio del cual se baja el assembly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;232&quot;&gt;&lt;b&gt;Strong Name&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt;Nombre de cifrado fuerte del assembly, que identifica de forma exclusiva el espacio de nombres de este. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;232&quot;&gt;&lt;b&gt;URL &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt;URL del cual se baja el assembly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;232&quot;&gt;&lt;b&gt;Zone &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt;Zona donde se ejecuta el assembly, Internet o intranet Local.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;¿Qué es un permiso?&lt;/b&gt;  &lt;br /&gt;
Un permiso es una entrada de control de acceso del CAS. Por ejemplo, el permiso de diálogo de archivos que determina si un assembly puede interactuar con el usuario con un cuadro de diálogo Abrir, el cuadro de diálogo Guardar, ambas o ninguna.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidn6ophPT9pJDgMrwtLujlWkX5nECAglSFNRQSZviUwbQ3j37hVfItqyf1M75lJyxrFY-i7v9tm2r78cetFLO-uzHp_imHH9BfuZ71tkc9A_o6dFNBILyVrkydrRGN8IMq6Ar6JdCy2js/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;382&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiwjiK2sMniQg05o245PK2tCrX70IulqWwELqEW5hrWbMuEegzyUfElt7dwt6MUqrTumLXqeY7_fUK8WLcy5agJ98h6BZBLPcC3rXW85ZOlkZIyWiv6NoEfEfvkou1cPEV_zONC8hOnmQ/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;362&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
De forma predeterminada, 19 permisos están disponibles para la configuración en el archivo.  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;Permisos&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Descripcion&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;Directory Services &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Otorga un acceso al Active Directory. se pueden especificar las rutas, o ver si el acceso de escritura está disponible.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;DNS&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Activa o restringe el acceso de un ensamblado a presentar peticiones DNS.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;Environment&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;Variables&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Otorga a los assemblies acceso a las variables de entorno, Ruta de acceso, nombre de usuario, y número De Procesadores. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;Event Log &lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Proporciona un acceso a los registros de sucesos. Puede permitir el acceso ilimitado o limitar el acceso a la navegación o auditoría.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;File Dialog &lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Controla si un assembly puede pedir al usuario el cuadro de diálogo Abrir, el cuadro de diálogo Guardar, o ambos.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;File IO&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Restringe el acceso a los archivos y carpetas. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;Isolated Storage &lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Permite el acceso al almacenamiento aislado. Se puede configurar el nivel de aislamiento y el tamaño de la cuota de disco.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;Message Queue &lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Permite acceder a las colas de mensajes, que puede ser restringido por la ruta y el tipo de acceso.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;Performance Counter &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Controla si un assembly puede leer o escribir los contadores de rendimiento.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;&lt;b&gt;Printing&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;460&quot;&gt;Limita la capacidad que tiene un ensamblado para imprimir&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;b&gt;Conjuntos de permisos &lt;/b&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;Permisos&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;488&quot;&gt;Descripción del conjunto&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;b&gt;FullTrust&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;488&quot;&gt;Exime a un assembly de las comprobaciones de permisos CAS.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;b&gt;SkipVerification &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;488&quot;&gt;Permite a un assembly eludir las comprobaciones de permisos, que puede mejorar el rendimiento, pero sacrifica la seguridad.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;b&gt;Execution &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;488&quot;&gt;Permite a un assembly ejecutarse y no le otorga ningún otro permiso.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;b&gt;Nothing &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;488&quot;&gt;No otorga permisos. ni siquiera les permite ejecutarse.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;b&gt;LocalIntranet &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;488&quot;&gt;Otorga un conjunto abundante de permisos, incluyendo imprimir y tener acceso al registro de eventos. no permite acceder al sistema de archivos, excepto a través de los cuadros de diálogo, Abrir y Guardar.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;b&gt;Internet &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;488&quot;&gt;Conjunto restringido de permisos. se puede ejecutar un ensamblado con muy poco riesgo.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;b&gt;Everything &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;488&quot;&gt;Otorga todos los permisos.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;b&gt;¿Qué son los grupos de código?&lt;/b&gt; Los grupos de código de autorización que son dispositivos ensamblados asociados con conjuntos de permisos. Si un administrador desea conceder un conjunto de usuarios acceso a una carpeta, el administrador crea un grupo de usuarios, añade a los usuarios del grupo, y después asigna los permisos de archivos para el grupo.&lt;br /&gt;
Por ejemplo, cualquier código que se ejecuta a través de Internet debe ser un miembro del grupo de código Internet_Zone.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2UiX_jU5cWh52fSJlWOmDbXeelhpGFwlqlK-dHz2y1pu8-fy9c26TnFKuUUaHOAQ8IuTYbPcebbL5U3Sc3r5S16RaZv_skp-eyap_rU75JJcfIaZUOTZuvFdBC9yHfTJt5R4M1qbaUSk/s1600-h/image%5B7%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;412&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm9cR3DjxF50qKzDJAsCWvqnNXixIhUC-AA98BZ5Cx5RDDGOcT3IJJ-xzPy4mn8TUYD2TNzqx_N9l90ehyphenhyphenj5-cx13EPK-YZLl1GlCxvXkTtnKPsK-AowDFEkH_dTyt8_KYCp9T6qNF6fE/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;381&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
La autorización de control de grupos de usuarios está basado en ACL (&lt;i&gt;Access control list- lista de control de acceso&lt;/i&gt;) distribuidas y asociadas a cada recurso, los grupos de código establecen el uso centralizado de autorización. Sin embargo, no se puede especificar los permisos individuales de un grupo de código. Un grupo de código debe estar asociado a un conjunto de permisos.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjll-U286p1LRPLNEf0uAxYlVkfbTZ_uGVuuk4gMw4C3YRwI59_iXpWHIf7R4Srvgvf0VMPhfaMzUsmH3AWnd9JgPkGkGlRd4qKwdoiQxl3H9heaQsOAUFIxXMbR40Cfp6LWGTrUu9oPjI/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;396&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFVkKBxsR48lTPi9cq69XwG32fAdAQjMA-31OwGgoIq1kOsc56NekVPc8ZMGyW_ONzTAOTdYUZVwwUUdtsTspcmaEcJ6qWpygiP6-rXaCcUnJA9YgdN_lhwQHi8vKPVuUFkJ4YI1klWBY/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;367&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
La Internet_zone asigna un conjunto de permisos de internet.  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Grupos de código por defecto&lt;/b&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt;Code Group&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;217&quot;&gt;Evidencia&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;Conjunto de Permisos&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt;&lt;b&gt;My_Computer_Zone &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;217&quot;&gt;Zone: My Computer&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;FullTrust&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt;&lt;b&gt;LocalIntranet_Zone &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;217&quot;&gt;Zone:Local Intranet&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;LocalIntranet&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt;&lt;b&gt;Internet_Zone &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;217&quot;&gt;Zone:Internet&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;Internet&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt;&lt;b&gt;Restricted_Zone &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;217&quot;&gt;Zone:Untrusted sites&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;Nothing&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt;&lt;b&gt;Trusted_Zone &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;217&quot;&gt;Zone:Trusted sites&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;Internet&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;b&gt;¿Qué es la Política de Seguridad?&lt;/b&gt;  &lt;br /&gt;
Una política de seguridad es una agrupación lógica de grupos de código y conjuntos de permisos. Puede contener ensamblados personalizados que definen otros tipos de políticas.  &lt;br /&gt;
Las políticas de seguridad proporcionan a los administradores la flexibilidad para configurar opciones del CAS en múltiples niveles. Hay cuatro niveles de políticas configurables: empresa (enterprise), equipo (machine), usuario y dominio de aplicación.  &lt;br /&gt;
El nivel de empresa es la política de nivel de seguridad más alta, se puede configurar mediante el servicio de directorio Active Directory. En el nivel equipo, se aplica a todo el código se ejecutan en un equipo determinado. Directiva de usuario es el tercer nivel, y define los permisos por usuario. Dominios de aplicación las tratamos en el capítulo 8.  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Cómo funciona CAS con el sistema operativo de Seguridad?&lt;/b&gt;  &lt;br /&gt;
CAS es completamente independiente de la seguridad del sistema operativo. De hecho, debe utilizar las herramientas diferentes para administrar CAS.  &lt;br /&gt;
Al determinar si un assembly puede tomar una acción concreta, tanto CAS como la seguridad del sistema operativo se evalúan. Por ejemplo, si CAS otorga un acceso conjunto para escribir en el directorio C: \ Windows, pero el usuario no tiene ese permiso, el assembly no puede escribir en la carpeta.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo8lQRpIkMuaFODYH6WVCsIpG2IXeBzVUxtEuAvJ1sH7S-YKmLSOejj74hR311smMeMFTnvOL0sunLZz39RD3J_mVvPrXfnmpVtiWIYHzhYPFVo05Q2z7k6wgb767oczMhPqCYYkDkg7s/s1600-h/image%5B16%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;345&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhkMM-PHfFi4SkNl1TI49-jvkVU3Gp9kHj7eOsnKwLTlcGl63SKYn12jEe8jxs2Bv0m7C4w8MgWjRLdJ22g3G3vfkkrvqgt-_p6FLex6pXDebbI-zizg_cTS72y-aYgVqQSWg-1zUycYg/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;255&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Cómo utilizar la Herramienta de configuración de .Net Framework para configurar CAS&lt;/b&gt;? La herramienta de configuración. NET Framework proporciona una interfaz gráfica para la gestión la política de seguridad y las aplicaciones que utilizan servicios remotos. Tareas que se pueden realizar: La evaluación de un assembly para determinar de qué grupos de código que es miembro.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· Determinar los permisos que se le asignará a un assembly.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;· Agregar nuevos conjuntos de permisos.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;· Agregar nuevos grupos de código.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;· Aumentar la confianza de un ensamblado.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;· Ajustar la zona de seguridad.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;· Restaurar los niveles de política.&lt;/li&gt;
&lt;/ul&gt;Para mayor información de cómo configurar directivas de seguridad con el CAS, selecciones &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/7c9c2y1w%28v=VS.80%29.aspx&quot;&gt;aqui&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como usar la herramienta de política de seguridad de código de acceso?&lt;/b&gt;  &lt;br /&gt;
Podemos utilizar la herramienta Caspol.exe, para examinar y modificar la configuración de la máquina, el usuario y el nivel de la Enterprise de las políticas de seguridad de código de acceso. Esta proporciona una funcionalidad similar a la línea de comandos.  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Algunas opciones más utilizadas en caspol&lt;/b&gt;  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;Opc&lt;b&gt;ion&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Descripc&lt;b&gt;ion&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-addfulltrust assembly_file &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Agrega un assembly que implementa un permiso personalizado o una condición de pertenencia personalizada. El argumento assembly_file específica el ensamblado que se va a añadir. Este archivo debe estar firmado con un nombre seguro.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-addgroup parent_name&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;membership_condition&lt;/b&gt;&lt;b&gt;&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;permission_set_name &lt;/b&gt;&lt;b&gt;[flags]&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Agrega un nuevo grupo de código. El argumento parent_name específica el nombre del grupo de código padre. El argumento membership_condition especifica la condición de pertenencia para este.  &lt;br /&gt;
El argumento permission_set_name es el nombre del conjunto de permisos que se asociará con el nuevo grupo de código. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;-all &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Indica que todas las opciones siguientes éste se aplica a la empresa, equipo, y la directiva de usuario actual.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-chggroup name&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;{membership_condition |&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;permission_set_name &lt;/b&gt;&lt;b&gt;|&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;flags&lt;/b&gt;&lt;b&gt;}&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Para cambiar el estado de un grupo de código, el conjunto de permisos, el nivel Final, etc. name: específica el nombre del grupo de código para cambiar.&lt;br /&gt;
permission_set_name: específica el nombre del conjunto de permisos a asociarse con el grupo de código. membership_condition: condiciones para el grupo.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-enterprise&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Indica que todas las opciones de la política de nivel empresarial. Los usuarios que no son administradores no tienen derechos para modificar la política de empresa, aunque pueden verla.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-execution {on | off}&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Activa o desactiva el permiso para ejecutar código antes de que se ponga en marcha.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-help&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Muestra la sintaxis de comandos y opciones para caspol.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-list&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Listas los grupos de código y permisos.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-listdescription&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Muestra todas las descripciones de grupos de código de un nivel específico.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-listfulltrust&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Enumera el contenido de la lista de confianza del nivel especificado.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-listgroups&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Muestra los grupos de código de nivel especifico. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-listpset&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Muestra los conjuntos de permisos del nivel especificado o todos los niveles &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-machine&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Indica que todas las opciones que se aplican a la política machine.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-quiet&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Deshabilita temporalmente el mensaje que se muestra con una opción de hacer cambios de política.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-recover&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Recupera la política de seguridad desde una copia de seguridad. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;192&quot;&gt;&lt;b&gt;-remgroup&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;411&quot;&gt;Quita el nombre de grupo de código especificado. Contiene otros grupos también los elimina a todos.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Para saber más información sobre cómo realizar configuraciones con Caspol, &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/a0ke3k86.aspx&quot;&gt;aquí.&lt;/a&gt;  &lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;&lt;b&gt;Lección 2 – usando declarativas de seguridad para proteger Assemblies.&lt;/b&gt;&lt;/span&gt;  &lt;br /&gt;
En algunas situaciones, la seguridad del CAS es tan restrictiva que la aplicación no tiene los permisos necesarios para las funciones más básicas. En otras, la aplicación tendrá más .  &lt;br /&gt;
Se puede utilizar declarativa de demanda CAS para asegurar que tiene todos los permisos necesarios, pero ninguno de más.  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Razones para utilizar&lt;/b&gt;&lt;b&gt; las declaraciones de CAS del assembly&lt;/b&gt;&lt;b&gt;&lt;/b&gt;  &lt;br /&gt;
Hay tres razones principales:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· Para asegurarse de que en tiempo de ejecución no se ejecute la aplicación, sin permitir el acceso a los recursos necesarios. Se usa SecurityAction.RequestMinimum para declarar todos los permisos CAS que requiere la aplicación. Si un usuario intenta ejecutar la aplicación y la política de seguridad del CAS no otorga el permiso requerido, se produce una excepción. Los usuarios no podrían identificar el problema de la excepción, pero un administrador sí.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;· Para crear un pequeño cajón de arena y asegurarnos de que un atacante no maneje la aplicación para hacer tareas no deseadas: tomar información del contenido de los archivos privados, destruir datos, multiplicación virus y gusanos.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;· Para comprobar que la aplicación se puede ejecutar con permisos limitados CAS y se ejecutan en zonas de confianza parcial. Utilizando las declaraciones SecurityAction.RequestOptional, el tiempo de ejecución se otorgan sólo los permisos especificados.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Clases&lt;/b&gt;&lt;b&gt; para los permisos CAS&lt;/b&gt;&lt;b&gt;&lt;/b&gt;  &lt;br /&gt;
CAS puede restringir el acceso a muchos tipos de recursos- archivos y carpetas, impresoras, acceso a la red:  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;PerformanceCounterPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Para acceder a los contadores de rendimiento.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;PrincipalPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Para controlar el acceso de usuarios y de grupos. Se explica en el capítulo 12.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;PrintingPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Para el acceso a las impresoras.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;ReflectionPermission &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Descubre información, en tiempo de ejecución, sobre un tipo.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;RegistryPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Para Leer, escribir, crear o eliminar claves del Registro y sus valores.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;SecurityPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Para Ejecutar, afirmar los permisos, permite llamar a código no administrado y omitir la comprobación.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;ServiceControllerPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Para acceder a servicios en marcha o parados.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;SiteIdentityPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Define un permiso de identidad para el sitio Web desde el que se origina el código.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;SocketPermission &lt;/b&gt;&lt;b&gt;aceptar &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Para realizar conexiones en una dirección de transporte.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;SqlClientPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Permite el Acceso a base de datos SQL.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;StorePermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Contiene los certificados X.509.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;StrongNameIdentityPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Define el permiso de identidad para los nombres fuertes.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;UIPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Permite el acceso de los usuarios a la interfaz. Necesarios para depurar una asamblea.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;UrlIdentityPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Define el permiso de identidad para la dirección URL de donde se origina el código.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;WebPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Para Realizar o aceptar conexiones en una dirección Web.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;243&quot;&gt;&lt;b&gt;ZoneIdentityPermission &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;360&quot;&gt;Define el permiso de identidad para la zona de donde se origina el código.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Tipos de declaraciones de permisos de assemblies&lt;/b&gt; &lt;br /&gt;
Todas las clases de permiso atributos definen la propiedad Action, que se especificará en tiempo de ejecución cuando se interprete el permiso, para establecer la propiedad Acción se usa uno de los tres miembros de la enumeración SecurityAction: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· SecurityAction.RequestMinimum requiere permiso para que el ensamblado se ejecute.&lt;/li&gt;
&lt;li&gt;· SecurityAction.RequestOptional niega todos los permisos que no figuran en un SecurityAction.RequestOptional o en la declaración SecurityAction.RequestMinimum. &lt;/li&gt;
&lt;li&gt;· SecurityAction.RequestRefuse Reduce los permisos asignados a la aplicación Se de. e utilizar este tipo de declaración para asegurar que la aplicación no tiene acceso a los recursos críticos de los que se podría abusar.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Cómo crear declaraciones de assemblies&lt;/b&gt; &lt;br /&gt;
Ejemplo de código que requiere acceso de lectura al archivo C: \ boot.ini. Si la política de seguridad no concede ese permiso a la asamblea, el tiempo de ejecución produce una excepción antes de ejecutarlo. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXUMGp9bNQqVskUr90x_m6Oc1qyBzvBZyVh9jIcKQKfdn2kkO-0CApxM3sUr7KwSYfBTHGAZF28rM1QisXn4odUlk6To655wJiXzWeQX_zPETa64uvH1Qdm524jxetj1FkOj0anrTGX14/s1600-h/image%5B4%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;275&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_9zEndwH1XGEEr4vSMyxDv5RaD-y5p19y5MbTDkZ941yTN_r7LspYAi-BKRZ3TtnDFyINpo9q-382TANWM6KAK2NKwyWm2Tu9SGFSMnLQKWPBny4-pcCel2wGFZsMQxCm00Xa9Jtohh0/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;490&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 3 – Usando la seguridad imperativa y declarativa para proteger métodos &lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
CAS puede ser utilizado tanto de forma declarativa, done el compilador comprueba la seguridad antes de que se ejecute el código, o imperativamente, donde el propio código realiza controles de seguridad.  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Los tipos de solicitudes de permiso &lt;/b&gt;&lt;b&gt;de los &lt;/b&gt;&lt;b&gt;Método&lt;/b&gt;&lt;b&gt;s&lt;/b&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Existen seis opciones para los permisos de imperativo y declarativo dentro de un método: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· &lt;b&gt;Assert&lt;/b&gt;: se encarga de que en tiempo de ejecución se ignore el hecho de que los llamadores que no tenga el permiso especificado. &lt;/li&gt;
&lt;li&gt;· &lt;b&gt;Demand&lt;/b&gt;: hace en tiempo de ejecución se lance una excepción si algún llamador falta algún permiso especificado.&lt;/li&gt;
&lt;li&gt;· &lt;b&gt;Deny&lt;/b&gt;: causa que en tiempo de ejecución se reduzca el acceso del método mediante la eliminación del permiso especificado.&lt;/li&gt;
&lt;li&gt;· &lt;b&gt;InheritanceDemand&lt;/b&gt; : se encarga a de producir una excepción si el assembly que hereda de la clase no tiene el permiso especificado.&lt;/li&gt;
&lt;li&gt;· &lt;b&gt;LinkDemand&lt;/b&gt;: Causa que en tiempo de ejecución se lance una excepción si el llamador inmediato, pero no llamadores en la pila, la falta a un permiso especificado.&lt;/li&gt;
&lt;li&gt;· &lt;b&gt;PermitOnly&lt;/b&gt; se encarga de que en tiempo de ejecución se reduzca el acceso del método mediante la eliminación de todos los permisos excepto un permiso especificado.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Recomendaciones para la utilización de la solicitud de permisos de métodos&lt;/b&gt; &lt;br /&gt;
Consejos para elegir los métodos CAS a utilizar: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· Se debe usar la declaración SecurityAction.PermitOnly para limitar los permisos disponibles para cada método. Hay que listar todos los permisos que el método requiere.&lt;/li&gt;
&lt;li&gt;· Usar la declaración SecurityAction.Deny para refinar los permisos disponibles de cada método.&lt;/li&gt;
&lt;li&gt;· Se debe utilizar CodeAccessPermission.PermitOnly para reducir permisos cuando una sección de un método requiere menos permisos que el resto del método. &lt;/li&gt;
&lt;li&gt;· Usar CodeAccessPermission.RevertPermitOnly para restaurar el permiso.&lt;/li&gt;
&lt;li&gt;· Se debe usar CodeAccessPermission.Assert cuando se desea permitir que el código de confianza parcial llame a un método que requiere permisos de la persona. &lt;/li&gt;
&lt;li&gt;· Usar CodeAccessPermission.Demand sólo cuando el ensamblado implementa una funcionalidad ustomized, que no se basa en una funcionalidad incorporada en el framework de .NET, tales como las llamadas a código no administrado.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Técnicas para Exigir permisos&lt;/b&gt; &lt;br /&gt;
Mediante una enumeración que contiene las opciones Demand y LinkDemand. La diferencia entre las dos enumeraciones y métodos es que Demand hace que el permiso se verifique para cualquier caller (llamador), mientras que LinkDemand comprueba sólo el llamador inmediato. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como realizar demanda declarativa permisos CAS?&lt;/b&gt; &lt;br /&gt;
Para crear una petición declarativa, se debe utilizar la clase SecurityAction.Demand o SecurityAction.LinkDemand: &lt;br /&gt;
Ejemplo de dos métodos que utilizan FileIOPermissionAttribute (en System.Security. licencias) y WebPermissionAttribute (en System.Net) para verificar la declaración que los llamadores de los métodos, para que tengan acceso a archivos específicos y al sitio Web &lt;a href=&quot;http://www.microsoft.com/&quot;&gt;www.microsoft.com&lt;/a&gt;. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD5Ub2WyTL9zKC4WQpjyla3ME5PTOwtYUebFUDOOKWRKp2_eJLrAQnL7l7NlqeviuEcac7eOj66OeR23mvis-7CSFiKpmJnA7rB1E35vlcbFAxgAJXRIhyphenhyphengsCvlonhPwQHHNhgfv6z-2Y/s1600-h/image%5B26%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;236&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj_jqZCLcFiV1-Fmzb4Tb8fVsH_ckwAwlyH-m0CuJCOcBn5fHqsc0mtXh-cZdrB6EPyzI6bk3P_f0bQrDjITdAszoWRKENqbIEssJ_7-tfjhooKmXl2wuO9TMMRhJxUuBL1OtAO5d5BbM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;404&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
Si hacemos clases que otros desarrolladores pueden obtener y no queremos que esto suceda, se puede restringir el assembly mediante la enumeración SecurityAction.InheritanceDemand. Por ejemplo, para assemblies que solo tengan la firma en el directorio C: \ Certificados \ MyCertificate.cer: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhys-lFSlE6oZ_jmY1xobBbGt04eklR8ihsLDOODw-IanGZ3oAXRp86IS2YO7NSl9jrqZyZPZazmTTDZFdBxskpRIsbt-_0b0Z6m_Fmetubh36P24pMP86I9EmH8wJHax2yE4Re4JkgH94/s1600-h/image%5B22%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;115&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7f3UF-qyjbsR9tTMDMN1vF5L76Y8wd1IcJmb7QH7Td3_20JDk5HVGphlYboe4vKDH1HmfESjlWtfSY0Dzs-PrrHkN-Xa8fOTTdLXQe8hzmQ9CavGbQYxlaOXXFEiMMdQXQou6KbNDOcY/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;499&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como demandar imperativamente los permisos CAS?&lt;/b&gt; &lt;br /&gt;
En las declaraciones CAS, hay un método CodeAccessPermission con el mismo nombre y la función que se utiliza para los permisos de imperativo. Se utilizan las enumeraciones SecurityAction para la seguridad declarativa y los métodos CodeAccessPermission de seguridad imperativa. &lt;br /&gt;
El ejemplo de cómo realizar las mismas comprobaciones declarativas CAS, pero con la comprobación imperativa: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxtX5Y12JAnNMiHNp3jaQ51_FFtLDxQXWDNL97Wz2P4xucWLlBa_-QeeNiuAqVkFzXAITuFvl9-cDqsU2vsHQ7A6repZo0kEhj_ccETAZnq0Z6eF_WU9ZhYlSkub27opMHlbFFqN3iNUg/s1600-h/image%5B17%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;430&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisXaqHF-VEdUt3wdHqP-CZlmbR7hyphenhyphen1YxGM3YbOEykUPvL1P358OtBFEUW_y1XPT43LZWeByfu-QVf2-Lzj7QD-cC6GqL7S8L4CXWkmcYE4Sjurt6FLapAH-5UcjoD4IlYOhBp8aXcjYuM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;553&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Cómo relajar permisos y mejorar el rendimiento?&lt;/b&gt; &lt;br /&gt;
Uso de las demandas CAS mejora la seguridad, pero disminuye el rendimiento. &lt;br /&gt;
Una llamada CAS obliga en tiempo de ejecución a comprobar sistemáticamente el permiso de cada persona que llama. LinkDemand, es una manera de mejorar el funcionamiento del método de la demanda, pero se sacrifica seguridad.  &lt;br /&gt;
&lt;br /&gt;
Otra técnica es el método Assert, que hace eludir los controles de seguridad en tiempo de ejecución. &lt;br /&gt;
Por ejemplo, si crea un objeto RegistryPermission y se llama al método Assert, se debe conceder RegistryPermission. Si se llama a otro método que utiliza Demand para exigir RegistryPermission, este tendrá éxito si a la persona que llama se le han concedido los permisos RegistryPermission. Para utilizar Assert (declarativa o imperativamente) la sintaxis es la misma a otros tipos de declaraciones de CAS: &lt;br /&gt;
Declarativa: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL3R2rayKLGrN1qzZ0_JW4wnS1o7oxsKsCYcFofBvc3aNdG3dubMJaGBacifJGwRZmBpOxip1jZqus0kdIRHya_Zo4KqxsiAqEmB3FoeyYEPhF9eNdoeoS0YG_tq2a5h78x8jRnjYGzsk/s1600-h/image%5B11%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;122&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfWopEyKBMlCYUTmb4W7mo9_1ltF8dkz_ZAVLQKtQdyTB6LMxkTRbYmmb3DieZlOzhnos3oio9JdnNVBdIE_JMrQd_Y5cYNs_FXWLCo7gJ2W6cuGEZO8fpQXsqlSBDxwNZJDOfZd29Kr0/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;483&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Imperativa: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT7L5NlXMWZxuhQJpWSIiZO5yijcIMfOBVe_GrOhIuSV19uDC1ojvGp2blSJUWeDmb_vUI5GJVtck3oiDk6o1uiNid2q2trTbyB3Tx1rWuKdKzdr2o4dDhtvmWj-5FuH4OJ936SIlgTOA/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSFu0UPS-bszkR7zoYxk4RXtma9LLvELaWxSQ-QWsEnd9BD3mHu6MX8hoTDwthURh9I1-yG2EAAFi6_GvbqLs1nefq4NuvlaF-Mbl1Hif4BzH3U7OWWxDrSUpGWYbJwj51kjKbGMf_pxM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;540&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para ver otros ejemplos sobre el manejo de permisos haz clic &lt;a href=&quot;http://msdn.microsoft.com/es-ar/library/bb763046.aspx&quot;&gt;aquí&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.ziddu.com/download/14224469/Resumen70536-cap-11.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF &lt;/a&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;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;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;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; &lt;a href=&quot;http://www.4shared.com/file/AVcOCtMW/Cap_11.html&quot;&gt;Codigo Ejemplo&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/3453411738353057750/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/seguridad-de-aplicacionesparte-1.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/3453411738353057750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/3453411738353057750'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/seguridad-de-aplicacionesparte-1.html' title='Capitulo 11 - Seguridad de aplicaciones'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiwjiK2sMniQg05o245PK2tCrX70IulqWwELqEW5hrWbMuEegzyUfElt7dwt6MUqrTumLXqeY7_fUK8WLcy5agJ98h6BZBLPcC3rXW85ZOlkZIyWiv6NoEfEfvkou1cPEV_zONC8hOnmQ/s72-c?imgmax=800" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-3659387597881134516</id><published>2010-11-28T12:11:00.005-03:00</published><updated>2011-03-17T12:57:12.493-03:00</updated><title type='text'>Capítulo 10 – Instrumentación–Parte 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 3- Monitoreando de la Performance&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
No importa lo bien que una aplicación se ha diseñado, si no funciona bien, no será bien recibida por los usuarios. De hecho, los problemas de rendimiento a veces pueden ser notablemente más problemático que los errores tradicionales, ya que son muy difíciles de corregir: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt; Interfaz de usuario con pantallas congeladas o bloqueos de aplicaciones.&lt;/li&gt;
&lt;li&gt; Acceso a la red, conectividad de base de datos, entrada y salida de archivos muy lentas.&lt;/li&gt;
&lt;/ul&gt;La comprensión de cómo cada una de estas obras las áreas es fundamental para escribir las aplicaciones funcionan bien. Sin embargo, una vez que se implementa una aplicación, la vida puede llegar a ser muy complicado. &lt;br /&gt;
El espacio de nombres System.Diagnostics proporciona las herramientas necesarias para evitar un enfoque ineficaz para la solución de problemas. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Información general sobre&lt;/b&gt;&lt;b&gt; procesos&lt;/b&gt;&lt;br /&gt;
Un proceso es un trozo de memoria que contiene recursos. Es una tarea aislada realizada por el sistema operativo. Por lo tanto, un proceso posee uno o más hilos del sistema operativo. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;La clase process (en &lt;/b&gt;&lt;b&gt;namespace System.Diagnostics)&lt;/b&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Una instancia de un objeto process puede referenciar a cualquier proceso del sistema operativo, d una maquina local o remota. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Enumerando procesos&lt;/b&gt; &lt;br /&gt;
Hay cuatro métodos principales para determinar qué procesos se están ejecutando en un momento dado o para identificar procesos específicos: el método GetCurrentProcess, el GetProcessById, el GetProcessesByName, y el método GetProcesses. &lt;br /&gt;
El más simple es el método GetCurrentProcess que asocia un process con el proceso activo y lo devuelve: &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GetProcessById&lt;/b&gt; &lt;br /&gt;
Este método toma un id y retorna la información si esta es encontrad. En otra sobrecarga, se le pasa el id y el nombre de la máquina: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1tCpmYrbwHeXMh0VWOiUSFoEBuGvI0F26-NAdcAVK8N0QivUqflGNjnwb15hLr9QZ0xZmLcwW7TUOArh3GUkm6eIS5Ipb3De_0tq3nUeruntkRwx66h0oeOx0R_u3RNZI2ir03Nqt_PY/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;312&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBTpr5OVHxtlV1P3PQMDIMYvzo_BEKEWw1122G9m8kkCdV7hsRiRQCf-0NHvaLbdQuQ1z1FUjk1-arvsbbWZcWeP31ZnCWRYRjzV3rHBKoFter1LCjERU2lIXwWOhSQaEwowfciqJMiaY/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;481&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GetProcessByName&lt;/b&gt; &lt;br /&gt;
Recibe como parámetros el nombre del proceso y de la maquina:&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWUebHC0-1DNhhTIWl8pG687S4qCGr_CLG9BYSsUTMJsJrd2p-M1jdVE6w-LXNaTO9crJaPqN0UmyRrbSU3OtL2V6PVwkrE_vnh6T6-ZXpQa7NIl3mVyAlyuSL5l79QJY7i_FHVR2wiLI/s1600-h/image%5B8%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;105&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLtbsiAS6M96DVG6OjmPvmOsZQ1pzjJwjVd3uiIaHYiL3jzM6CKNxXR0EQ7rGJFs9sf7qCmIWoniztBmqrBB_tjy-RC0lbN23vVb8unhFeIXxApgf2IotZ5FtxVbXHsDfXx9Tgy9bEh-0/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;490&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usando contadores de Performance &lt;/b&gt; &lt;br /&gt;
Las consideraciones de rendimiento tienen gran impacto en la aceptación de a aplicación a un usuario. Para asegurarse de que este problema no ocurra, .Net framework provee la clase PerformanceCounter. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrOo9AOgGCdwpu5VXDQfZd9Dn9ISjUhtpIK-zF_0ZX4FvzP2mYqTBIneXuugDTz8q-EzB1Lqze-bHNMS1SZW-xZDtSOISfuWftl9nujXbQXJ4h_-YNBN78KsJ_iv-ZQzGNZJIKS6iRgFE/s1600-h/image%5B14%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;404&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuc2GeF4NJD4ZxzhNF8yw675W2GYcpqUF1sKz_fqhrmz9gRGMmmU7xYb2mf5ciLz0QVGGPtrHfhv4qsRAehiPw9GNeoYa_GF4Co35JnMXETIFiuQ5OAD_hxIMFa3bW0ftPMGqu9FX3704/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;434&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Los objetos PerformanceCounter permiten la recoger y recuperar datos de una manera limpia y orientada a objetos.Los valores de un objeto PerformanceCounter se almacenan en el Registro de Windows. Las propiedades que identifican un objeto PerformanceCounter son los siguientes: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· Nombre de equipo&lt;/li&gt;
&lt;li&gt;· Nombre Categoría&lt;/li&gt;
&lt;li&gt;· Categoría de la Instancia&lt;/li&gt;
&lt;li&gt;· Nombre de contador&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;La clase CounterCreationData&lt;/b&gt; &lt;br /&gt;
Sirve como un objeto contenedor de todas las propiedades que serán necesarios para crear un objeto PerformanceCounter. La clase CounterCreationData tiene tres propiedades.&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;122&quot;&gt;Nombre&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;477&quot;&gt;Descripcion&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;122&quot;&gt;&lt;b&gt;&lt;i&gt;CounterHelp&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;477&quot;&gt;descripción amable de un contador&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;122&quot;&gt;&lt;b&gt;&lt;i&gt;CounterName&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;477&quot;&gt;Nombre del contador&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;122&quot;&gt;&lt;b&gt;&lt;i&gt;CounterType&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;477&quot;&gt;Devuelve el &lt;i&gt;PerformanceCounterType del contador&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Para crear una nueva instancia de la clase CounterCreationData se debe declarar una nueva instancia del objeto, y setear cada propiedad de forma manual.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjreLHXkW9Iq-ES0uKRE9tvvB86j3r54C0RAJ94jblhN48IqSETWBmL0xW13vAB-xWpDaJYJLpJqdyN8RWfJ0dPMPkN0uBzKsT5Fj1DSFhazuWfA6XXn3HL4WyuKtYDmDwknEPFEVsKVJc/s1600-h/image%5B18%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;93&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2xsFKa-cUSsqgKW8Hl1XjZVANvRz7n4A27pg38wm9vQ5YJYhdGKtniDU2LcT_TrFPGhTjIttsyQ7ANCgcqJkzC3nvETyKjL6nbXSfh8Y8G0LknUMHDhMS7H3i52fH2rrqhrHf8zAP3zo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;466&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
O con otra sobrecarga del constructor: &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4CbWfr963aEnxrEw4ujqTPAp-x-p5eT81xWKwsQnVGkPwxassDmGpD9LnaDQndCv_daUCAlj-PvmU-kp_pHvpvVY9sfkGy2H4cDW3gRrow-kiXpTWyXDiqn2d56ka9AJD33RjMH8GUrU/s1600-h/image%5B22%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;66&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfgUXSf104iUwZ31vEQjc0ogc9zet8vYG0V05Rrl32mRRDbXhuKK8buLUjZBtv2cUq3xD-fVbldJGUaNwP8U7kOQg49ppDn6ueQ3k33cvEvMqGhaOchXKRvx-8mMTKWW4gTL2LOI4Xcdk/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;551&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;La clase PerformanceCounterCategory&lt;/b&gt; &lt;br /&gt;
El objetivo principal de la clase PerformanceCounterCategory es administrar y manipular objetos PerformanceCounter y sus categorías. Tiene cinco métodos estáticos:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;130&quot;&gt;&lt;b&gt;Create&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;468&quot;&gt;Crea una clase PerfomanceCounterCategory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;130&quot;&gt;&lt;b&gt;Delete&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;468&quot;&gt;Elimina una clase PerformanceCounterCategory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;130&quot;&gt;&lt;b&gt;Exist&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;468&quot;&gt;Determina si una PerformanceCounterCategory ya existe&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;130&quot;&gt;&lt;b&gt;GetCategories &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;468&quot;&gt;listas de cada uno de los PerformanceCounterCategories de una máquina dada&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;130&quot;&gt;&lt;b&gt;ReadCategory &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;468&quot;&gt;Lee todos los datos del contador y el rendimiento asociados a un determinado PeformanceCategory&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Iniciando procesos&lt;/b&gt; &lt;br /&gt;
Para que un proceso inicie se llama al método Start. El constructor de la clase Process tiene cinco sobrecargas, de las cuales tres son para los escenarios sin líneas de comando: &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;La clase ProcessStartInfo.&lt;/b&gt; &lt;br /&gt;
Este código crea una instancia de la clase ProcessStartInfo para iniciar un proceso específico. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg70tYxPHetgWB191u9FPCGCeTJ5s9jS1viwuWMdIctQgiaDy5BqA2_oku8Pe49_5gAUEJptzKzo6B0Cg7uXYOIyIkjuGR8vIOLI2dBPsKzV6MhGwa-AT5vWfzz_DoEJlXgrBPU_XmnNr0/s1600-h/image%5B26%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;70&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU1fF0oITkKos975-1Gff3LmTSPWghdSTjLSfL1xWTTz2TzfYXoMXBkDc9Fw-Ik0R2xSG547wHGx8NSptVP4Ll78bRinrH88bV4XmKkcURU85mJuVgoj8w3bbvoP4ULOYbVFd5LUF5YcE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;401&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
La segunda sobrecarga toma un solo parámetro de cadena que se corresponde con el nombre de la aplicación. Si la aplicación se instala como un programa, usted puede usar el nombre de la aplicación. De lo contrario, es necesario especificar el nombre de archivo completo. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk4O-qxihmtpGMZC2EC3uYbdfsJhjOLtHp6K0cyBr8Cuh5oA4bc214I8gSREqMxOuCwFK5q2Im7Kn9FWKDdkTQFJbbIpveaM2b4OgO7AXW2_UPbHOPxKBtARc7XY_7Ln_yv_Ln_PfbOBE/s1600-h/image%5B30%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;65&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP60Cbvh9aVFcI0oNv-nmUMRiGyJynzHEXJwCacp2570YGXUYkf7uMOE-4WbfzDU3NRbINmz1dXqC6mt4NGWsHjdXPHPSdGSmwPZipxlJE5Ka1JJZljuIHJWjGruGYVrxjyvGjEHiDhxM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;397&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
La tercera sobrecarga toma el nombre del archivo, un valor String que corresponde al nombre del usuario de inicio de sesión de usuario, la contraseña de inicio de sesión System.Security.SecureString del usuario y el nombre de dominio. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWvX3Ypj0kfaBmrYwPB2Jkz4UbwXjC8-OV1m6LXw_7wQMF6TDls1lu0U3_lBVijvkZyhiGSxuL6Ti1OCZTchZsIu1kQ-btubqNOJUY-vGxTLXyEp51wAMP8LYhYuRgTw47hWFuq5KtlBc/s1600-h/image%5B35%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;125&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2mUO1bbjwoGvEhvcYCOVJB3iFoz60vAbxP_2dO8NSywYHYyyESrQ96KR05Cfv12mvgmT1-n1qtwtjBwPhYx1pljQRK3qkThIWGqPjgnrcm_TQkCI3y2jZtBWGpjB1CJ9EV4lh3mySazs/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;561&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Las clases StackTrace y StackFrame&lt;/b&gt; &lt;br /&gt;
La clase StackTrace permite ver el estado de la llamada en tiempo de ejecución un cierto punto. &lt;br /&gt;
Cada vez que un método es llamado, un stackframe se agrega y se inserta en la pila. Cada método posterior se inserta en la pila que se ejecutará en orden último en entrar, primero en salir. &lt;br /&gt;
&lt;br /&gt;
Así, examinando la StackTrace y su StackFrames se tiene gran cantidad de información sobre el estado de la aplicación. Para ver una breve descripción de la clase StackFrame haga clic &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.diagnostics.stackframe_members%28v=VS.90%29.aspx&quot;&gt;aqui&lt;/a&gt;. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 4 – Detectando Manejadores de eventos&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
System.Management es un namespace que provee un conjunto de herramientas para monitorear el manejo del sistema, dispositivos y aplicaciones (a través de las herramientas de instrumentación para el manejo de Windows WMI). &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Enumerando objetos Managenent&lt;/b&gt; &lt;br /&gt;
El objeto DirectoryObjectSearcher es el central de esta namespace, mediante programación puede acceder a los recursos a través de WMI. Este mecanismo es fácil de usar porque la imita la sintaxis del Lenguaje de consulta estructurado (SQL), que la mayoría de los desarrolladores ya están familiarizados.  &lt;br /&gt;
Ejemplo de cómo ejecutar una consulta mediante el DirectoryObjectSearcher:&lt;br /&gt;
1. declarar una instancia de la clase ConnectionOptions, y establecer el nombre de usuario y contraseña.&lt;br /&gt;
2. Declarar una instancia de la clase DirectoryObjectSearcher.&lt;br /&gt;
3. Declarar un objeto ManagementScope, y establecer la ruta de acceso y la propiedad ConnectionOptions.&lt;br /&gt;
4. Crear un objeto ObjectQuery, y especificar una consulta para ejecutar.&lt;br /&gt;
5. Crear un ManagementObjectCollection, y configurarlo para que el valor de retorno sea el de la DirectoryObjectSearcher. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Enumeración de unidades lógicas&lt;/b&gt; &lt;br /&gt;
Para enumerar las unidades lógicas utilizando objetos del System.Management, lo principal que hay que hacer es especificar un objetivo, ej : consultar Win32_LogicalDisk y sus atributos de tamaño y el nombre será devuelto a través de un ManagementObjectCollection. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiauPVNYmwZFJjIkSr3Cxq7yhkpaAQKos0cLKx-4n5-lokwuaLt-aWyYGxgdrEmfvZtCLw5eUik0BgHIPwOGwxq2fb3t0qhSvMcVCyY1tGbvzqpnb2WJZpc-JknreF88ErTsoZvV-KsiIc/s1600-h/image%5B39%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;292&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisvUFodPz7mfIw8u2R6dkJjiAiouon3pDErKkuVP8Zwa6fmgSwD8zb7_jMXgfrbGkenQekkn_sezdbLh3I4zY4-CxjQrgkOr9iW4neN0IEWYPtH1qqjxBFlqswYt1GrIBPcx1bcc3KFZA/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;549&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Enumerar los adaptadores de red&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Utilizando la misma metodología, se puede enumerar todos los adaptadores de red en una máquina determinada, solo cambiando la consulta. (Se debe usar Win32_NetworkConfiguration en vez de la Win32_LogicalDisk). &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Recuperar información sobre qué servicios están detenidos&lt;/b&gt; &lt;br /&gt;
Recuperación de información sobre los servicios de Windows es igual de fácil que obtenerla de otros recursos, se debe: &lt;br /&gt;
1. Crear un nuevo objeto ManagementObjectSearcher. Escuchar &lt;br /&gt;
2. Especificar una consulta. &lt;br /&gt;
3. Llamar al método Get de la ManagementObjectSearcher &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3OQZP8d7temyISd-7dtUAs1cSzoHaIMzVNmu-l2CVWjAmNrYiX5fz8oU9UetEylOoTB6GbuKgsrVtPJNsia8yoF90TsTyhJnsfcLId_3VPYq4emZURCkd88-wqXLxgSsFWAnN5zWvIVU/s1600-h/image%5B43%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihuGSAjpoD81jPa1BUDBd0dbN7M3tUjmnmF1Y44-cX1WLgfF7qacR8_JbFd3lg4M1VfRYKFqxydFyRLxS-PcIhEPFhIXBeD_1yCEeJBkh7LQznE0yP2-v8V_za0TyAx6BKcp4u19h1TH4/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;564&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Suscribirse a un manejador de eventos usando la clase ManagementEventWatcher&lt;/b&gt; &lt;br /&gt;
La clase ManagementEventWatcher permite saber la información de suscripción sobre los eventos que ocurren en el contexto de WMI. Pasos a realizar: &lt;br /&gt;
&lt;ol&gt;&lt;li&gt; Crear un nuevo objeto ManagementEventWatcher.&lt;/li&gt;
&lt;li&gt; Asociar un EventQuery objeto de la misma.&lt;/li&gt;
&lt;li&gt; Llame al método WaitForNextEvent.&lt;/li&gt;
&lt;li&gt; Detener las notificaciones.&lt;/li&gt;
&lt;/ol&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5cuf6qroqFG-rk533Q1DiwIs2xBX_j_9u2Gt6ZOjYv7BRsbKYN6JL8i-qEUVNHzMMZoBh6-kTFTDSg7gAbg9-yGXFkV9hcXYmL8HQA_HL6AtsbVdRRQRql5Pre8lKHZYuwxysbrHMjMQ/s1600-h/image%5B48%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;209&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkBzjYcduHw_R4G9AFg0ZgLHEW71jGfUb91yhA2PaMxrE-kItgRTNKfiQ6Hgk9ogJLZMuMhX-296CbRW0A_TcrdI4u3Jih_W3DQ5Tri0zDuQSs20sptevpG5ulC7v-c0vWopL87efb_kY/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;544&quot; /&gt;.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.blogger.com/%20%20%09http://www.ziddu.com/download/14224468/Resumen70536-cap-10.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF &lt;/a&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;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;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;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; &lt;a href=&quot;http://www.4shared.com/file/PhnoWyHf/cap10.html&quot;&gt;Codigo Ejemplo&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/3659387597881134516/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/leccion-3-monitoreando-de-la.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/3659387597881134516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/3659387597881134516'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/leccion-3-monitoreando-de-la.html' title='Capítulo 10 – Instrumentación–Parte 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBTpr5OVHxtlV1P3PQMDIMYvzo_BEKEWw1122G9m8kkCdV7hsRiRQCf-0NHvaLbdQuQ1z1FUjk1-arvsbbWZcWeP31ZnCWRYRjzV3rHBKoFter1LCjERU2lIXwWOhSQaEwowfciqJMiaY/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-6122814318643014279</id><published>2010-11-21T20:30:00.004-03:00</published><updated>2010-11-28T13:02:13.687-03:00</updated><title type='text'>Capítulo 10 – Instrumentación–Parte 1</title><content type='html'>&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 1 – Logueando eventos&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
Es casi imposible saber de antemano todas las situaciones que pueden surgir después de que se implementa la aplicación, la forma de averiguarlo es usando un event log.  &lt;br /&gt;
&lt;b&gt;Usando Microsoft Windows Events y logueandolos&lt;/b&gt;  &lt;br /&gt;
Es común tener informes de problemas de los usuarios utilizando la terminología que los desarrolladores no entendemos.&lt;br /&gt;
&amp;nbsp;&lt;i&gt;Ej: hice clic en esa ventanita de acá, se me puso blanca y me salto un cartel….&lt;img alt=&quot;Molesto&quot; class=&quot;wlEmoticon wlEmoticon-annoyed&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW-5K2TKOCJRcqBcSpqsUQorXLGiXqsYNZHusNznE21TaFk2lzrd7dq2WV8QT7gETx5P-qwskrCLJ73W8U_XJKKm7jf7Vjrh5zYzQJ2N4pvFfSFXk9b7r_0SiFdkQ7qH8j34XI0lJbFwM/?imgmax=800&quot; style=&quot;border-style: none;&quot; /&gt;&lt;/i&gt;&lt;br /&gt;
La falta de comunicación hace de la comprobación de errores un proceso difícil. Una forma de controlar esto, es el registro de sucesos, estos proporcionan un mecanismo para que las aplicaciones registren las cosas que les suceden.  &lt;br /&gt;
Esta característica tiene muchos beneficios. Al utilizar el registro de sucesos, los desarrolladores pueden guardar determinados aspectos del estado de una solicitud, incluyendo errores graves. Se pueden grabar casi cualquier cosa.  &lt;br /&gt;
Visor de eventos de Windows XP:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmQgHAMK31-s-CWJz3gWBv-0AAnxyNAKi5T0BmbzJxkhcxLHwrO0aqvYYWomGyKelhbK2Y7IlpAIPGMsWDaMN3Dyvri8JkCSIze7I-Gu14u3bjwBc1zg19VUqSzKYbuwX8qgchLIYfNrM/s1600-h/image3.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;409&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx2eYf3nm8OsgppS0eqbfno7Da0c_I8RHvMLC0Lbah-lpBiRvSjPa3kcki4s_kVwLa9wLeQcFsn-x4SXgnaysiCikqeAyFWP-QoFTgIj1hOAzgh-mGkMkq02p0wIJcWrQJEM1lVMCgD9o/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;559&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Creando y borrando un Event Log&lt;/b&gt;  &lt;br /&gt;
Para crear un event log. Net Framework provee la clase EventLog. Para usarla se debe referenciar el namespace System.Diagnostics:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLmRNJ3CSX6K6UgJk3V0x0oOIQq1jxAqqTFkGo_wp35dHZA__LP1Fv5OhFIGWJGf2iIh8pIMqtpe2NMZ9_ZC76rNaPP39EhPNhwklNwhjJUmQvBPZEGlze4mBV2c1O6A_yZbwrg4DCszk/s1600-h/image7.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;98&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaehlVPMCcQBFkeBgn4kMXGAUA1dzr_l3MhpHUOOmemvyFmL6n0jjPbjyG44pYCX5F3Z-st3RAzlu1w1tz2YXvJ0RWVeB6AQoxKO8sGjU8gDnF0m-75BqC2ySKzE3nHmuM0HamcfsW6Bs/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;566&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Después de crear un EventLog y especificar el source (de donde toma los datos, en este caso Cap10), se puede ver su información en el visor de eventos de Windows después de ejecutar el codigo.  &lt;br /&gt;
Borrar un Eventlog es igual de simple:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYWjRP521Pcfz8qLjYebNjKoCV8r1QWtg8yysE3HRmxiJ19s_-sTv3OUOi_ywdmbzFjeWyQWn8UVIXsd0jLnx_5yR8xf25IzerfLqrNrUDsghhxv025uXDHtdkOFxsmtMPEM9zDBJSwXk/s1600-h/image10.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;71&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Wu7cJmz5SfYx9F6bUSLIsRZxWDCVkHJZeldRsfytKPkVSAsjy7VaWMGNm5zIh1teRj9ROMCY1MoRy3U3sQ71yKEt3OzFNsT4F0J7yOXs4_NzMp1eKuOGVr4T3AKP_4PSQYe3uHKQtDk/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Escribiendo un Event Log&lt;/b&gt;  &lt;br /&gt;
El método WriteEntry parece bastante simple, pero existen 10 sobrecargas de este método:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd1BlcN4wW61B7T-0WH0QlMmsMsXN11KtgrwigEyYqW80FPqxxV-ue2uijhV_mdnD-IWYc92ARMQSJyHOhFO7jRfLoXoqsFjbfyJnD8k9esPlB5Qnf6V_Yo7CzToY01ZnJ1KQcClg6s1M/s1600-h/image17.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;105&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsLnXhsAdyFyjU6u5HpOi9bIJ8AByd3jwkNu8E-bELaID1rpFzK2ft4al2CpVi8J96KGEIijSp7biXaN5C77u4dh_wZUi66-gZ1q_1GSD_p8zcqiajbBMeW89jodt5rAKNrYnn-Zmo13U/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;555&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Además de leer logs personalizados, el objeto EventLog permite leer y escribir en Evenlogs existentes como los de seguridad y logs de sistema.  &lt;br /&gt;
Ejemplo de cómo escribir dentro de estos: (se deben tener permisos de escritura)  &lt;br /&gt;
Aplication Log:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuq5lttFAPCGvGyNumQ9mITv7GlAqNHaZrLE-EmasRqqB3MtmlhpVo95QmSIW6f1Ir-0SA6nm9yetvbAauGMpI3JbCuf-W9u_3iT7EMAAw_6sGooDyFRbNco3BNSB5n312Xhh3YXBOjYs/s1600-h/image30.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;137&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAgh9jeBi8jYjgCLqnoTlAgJvznDxao_tQBL9DcLKTIKQOSd-eExCyBrUQvA3iGbOyRFJnsbb0imqE8jyNwANTFAHiN1P_rDyk1Iy7bI6vpvh2fUOvTGIhn-TrQbKYFktfhU5yf6DhVfQ/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;468&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
SecurityLog:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG7vjFtwQkvGmbsgyRN6E3Gf9d87BHtCofK_ICKYUC2K2vtkLkz8QnxcS8cpgrHkcJYMrMdtTTz9RlDm1YFIHKfR4HAUaQw6U2qqxKXTfm4Pm_SR-dPZ5O49yVlFFbYgozAefjtBdLL1w/s1600-h/image31.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;147&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGIpItEZgiA1CNXAj7k1_up7Z9a7GYstWo6yjHdHQi8D3aHrunTWjZkd_KW5d4u1cJPMqyTwlF_kgzSsoPadek9cFaYSIEbbSBwPnBH_VcEPwmZ3oIEMYxELKiCuTQ61hT2K7Ja2UXbNo/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;494&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
SystemLog:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu8r6dctMkZkh4DNyZzMBtWOynGuLQe-_g2IxcZpyEMsbM-oJjiChdi53I55OyQdAC_43tY9S-HsoSWJEFxpCKa-dJXijxkrb_E1YWqIWKyaoKfei4eOtUBj2NqExGGQCznTbua9njbIU/s1600-h/image32.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;120&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA4ZPgu7ovmYaNHT3HVI39vZvqjBYX_TyWuUjEv8x5WW6SFFOtFxre4A3bZwBbfYScW3E9JUigzZf_-NCRQBKnweRrvsUpQUKtrIbntWw8H78R3FLMjYwAFvKCH9LQ9Xui5UMFFBQpSAc/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;560&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Leyendo un Event Log&lt;/b&gt;  &lt;br /&gt;
Los objetos event logs tienen una propiedad Entries, que es una instancia de EventLogEntryCollection, esta nos permite iterar a través de ella y ver los EventLogEntry que contiene:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYdoD5oVVnrMx_269Brz3v5sRm3eIyDbaWrzHh04O6qVNvItVCS-R8pua1edRavYvOO6IRVOmq56jQ6DM0nZOch_TSaOyyb5D8_NR3rOKuDwGyrUdZZnMDpagGJii4Lhe5K33rwtjF8Yg/s1600-h/image34.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4U52DmvIBQ1fUPRu2ErB-1nClxVDvNpPVXc9SjxeJvJux84cgGt1sliwZrotvQ3XnsD-jqFXiKeOmnE-Hu5wxmr66S3RpLDHfxCeg4kxuH2PA_d1F4FIxquAOtjFjoWHIH_moezoobP8/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;549&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
La forma de limpiarlo es llamando al método clear del objeto Eventlog.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidKImEkjtWSDeqiQE4tg3bWT17iMQzyTccUta7-r_FDsETADDfWUkAB9ETcSp0ePCTN-drnRRckbVqbEII_gI6EaC6lyKXfYxokUoEvxv1WRDA-tMB_jUJE8eXFwcVENo3hHHe7JFEjqg/s1600-h/image39.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;117&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnn4nC1f4EReDDqQQmuKY-7bVsmTBtUvCSsZuHJbLmIpf465s5dmAA0gcfo89HOTLDj-20q7RksMZ4zM35_mDA4dWKCAq-ChMy0cOcgMdtCCepCq-_4uMTFxA8NyV43VcpSUziRQMXSRs/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;360&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 2 - Depurando y la trazando&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;Escribiendo Salidas (Output)&lt;/b&gt;  &lt;br /&gt;
Una función importante de los desarrolladores es recorrer el código y buscar errores. Aprender a utilizar eficazmente las herramientas disponibles para esta tarea es fundamental por muchas razones:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· Para comprobar que el código hace lo que se espera.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;· Si usamos las clases Debug y Debugger se puede obtener un feedback para confirmar si funciona como lo planeado.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;· Usando herramientas para localizar los errores después de que han surgido&lt;/li&gt;

&lt;/ul&gt;Las dos clases fundamentales utilizados para la depuración, Debug y Debugger, se encuentran en el namespace System.Diagnostics.  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;La clase Debugger&lt;/b&gt;  &lt;br /&gt;
Permite la comunicación con una aplicación debugeadora. Tiene múltiples miembros:  &lt;br /&gt;
Metodos:  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;Nombre&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;491&quot;&gt;Descripción&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;Break&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;491&quot;&gt;detiene la ejecución del depurador&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;IsAttached&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;491&quot;&gt;indica cuando el depurador está asociado a un proceso.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;isLogging&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;491&quot;&gt;indica si el depurador se encuentra en el registro.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;Launch&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;491&quot;&gt;lanza el depurador y lo asocia a un proceso&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;Log&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;491&quot;&gt;envía un mensaje al depurador actual&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Ejemplo del uso del método break dentro de una sentencia condicional:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuBfCD4dC6STZRwbv9AMoLz1ibKzkeZDKm5dcFReAfrprNfqCifWPYozn0qA93wJuvUREEibTLFSXu7W1Tngi7BwsOhxNadxEZSHKoZBLyLx3igfI2QZLYR65_Kc_vmBXg2shMZPGtJMM/s1600-h/image%5B4%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;98&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsYMJKJkivQACCIa1DiHc_MsBHjqV1YRh27hVRWmAVfqksNSsuaqnm7jqbLUoA5q-GQ3wAGqhAI2d0w287SMsBMtQmGaNtuUalYSYphnRtnJ5e00JdUVDHIzocKREkQtbeTqN3b3I18-M/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;568&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Otro método importante en la clase debugger es el método Log, que envía información a un depurador asociado, si no se encuentra asociado a ninguno, no realiza nada.  &lt;br /&gt;
Cuando usamos el método log, este escribe en cualquier objeto que escuche y este asociado al debugger.para usar este método se debe llamarlo e indicar el nivel, categoría y mensaje (en listener simple es el DefaultTraceListener):  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijRkTcZNfqExAmsha_Ky3Vv5YBqU9CUY3Rq5D8UDFb7zrjr2K3wDTM5AqeEyq_Q2vp59YIeTc3q5kXv7BuqqO0tfXUbWhQH12zVadTLKKgNna8ehDJkJbRFf1yuYNzd6xHoVq3ROdzB3U/s1600-h/image%5B8%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;89&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPjIkyfo1yYnjMlBb2EoCckhAO9E5ZjdI-94YKYw3OQJJYu3u3qmuwXB-J2ZauRPCEosOVoba87LznbV-gdKifvAY8uo5bC8zSgQ9QeP0ea11_HCLwtpXBjSaFf2vR3G0W5fTM4wW4SQY/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;437&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;La clase Debug&lt;/b&gt;  &lt;br /&gt;
Aunque la clase Debugger es muy útil, que, sólo ofrece dos métodos (break y log) y hay momentos en que necesita más granularidad. En esos casos, la clase de debug se ajusta mejor &lt;br /&gt;
Metodos:&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Nombre &lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Descripción&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Assert &lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Evalúa una condición y muestra un mensaje si la condición es falsa.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Close &lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Vacía el búfer de salida y luego llama al método Close en cada uno de los oyentes (listeners) conectados.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Fail&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Muestra un mensaje de error. Vacía el búfer de salida, y escribe la información en la colección Listeners.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Indent &lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Incrementa el nivelde incidencia. Este método es especialmente útil para dar formato.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Imprimir&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Escribe un mensaje seguido de un terminador de línea para rastrear a los oyentes de la colección Listeners.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Unindent &lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Opuesto del método Incident. Disminuye el nivel de incidencia en una unidad.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;Write&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Escribe la información adjunta sobre depuración u objetos de la clase Trace escucha de la colección Listeners.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;WriteIf&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Lleva a cabo la misma acción que el método Write, pero lo hace&lt;br /&gt;
sólo si la condición especificada se cumple.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;WriteLine&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Escribe información adjunta de los debuggers o de seguimiento de los Listeners.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;WriteLineIf&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;516&quot;&gt;Realiza la misma acción que el método WriteLine, pero lo hace sólo si la condición especificada se cumple&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;El método Assert&lt;/b&gt;  &lt;br /&gt;
Uno de los beneficios del uso de estas clases es que permite llevar a cabo su aplicación y examinar la salida sin tener que pasar manualmente a través del código. Una de las mejores herramientas para ayudar a depurar es el método Assert. Se debe colocar el código con los métodos Debug.Assert con una condición verdadera o falsa. si la condición no es cierta, se romperá en el depurador automáticamente. Cuando se utiliza correctamente el metodo Assert, simplemente ejecuta la aplicación y se produce una notificación inmediata frente a un problema.  &lt;br /&gt;
Ejemplo estamos usando un objeto IConfigurationSectionHandler y alguien ha eliminado la entrada en el archivo de configuración. Sin una afirmación de depuración, puede pasar 20 minutos tratando de localizar el objeto antes de darse cuenta de que alguien lo elimino.  &lt;br /&gt;
Suponga que tenemos un archivo de configuración, pero los ajustes fueron eliminado:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigXjNGzARXKyMPZPfeIlDG7S4th64JzJlX0lRYAct-3m7hFuQYxsRqqmywUrsYcs736IZsYv4rEkjZW7HyQd2zJSf0i81kprupzirH4NpEYyBGnwFg6pL0I-px6kUMaqJMCbvWhLnirOA/s1600-h/image%5B4%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;143&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid-VSIYbPcKHsjd6UaxrneEojUZoYVSDgO6FSuDs2fdnOFB_xnHLBmOKNl9hYmJGrAQkdP866p2C7PQsoryD6L7Y6Lh5GjbMAlxa183UKPOdiLGUeJZNAPxVD1z-6e4GLaHNUFoCXUezk/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;355&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Referenciando al namespace System.Diagnostics se podrá saber inmediatamente:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg42c3JKyKxSNQOKBbebvu8vMpaWv741XnzVLHKho8dK7syUPp5BoE4xmOd4Js-JQ863Thl6dhOkWU7Ft6Xh9v6eoeH439-eLrmIOyCHLE7mQSEzYQ9cyN9t86Qyrp9M2BC6X5Ht2984wE/s1600-h/image%5B8%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;72&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2rg_FDqeWWaC1BopMKsb5GhyphenhyphencW_R7TZzZ_ec7mkjKuVHu8to1SUHyZ0LNbXMRAA0EMvR2sEBYljRNMfJYTEHXz4FTjhdMjiVgtCGDGWaXRl6-uKe-cT_cRXIA48sMVH_OxI_DVjW3lw8/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;569&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Si no se encuentran los valores, se mostrara un mensaje de aviso.  &lt;br /&gt;
El método fail, es un método que causa que la clase debugger haga un break y muestre un mensaje:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRvBedVwDpJzdg3fo6M6xIyDUktjPF1vS4-g0FjwSU_Dc_Q_mSOJUBznsyw8C4qO0FQuI7pwT-ArpdL9e2YJFYPEIN5iN9Bnq-yVpaxALr2Kwsl6vh4CTGODCxX0Ucpp40uOfjOCXKaVY/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;56&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh9Nk2M3SX1igPzUxTafisy0OFMmwmP6UV7ncfRiKK180VAJwfYBKRbXlzIBokHcSw7sRzdlcFck3ssR3bqixzRKePALepcGxDThrKHnuN_IjqdHkJuApR3mAHF8fIFbuUJKcyn5i7izg/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;507&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
En cada uno de estos escenarios, el cuadro de diálogo presenta tres opciones :  &lt;br /&gt;
■ Abort: Detiene la ejecución del programa completo.  &lt;br /&gt;
■ Retry : reintenta ejecutar el bloque de código nuevo.  &lt;br /&gt;
■ Ignore: Salta la falla, y trata de reanudar la ejecución.  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;El método Write&lt;/b&gt;  &lt;br /&gt;
Se llama seguido del mensaje que se quiere mostrar:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfhpe4pbqbqYQdBWoZLi4v8mqxTgSnVIHoa3vA4U-u12ycYFvwp1ZHT4WR7u4lpg4fGXCPIHsAuCltLePPALK3-VVdQhPe1rCqm8keuadOQr2Uqy7ZUAm8ptL08Oxy5CnArSwYKc1OZXY/s1600-h/image%5B16%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;25&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVugTVpOUwcHO8_ZJr33yOLTr5oD9Wb90OTtUa7h40DNDDlEKacYv16maMe5aINQ93AVFdLvz7rwIjeQmtc-coqjCfdsSnfAL7TK-9kI_LoZQcmr3ljsgYDNBCt34ciO0ZxaHb_-vB-AY/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;322&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;El método Writeif&lt;/b&gt;  &lt;br /&gt;
Trabaja de forma idéntica al write, salvo lo realiza solo si se cumple una condición:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDZY4Se71PgqGFfpDDhDaTrHoCRMQLvjB4tRzpxsZY-zyVALeKWfZAEjM8spn06w0s7fbYihqBMqJcnqZSCq_zjVg0AVEDowWgruVnF0Kfcq4lhWcrrXe5hx-KHE539T3MvLyy3Uq9IcY/s1600-h/image%5B20%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;45&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFJ7LX4cgsGdYsBpb1ifKAn0YXUPI44kac5KztyeGjM1ubGfcyPBZpX_62udjqwO1uZaCi0mkkc2D8OjxtgX6jyzAnxMn0J3RfBDjFRrt29cch3T8jyYBjv2AZRttGrdmUjpoyVsa6vkw/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;309&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Los métodos WriteLine y WriteLineIf funcionan de manera similar a estos anteriores, salvo que además contienen un terminador de línea al final del mensaje.  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;El método Print&lt;/b&gt;  &lt;br /&gt;
Funciona de forma similar a los métodos writes, solo que escribe si se encuentra enlazado a un objeto listener.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPa1r8H3i1C9glitDEYTpy6d2YpYJuipv5Hyc5Q47Py6jM78sKfpKpIjDGjAodAIXcBUwv2mGcuBSTLN4uEBFiZ1XUEbMe_5lOPz42HYCfJ-mMqWEurtV9SVZCJ5XB-vtaxMN5_7ShpoU/s1600-h/image%5B24%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;46&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8edDp8DkZgzKV7q9XZehVGOw4NlNpKfKeDBOb1zc6cjHvJN1eEV74oXSxu0p5wNqnga05wNMN3-Q3oOou_BrlVRhPINC8kpKQrZDDZoNPfGRYsd0egapZHQk3f7GFEkhz7ILz3Hrgrjo/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;316&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;Método flush&lt;/b&gt;  &lt;br /&gt;
Es usado para introducir todos los datos en un objeto listener. No necesita parámetros, solo se llama:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiydWjW1xUaMnNpObWxrHNebrJNiGlEw6-DgZT4suTGmXsfTKOAvI5yC6x2PKNQ0k_SeDpWbaI2R8co1Nr5-lJIPE8sSvXrK1Qv56JwFo9Cw8rpbvMma4uOhXEaH6Nd-P16iSWlY4kgEUE/s1600-h/image%5B27%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;24&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8ZISPTWmPnp_Rdpm5p4iNlqPdUiq5H_N7AsO7GxvIzyiCKMMQj64QORpfjA6-Ki6Ma3LKA-vBD2JmCceR40CzmkHmBvSEvpjIG0H-qHEPlRzWMHwYhA4lFlO-Tm72Ok2BGvjLq4ZoVoc/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;102&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;Atributos de debug&lt;/b&gt;  &lt;br /&gt;
Son atributos que permiten especificar la forma en que la aplicación se debe comportar.  &lt;br /&gt;
Un atributo, describe el comportamiento de un objeto y llamadas de este de antemano para saber cómo manejar la situación. Debido a esta capacidad, los atributos están particularmente bien adaptados a escenarios de depuración.  &lt;br /&gt;
Atributos:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;DebuggerBrowsableAttribute&lt;/i&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;DebuggerDisplayAttribute&lt;/i&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;DebuggerHiddenAttribute&lt;/i&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;DebuggerNonUserCodeAttribute&lt;/i&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;DebuggerStepperBoundaryAttribute&lt;/i&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;DebuggerStepThroughAttribute&lt;/i&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;DebuggerTypeProxyAttribute&lt;/i&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;DebuggerVisualizerAttribute&lt;/i&gt;&lt;/li&gt;

&lt;/ul&gt;Ejemplo: una clase simple a la que se puede hacer referencia antes y después de agregar los atributos que acabo de mencionar, SoftwareCompany: con 3 propiedades públicas (CompanyName, CompanyCity y CompanyState) , tres variables privadas (_companyName, _companyCity y _companyState) y un constructor sobrecargado que permite pasar en cada uno de estos valores:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdRIKCGls3E5UHyK0W7uTo-TXMezCN3EZELUVj35UCafYHzhYRvfHvO4B1e4j_qB3RDYzi5ZEEujorZF-M-WdfxqhksoFP9ewoKafNYnwTRrkvbhFi3UFFF3m4RcQRlBWiloTNtP3ptm4/s1600-h/image%5B4%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;445&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-zhqjz1Pu5ifXOv9ulbpC96sliugreC7BbAV9bJa9KrIT4BwvFbQhlCHJcMlfjMHWr20Bdq0SbD2WOPybgApWKaUp-Z3EXpqYB2xgalWD7tdMrRPfc53fXWlNHxU6Gnz6Ym5T2do32Rk/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;544&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Si le pasamos datos:&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW_Y-6X0JuZnCdrIG7XztGlCydxSVZ8ferqgLHCOPfepGB7ilAhoQ_WUnWYl7fUxomU1ssUA2Z6Ik1KTjZcniSGbVyFQUD7ZAptcLmj1wjl1W6BjWIUeV7-nv7vz2MEQDOG7EDsKHkzD0/s1600-h/image%5B8%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;23&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLizY361l1LbTufsfATKWoptFNJFEFh3JqjFklBnjS65HyBlbjm3u0kqOfEwbRmaicsiKEVZ1hni2FN5iS05laZedEcOqs0hzTFMKIK0ieGSTvpijhsxR41RTsAvMy5OkekAm7KN0EcGk/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;577&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Y le hacemos un breakpoint, vamos a observar los miembros públicos y los privados.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZg3GIg2U2NpTwbssZfEZZHVwySbEhQVjY1EGvSuC3yC2x-smr5go6b4bn_KPsLKl1na5aFtraGU3Ws1VmhxRx5UeJS-Ko7Yz6jzATq0V2JLV2tkMA9u8Zq9d5B2x8sN_ZWl74f07vZ-k/s1600-h/image%5B15%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;105&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmrquT3L8srshzKHADCJAndn-weo4qMoXtNEj6Hu0lFVuzokaupIP30yE58oggvB7Cs35NRvkgTMZW4WuGg3kAKRbeX-Dvj2vGsEhD2AdMtwS2tb1WPQX5nzt-IUZkGiGkQpwHUHBqykY/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;554&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;DebuggerBrowsableAttribute&lt;/i&gt;&lt;/b&gt;  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9AiA45S9b4VGMUkfgMPQsjS95JCHc0p4_w8HdH1Qgu4ifkuDN5MUOhar1kbdJojdVIp8ehNMTf9-tZ7fsAlMgOthBczVXlaux9RcQHNxTw5eEs61eG9VT3HFJt1-xDJnpTDpMEXejIMM/s1600-h/image%5B16%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;141&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho0xU_sLD6-d37w2ufGbBPp3NBIZNy8chOj6FN9D1PGAkx4ypOcjqwgi-pqbI9tYyUSJkegpz7DUmA7FPAxXOqfcqJQUveTvsJht53O5Ug05iNRv5dlLXxtFWmFOIC5Wg0Qksm5xoTbCQ/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;395&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Si en los miembros privados agregamos el atributo DebuggerBrowsableAttribute, y establecemos la enumeración DebuggerBrowsableState en nunca ( siempre Usando el namespace Sytems.Diagnostics), y volvemos a poner un breakpoint, al ejecutar la aplicación, se ve el siguiente cuadro:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBE5a4cevpbefl6yqoyG2kmHIdnm_0GZC1lnxSnLLKOT8bFNIObf6_OZpBXiX7jtcPmR-eK5E3RBJ6Vh0PycPZt1VyOW7oVUvRqOkYd_e4LmoNFaW75w9LF_Xu1WR3BaBBkWOmeXVapN4/s1600-h/image%5B22%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;73&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBoEtr3XMjSihDYUejyN03xTkBky9NM3eohNVQnAVzAxVbzB5alJ0Yoq29nhyt6mizmzD4hv9Yt3_Pl5jp07SitdQYWEGav4kWMbNg7903qzfAla2mUWmifsaubwei9Pc1tlMDTeHigA0/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;567&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;La enumeración DebuggerBrowsableState &lt;/b&gt; &lt;br /&gt;
Valores:  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Never&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;331&quot;&gt;El elemento nunca esta visible&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Collapsed &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;331&quot;&gt;Muestra el elemento colapsado.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;RootHidden &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;331&quot;&gt;No muestra el elemento principal pero si los elementos hijos. &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;DebuggerDisplayAttribute&lt;/b&gt;  &lt;br /&gt;
Colocando sobre el nombre de la clase el atributo DebuggerDisplay podemos formatear como queremos que se muestre el elemento principal:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgybV2vn_Gxd1aszTuYpDdJj7WyyihgsfrIv55V7dOZoH2gnO7yCM77vf6W2qUComEzhyphenhypheneCwa2W0MbBvHFrvfSf81I1c3GgO3AsOuoeJ-ESJRuKuy3NqUClJj7GiLMZVx2Boux8ar-dU_k/s1600-h/image%5B29%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;56&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfnzQIfIMAIHKV_lzyVIlf4uSfJdaA-qbLGh61U4NA2hS_6AbVYcBBtPN9RkB1WP8FvZWFbpinxZuzo7qS9lb9snUGscElplQJMiBtg4L56RQyI25my_s168lxsRxBVtZpoOYwej82J90/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;547&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Se vería de esta forma:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP4ndO8Y6bKVNBUXWIM-K8c4L2Xwpnnu_pT_SgPkjVlq7_p2LPr5U5QirFtt2x3imbkfki2iRZnNYxLBd8YEUmppbkzdet2gr6J0arLadIN9AuBZaWt_L0Ay3rlIWalACsa4hbi1sg4nI/s1600-h/image%5B33%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;23&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4nSyn0-MHyCGKfG-JuJXqAR2yjZyyK02Tsi_ybBU6K2ATgaRIWGaMqCwB50PoU-3gFBl6F3ZLlLJK6rB_9NhVMV5D5rhYHiWKGfld0-y5dTXzNQuj6UFj7O2bEebiiWmB-jQpWODEees/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;562&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DebuggerHiddenAttribute y DebuggerNonUserCodeAttribute &lt;/b&gt;El propósito de estas, es que si se tiene un punto de interrupción establecido, en el momento de ejecutarlo es simplemente ignorado.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DebuggerStepperBoundaryAttribute&lt;/b&gt;  &lt;br /&gt;
Se utiliza este atributo cuando algo creado por el diseñador contiene una o más propiedades o métodos de interés. Le permite ver una parte del código sin tener que ver todo lo demás.  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;DebuggerTypeProxyAttribute&lt;/b&gt;  &lt;br /&gt;
Permite cambiar cómo un tipo determinado se muestra. Este atributo se usa normalmente cuando se tiene un tipo interno y desea tener control sobre cómo aparecen:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Y5HZ5GvlieShrMcMdH8pAjefOsMyFI6PBwFicdZ4y-oYusXotTd6at5tuAvGOcz_7WWR5p3WVWzLf3XK7iqc-6Wys9-Yyob3D6qWUdrO1d0qEnRcOXa_8Hx4CXpyaNdaKokX-DUecBM/s1600-h/image%5B40%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;405&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNPkJN6e_PO6SNKHRhE8s3o4FAcUhnRDKtbyCqDeiGk7f9t3BhxTT3jznA0RRQn65LXxGUPg8iKCK_ZET8j6kBMGgyNaeeUOZLc4LlRikOhW4pRVLnbPLizCG7-KCDgsrRcwj4Uyb7zVk/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;450&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;DebuggerVisualizerAttribute&lt;/i&gt;&lt;/b&gt;  &lt;br /&gt;
Este atributo le indica al depurador que tiene un visualizador asociado para la clase dada.  &lt;br /&gt;
&lt;b&gt;Creación de agentes listeners&lt;/b&gt; Siempre se habló de la salida del depurador pero, ninguno de estos métodos tiene ningún valor sin estar asociado a un listener. Las dos clases principales más usadas son Trace y Debug que se utilizan de forma idéntica, la diferencia está en que trace se realiza en la compilación tanto en Release como Debug, mientras que de debug es sólo en debug. &lt;br /&gt;
Los métodos más usados son: &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;b&gt;Nombre&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;482&quot;&gt;&lt;b&gt;Descripcion&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;i&gt;AutoFlush &lt;/i&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;482&quot;&gt;&lt;i&gt;Para obtener o establecer si el objeto se vacía después de cada escritura.&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;i&gt;Close &lt;/i&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;482&quot;&gt;&lt;i&gt;Vacía el búfer de salida, y cierra todos los listeners asociados&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;i&gt;Fail &lt;/i&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;482&quot;&gt;&lt;i&gt;emite un mensaje de error con la información sobre este &lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;i&gt;Flush&lt;/i&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;482&quot;&gt;&lt;i&gt;Vacía el búfer y escribe la salida a todos los objetos listeners&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;i&gt;Listeners &lt;/i&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;482&quot;&gt;&lt;i&gt;obtiene la colección de listeners &lt;/i&gt;que monitorea&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;116&quot;&gt;&lt;i&gt;TraceInformation &lt;/i&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;482&quot;&gt;&lt;i&gt;muestra mensajes de información de todo lo que sucede&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Para ver el resto de sus métodos &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.diagnostics.trace_members.aspx&quot;&gt;aqui&lt;/a&gt;. &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Objetos listeners (oyentes)&lt;/b&gt; &lt;br /&gt;
Las clases Debug y Trace dependen de los objetos listeners, ya que estos son los que toman sus datos y los dejan analizar. De forma predeterminada, Visual Studio asigna un listener que envía los datos a la ventana de salida. &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;La clase DefaultTraceListener&lt;/b&gt; &lt;br /&gt;
Los oyentes pueden añadir de forma manual o mediante el archivo de configuración. Ejemplo de cómo añadir una DefaultTraceListener: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaID9UjW1-s-G4piEpYqXtM7wr5R4xkb3k9mXh6rfotco2tLyVCiTnfAoAsmeOi5jC2l4s3UH2ouy8RUr4S2jgvYEpeWqGPc_qgquaytEQEo-jljw2PZ-CJVDtpCJiqlZCWg_I9p7_Agg/s1600-h/image%5B26%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;80&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoWxOrqsibbjPNEEdQZ2dhvzvYoQn4I-tq-YXTet7rOAvOXJfEnoxGN2UIAF2Ez8kLboOxkPFNir4K4eQRFhtM27hjp0JMDGcs09HS90eak2jTrAPGr7FiOtKjnw-whj22oF5ftglo4xk/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;511&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
O en el archivo de configuración: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiwZGO_gXuNitC1HYJIM_RoqFBgwdQ4vstH0JPyZ-E_2q60da6lqYZbhbk_L49TBLYPEhjRg6wYWJyJse7LqDT25KpHSGowc1dwlyeJyDRcgmAdGGz94fVVLvhvcSCEjD7Y-5DBLKdvro/s1600-h/image%5B27%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;99&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpyjhvkkmIHsUoQGC9AiXFt9qF-8nZps4NXjL2p84WkXyXUsD6eLL0RqqqvoCxD_0Chd8xML5J91nar596VKdCamFBt6sDjmghIAXxCqFBoykc_olw_XJEJvl5PBhcPGjE-4fE5Q6a51M/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;344&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Clase TextWriterTraceListener&lt;/b&gt; &lt;br /&gt;
Es uno de los listeners más simples de usar y sirve para escribir la salida a un archivo de texto o un stream: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidG_eg0qP6F9w-WB6mzme_MauHxIWN8bj7_Ejbn7k-SsdpBg8fLI5NwQwaxycPMiXeRrV2dBpMfpqDGVjGCZKfIeIfzLLMXa86u750EVd9I2VnRIsZjS3FZFItZmooVqjI0MWglfZE1ic/s1600-h/image%5B25%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;120&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRsQvSK0SXhRij3xOjJL_6xY938Wutvrp4xzQ3mllmocXUPCt7Xd8KjY5QqPF_z8wiRg3UglznXcCAOewg1e__aUNXRrAw6r-sXfP_HdAeY_HNcq8qwFct0o2MAaWbMf_EgrLgWCGp7IA/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;374&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
O por el archivo de configuración: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioQUp2A4lSxpSWTcS4yiO5nL-_YNGsB_9LgUzuXZwjhDca8EH9dPtn7BbeC92ui-XsLrVZ-vzXYf3gR0Oa_KhhkSbrYeB_MaCiHe3EaCGJ8TzpbxVMhXooS63deI_KcT7rDoQoQaGkLYM/s1600-h/image%5B24%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV6tfeC_FJmxPpKdi7ti1fLT3eh4nKl5-udvou3Tb2pAh1w0svVskOyQs9fLIFHgFqSxiqvwmVgl7opdFqsI5g7Hg5gvcPIYqEG_qBnookfoL3V2h3x1A-eDTuZi2TZg2aRv-T9hwRo-c/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;555&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Clase XmlWriterTraceListener&lt;i&gt; &lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Envía la información recibida, a un objeto TextWriter o un objeto Stream. Para ver un poco de información sobre sus métodos &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.diagnostics.xmlwritertracelistener_methods%28VS.90%29.aspx&quot;&gt;aquí&lt;/a&gt;. Se crea de la siguiente manera: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjecXD0eD0G2n69w6mgWvAf_Ggg-4rJAyrKz-UWB2xF9FrGYucBGS0031pdMzP5aGVe79gVGOMpoxsJVP-9ouFhJnt6JYtJ8sJXgyQiqNOrIb56T2fEsOAPoMiIWjB5o3g9yCGmprMjLfA/s1600-h/image%5B23%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;125&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUQjoyH5q7dZuPZMfMnYddPebxjyGWkYza3mX1w4rhIqPwPZYgwa6R4BZTX04dobWMuCpob44i6_4hmGaam3RljuXcWl3rpqcZZRKrbvAQl7XwwstZmxw1UfzE1d5AupSywGF5cmf3H08/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;542&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
O en el archivo de configuración:     &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1LRePbUq0Q_n_In9gIF0uwqe2Gp76JUcHj_gZlQoDcwFuSwl86ac4Kjg7MYfXuDrtvNmGuVW3QpmWCnrsDwJAnNSTLsw_REb0DIg-G9wFbnsmkn8FolcUzCvWtZFlhiLfrzxI4pPuwPg/s1600-h/image%5B22%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;182&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKeIdqVwbgxxWB6hK9mrNW86X5cCmQEf1pAUOJvmxNM4KeXvhiYfDqJQbuGRnAvQbfLdxHDcfbCWuhG0UnOnAJu_UZtMtSInFN7xwlnBb3CpwEANc_Cbbg-eqX2n4AWUsQryGfeBP3Xuo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;531&quot; /&gt;.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;b&gt;&lt;i&gt;....................................................................................................................................................     &lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://www.4shared.com/file/PhnoWyHf/cap10.html&quot;&gt;2da parte &amp;gt;&amp;gt;&lt;/a&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;.....................................................................................................................................................&lt;/i&gt;&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/6122814318643014279/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-10-instrumentacion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/6122814318643014279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/6122814318643014279'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-10-instrumentacion.html' title='Capítulo 10 – Instrumentación–Parte 1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW-5K2TKOCJRcqBcSpqsUQorXLGiXqsYNZHusNznE21TaFk2lzrd7dq2WV8QT7gETx5P-qwskrCLJ73W8U_XJKKm7jf7Vjrh5zYzQJ2N4pvFfSFXk9b7r_0SiFdkQ7qH8j34XI0lJbFwM/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-4168532422810518965</id><published>2010-11-17T07:55:00.004-03:00</published><updated>2011-03-17T12:56:07.418-03:00</updated><title type='text'>Capítulo 9 – Instalando y configurando aplicaciones–Parte 3</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ffc000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #ffc000;&quot;&gt;Lección 4 - Administración de Configuración&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
Permite especificar qué versión del motor de ejecución de la aplicación, la base de datos a la que debe conectarse. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Obteniendo y almacenando configuraciones&lt;/b&gt; &lt;br /&gt;
El principal instrumento a través del cual se recuperan los valores de configuración es el objeto ConfigurationManager. &lt;br /&gt;
Usando la propiedad appSettings del objeto ConfigurationManager, se puede acceder a cualquier sección del archivo de configuración. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuHWuRNvdCc0ykR2ftcbFsxSJRUCjX0gr0Jw6oXWiURdQn7QCeCIGVnbdDs8P8MNqq9-wR2Cso3-1nt-nCz4c37EKcZQ7QmPprSDXoXyFrRIrigYteolF3Dw56kJ8_MfJLNsiwj1IuaOo/s1600-h/image%5B4%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;163&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq0_3oEfcgDvU4QT_mth492n0wC1oPq5ZQ7HaPGvWaIfI1JOzV0Ijuu70dlvxSsBmO7ikRzkgqo5X55aoF-q1bii-6KAJ__-HOwvGDTNUpu5lJoqYTypow18_mi7crUsW7zDKtSNXGw1o/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;551&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
La última forma de obtener una sección del archivo de configuración de la aplicación es a través del método GetSection del objeto ConfigurationManager: &lt;br /&gt;
Lo único necesario es que dentro del archivo de configuración se debe declarar la porción ConfigSettings, dentro de este último crear un sectionGroup con su propiedad name con el nombre que deseamos y su tipo, luego se define el contenido de la sección: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii9qflHE7FaT_sqW5kW-HZxHcywI9Y98Xd0fLrXDyW6AKZijqXr354y2coSd_Mynlu6ruzWTGY2qb0qrA-Nmolb7nq3z3RoyxaoMZtJLUHOsNsym26QMkh4RFG_X4awhfbV7_Bz7X2L8o/s1600-h/image%5B8%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;371&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg934kaHQ3qQBS-vVOE_T8BpU4_2ZFnVuNVfudyrn8nkDXDSjXbSgcskn0NZLVxb99fxIa3b6tUt_TeurO6mViAOswyoaRsIo25_b33JVSDHsPGsVQRNTJKfwcm3Pg96MCfDNQFrzchVxU/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;558&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para recuperarlo es realiza de esta forma:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTw-tcctK45aT5C5oP5Y0kZBsJsmFCpbFcpKqX-a40h8UqCyPk5NMsDmpPiG_Ov9agD1dRUlvmfrkyIyJP3p58mitxcG7VSniWeboC69OAY8c0AyEAxLH6Fp46f6RcL6-2WKhVJXfMhAY/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;30&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUdXvSQNyIHgvnT3X0X0rC5UJifR6Y1QA4cl0WglLKZHEEtENSJ6EKC5Febu3lMGTb6yFrFoTNg4zHVKI7bSIykhkyvDDXG4MygnFp2duDV7cRJpA0gTQzBKR1TBrbhS0MGG7WIxBJ0gQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;572&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;i&gt;Aclaración: ValuesHandler es una clase que creamos para manejar Hashtables y se explica un poco mas adelante.&lt;/i&gt; &lt;br /&gt;
Devuelve un object que se debe castear a otro específico. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Para grabar los cambios de settings, solo se debe llamar al método Save o SaveAs del objeto Configuration. &lt;br /&gt;
Si no especificamos la propiedad del objeto ConfigurationSection, ForceSave , del SectionInformation como true, cualquier cambio que se hizo, sera ignorado al hacer Save o SaveAs. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Implementando Interfaces de Configuración &lt;/b&gt; &lt;br /&gt;
La clase System.Configuration tiene múltiples interfaces para realizar funciones específicas: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;IConfigurationSectionHandler es usada con propósitos de librería. &lt;/li&gt;
&lt;li&gt;ISettingsProviderService , es usado exclusivamente para soportar el building e tiempo de diseño o para mejorar los debuggers.&lt;/li&gt;
&lt;li&gt;IApplicationSettingsProvider provee un propósito funcional más general.&lt;/li&gt;
&lt;/ul&gt;Cuando se necesita un mayor grado de granularidad con nuestras clases, se puede utilizar la interfaz System.Configuration.IConfigurationSectionHandler, esta es depreciada en el framework 2.0 , es mejor utilizar ConfigurationSection. &lt;br /&gt;
Para implementar la interfaz IConfigurationSectionHandler se debe de crear un SectionGroup con la seccion ConfigSection del archivo de configuracion. Los objetos ConfigurationSection son guardados en la propiedad ConfigurationSectionCollection del objeto Configuration: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGx1rZGy1wi3V6IwBfwxcCB2Ecen5a1p7gx1-0LTTNRaUZc7KBPit7DAQnKMRzURGRWnBGHejlqNNA346Vvjs41pKp_GrpzhmNn1kOe-TVvuSBjQRTExWVh4jstvWTDGhg1vwOmLeB1Jc/s1600-h/image%5B16%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;93&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjATlftchDoakrfFwCOqbyTUbeHJ8I1DxliZqKtiw-tLdwFoJ83DHP_I79XmurMpB69Q_ERAhxhLQYco3wWi7_wfHnoSl9oMhc9OUwiEBrJSaj6PPes-8VVQxAPNyNBJfDSPUzpDek13cs/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;567&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Una forma de manejar esto es: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbRgHgBXUcbfVCebSpMfSnPYBXbavzefEdIYkwu-KuRK8XdiaE2aZiJgPN8DyrYCHoY17PPxZK27bogNIanHDZt759Mt8liVal0XQFrM8kxCjIqQwMAjSIGwYDFFRN2QPzyiChYmHeSsM/s1600-h/image%5B21%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;179&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSr7RaZ6DZ4IMlnJW2IVD4o9ufc4IBuvLtBnmIoCY_8EAPz7pvKSIjnAGt98bMV72QDfGQMk3fIgsWxy_8vaD-nSv9R5MDAvxYmHjFGTejjyVkdm2qT6WW7kHIJGNV2ZMVljw4cX7Ltmg/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;548&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Después de haber creado la sección, se la debe definir:&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz0XNn4fNSYWFHya5LpynDGFHfj2gfB0PJrBt6WiEJSFM14DjUREuFRRvKLaXK5vHUMoEyRXbqOhPol2omo8IXYhyOoWMMA18ci0SBr2egw6mhDdaFo22IV_QZt6djGGnqgdRNIZzXDX8/s1600-h/image%5B25%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;330&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXToZREEIztRRSpkIFUVCdLaIhQN0Z4hQYbcLNUR1mwd0gd0uxof3-7PKqh8R-yvPUDiucsvxHKtpPvrf9Vuh2yw9d4MOdxeJiSHCOvcCzVweRk6RPTN7quSj37ggm_V7tTFYuKOjkSwo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;551&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para usar este tipo de flexibilidad es necesario implementar la interfaz IConfigurationSectionHandler (su método Create): &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEEynxbX8LqXO3xz769_JnOvS34ShZw5bsCliww7Sw2V6IzkkolZm2MJDAth_RNcc39ICn17pgTXmO9hj_zvjDvsznWVdmyLMxW7Zjth04yJP6befyxRmmSnGPezloqStZqKn-Z52od1s/s1600-h/image%5B29%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;337&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPkA-xKvKAMBYzoRGHcGGT2SnzKr3uN98MSKjC7FWOIwIHlYGgs8Vr2hVjacK4d5S9caPehf-0l0yz5kEtpDe7JmPl3iOoXApBuQMv8umgrYg3Qxji1OTIxUmYn9cVChESw-RUYG3_drU/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;551&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Y aparte una clase que nos ayude, que almacene HashTables y brinde un mecanismo para recuperar valores de la tabla: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXhe_kcgIu_ODJ4JY3ZVvs6J9s2Qg82OxncTAnYsR0SEFJnKBMV_RFm8euVkZkYqjkYGpq4Ynvk7YxSiP7sKwInz7R62VU6kOMpC8tPiPvX9PBsF7sJbdrA1AL5wjuNfvQpbQaG3U8n3Y/s1600-h/image%5B33%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;218&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHQcqtk4I-BqFaNvm70SfnfN5Nc9nI1WxIArhW4L8sbwwiaCCXdph-SeRX1TQrBS01MKTGwILWNRxbJHYuC1dAtVOIgTPvHVGWEvPVZtmsCX5ex35tqX9muWCWNDi7EKe_rkrtXtah3Lw/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;384&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Hay dos métodos principales para leer valores. ConfigSettings.GetConfig (obsoleta) y ConfigurationManager.GetSection. &lt;br /&gt;
Ejemplo de uso de ConfigurationManager.GetSection: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhE-JwhYNUwPPM3fWSwEWKAvlhkHmAkianbRW4r8I6DqajI4exob8mcyCHLXj0EzRmOb6S2B-X7zfHTq_Fk4frub95sKiSgC8cAcNaHDhSxIZOEF_wY6wNoZ8pBmsHjU75LbDAxrSIPSw/s1600-h/image%5B37%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;62&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJQG5-DJXnz7dnPBqelNMq1PiDtYaPIRwYIw8RrycYHQLWrV7xs1uQTDUIhIB_T5I49CnMYU28ian8AIs3z6g0mbIxtPKnwHTe_6nBD6w7oE4Ubr8k9_WVF64rdHCYv1gv8Ly5cHXAVo0/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;519&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Una forma simple de realizar un ConfigurationSection&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1JV_iNwC937Ijtrgd5OuTP_woqRjOr7ri7g5pDPuNzoTeKsvYKdCX8XvXfNyyFHM7Iktv1Y5a4YImn1O6Ci5JUr2Jgq2jXlivJtowm_ajBhT5WzaKfG9-Qx-sYaKMTMmiBQuvYvJ3_wk/s1600-h/image%5B41%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEGoKuHC-um2Olkeeviuv8YQbc9vuVqTKFon1Wuo8t8D_56Ug-YQaB6VgpMszWF4Uj71EUbtpy-SVR65f37uPKJNVtMQ4fonuilcOtkdgCqBFOzI-5b9KlO3Grd2PG1a64UtgD74fk15g/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;351&quot; /&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Ejemplo para obtener valores con una clase de ejemplo denominada ConfigHandler que hereda de ConfigurationSection.: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaLhzOtKTR8eD_Fdl3n58j9cMzwdXrcg0zsX2p1JRd7qA2-x88r4zhVOHSY4OnDo1Ua2knZCv_wlTX5crNvN8ghjSwMUpBzfePLWivecH1pK1sfIPoUAXoDW4zatg_4ZEg2mWL4N7M8JM/s1600-h/image%5B46%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1gh3_oGbdKjUOwqu7PHXxh63Ad-ye9Onn0C7FtrTZ55pF75wFbU_PiEdVriasGgBG0zPnZX3g6nmtisru_6ZMvze0d0EfbVAEA7GqCCXUjSOmwc3KYTkcb7bukH4YU-xxBOdAtdZieXo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;513&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Y usando esa clase: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV0P4nd27cV4FCrpV188CG0KKZ2WyChdvSm9cqFnm2LcwoPEPNNMx4X5kSXApYu5UX2TmP-v358hGPdjdkqpJmZY5e_Zu90tSF7eENRTP-LnEYE8JCHGD7f_VG2ZoCJzoGtP1jI0PhDvE/s1600-h/image%5B50%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;125&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitW4N3UICkoRk1V8H-dcyTfMp4XtFNFFEH7bClUR_R4cUyS5npjqJm2f-alZE6XYwjt4rcTLhurLrhuWrhtj5IFdcxN_ka3NKOvILftUYxjXNW5TujICLMPNBSgA5zwtuzXdpRko7f43E/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;521&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Otra interfaz muy útil es IApplicationSettingsProvider. &lt;br /&gt;
métodos: &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;GetPreviousVersion&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Devuelve el valor de la versión previa de la aplicación&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;Reset&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Resetea los settings de la aplicación con sus valores por default&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;Upgrade&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Indica al proveedor que la aplicación tuvo un upgrade.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Esta interfaz provee los beneficios siguientes beneficios: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Ejecución de diferentes versiones de una aplicación&lt;/li&gt;
&lt;li&gt;Mantener los valores de configuración de una aplicación cuando esta tiene un upgrade.&lt;/li&gt;
&lt;li&gt;Reseteo a sus valores por defecto.&lt;/li&gt;
&lt;/ul&gt;Factores que la benefician a diferencia de una clase que implementa IConfigurationSectionHandler: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Cada propiedad puede ser alcanzada por nivel de aplicación o usuario.(nivel de granularidad)&lt;/li&gt;
&lt;li&gt;Valores que son alcanzados a nivel de usuarios son guardados de forma diferente a los alcanzados a nivel de aplicación.&lt;/li&gt;
&lt;li&gt;Si el atributo Application es usado, se crea un archivo de configuración adicional. Sigue el estándar de convención de nombre de configuración, solo que usa el nombre de usuario de la computadora y agrega “.config “al final. Ej mi maquina: Vicrodg , nombre del archivo de configuracion Vicrodg.config&lt;/li&gt;
&lt;li&gt;Esto es guardado en Windows Special Folder y puede ser accedido por la clase Application con Application.LocalUserAppDataPath&lt;/li&gt;
&lt;li&gt;Su acceso es facilitado a través de LocalFileSettingsProvider.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #4bacc6;&quot;&gt;Aclaración: a pedido de algunos voy a colocar el código de cada unidad, junto con el Pdf del resumen de cada capitulo. El código no es obligatorio bajarlo, se encuentra en la Iso publicada al comienzo del blog, pero para facilitar las cosas un poco mas, lo voy a&amp;nbsp; modificar en todas las publicaciones &lt;img alt=&quot;Sonrisa&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHKKKEFAf6EumXoCXI1O8iJ5asimIMiL2e9506MAro9ZUTrL1gpABQ4VcY_1dkOEsHxvd8d0Ov6QCzfF2jneaDW-iHWsYmw3YlzSCAUiycpULMjCjW26ZIKP8634wenoSKaXnM6Ic__04/?imgmax=800&quot; style=&quot;border-style: none;&quot; /&gt;. Saludos!&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.blogger.com/%20%20%20%09http://www.ziddu.com/download/14224467/Resumen70536-cap-09.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF&lt;/a&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;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;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;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; &lt;a href=&quot;http://www.4shared.com/file/zjJ3Q6uK/Cap_09.html&quot;&gt;Codigo Ejemplo&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #4bacc6;&quot;&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/4168532422810518965/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-9-instalando-y-configurando_17.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4168532422810518965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4168532422810518965'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-9-instalando-y-configurando_17.html' title='Capítulo 9 – Instalando y configurando aplicaciones–Parte 3'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq0_3oEfcgDvU4QT_mth492n0wC1oPq5ZQ7HaPGvWaIfI1JOzV0Ijuu70dlvxSsBmO7ikRzkgqo5X55aoF-q1bii-6KAJ__-HOwvGDTNUpu5lJoqYTypow18_mi7crUsW7zDKtSNXGw1o/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-7471353877530106733</id><published>2010-11-16T11:48:00.002-03:00</published><updated>2010-11-17T08:29:23.037-03:00</updated><title type='text'>Capítulo 9 – Instalando y configurando aplicaciones–Parte 2</title><content type='html'>&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 2 - Creando un instalador&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
Se puede configurar dominios de aplicación para crear ambientes personalizados para assemblies.&lt;br /&gt;
El uso más importante de la modificación de la configuración (settings) por defecto dominio de aplicación es restringir los permisos para reducir los riesgos asociados a las vulnerabilidades de la seguridad. Un dominio de aplicación no sólo proporciona una unidad de aislamiento, sino que limita el daño que los atacantes pueden hacer si ellos hacen un exploit al assembly &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usando el instalador base&lt;/b&gt;&lt;br /&gt;
La principal herramienta del framework .NET para instalar aplicaciones, es la clase Installer. Las principales razones para utilizar installers son: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Brindan una buena apariencia a la aplicación.&lt;/li&gt;
&lt;li&gt;Simplifica lo que tiene que hacer el usuario para usar el producto. &lt;/li&gt;
&lt;li&gt;Permiten especificar configuraciones que la aplicación necesita para ejecutarse, permiten generar llaves de registro, iconos en el escritorio, etc.&lt;/li&gt;
&lt;li&gt;Permite remover la aplicación sin dejar rastros en la PC.&lt;/li&gt;
&lt;/ul&gt;La clase Installer es la clase base para crear instaladores personalizados. Hay 2 instaladores pre-definidos en el framework, AssemblyInstaller y ComponentInstaller.  &lt;br /&gt;
La clase Installer tiene una propiedad llamada Installers (que en realidad es una instancia de InstallerCollection). Esta propiedad es útil porque permite agregar varios instaladores&lt;br /&gt;
a un assembly para que diferentes tareas aisladas se puedan ejecutar. &lt;br /&gt;
Para utilizar una clase derivada de Installer, se debe: &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Heredar de la clase Installer&lt;/li&gt;
&lt;li&gt;Sobreescribir los métodos Install, Commit, Rollback y Uninstall&lt;/li&gt;
&lt;li&gt;Añadir RunInstallerAttribute a la clase y setearlo a true.&lt;/li&gt;
&lt;li&gt;Colocar la clase derivada en el assembly con la aplicación para instalar.&lt;/li&gt;
&lt;li&gt;Invocar los instaladores. Por ejemplo InstallUtil.exe para invocar los instaladores.&lt;/li&gt;
&lt;/ol&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Comiteando una instalación (Committing an Installation)&lt;/b&gt; &lt;br /&gt;
Cuando se invoca la clase Installer, cada elemento de la colección se itera y los correspondientes métodos son llamados: &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Se llama al método Install.&lt;/li&gt;
&lt;li&gt;Si la instalación es correcta, se llama al método Commit.&lt;/li&gt;
&lt;li&gt;Si hubo errores, se llama al método Rollback.&lt;/li&gt;
&lt;li&gt;Si se quiere quitar la aplicación, se llama al método Uninstall.&lt;/li&gt;
&lt;/ol&gt;Para crear una intalacion mediante programación, con el AssemblyInstaller o ComponentInstaller, son necesarios dos pasos: &lt;br /&gt;
1. Crear una instancia de cualquiera de los objetos. &lt;br /&gt;
2. Llame al método o métodos que corresponden a las acciones que desea que el instalador realice: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioDpS39PuTMCOJGt7xn6I217dQihyukRYl_Hn-qTby5bW1h90CWmpJihy-wdWv_HBLthl5VWsHj_c0BgdyhwWA88_1yUXPX0kTctYPb6fWejGnXnjImuoltHf8IWiq1h3SRfIvEwWoC5s/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;306&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt-zCYO0hiNwukgiOz8Rv7FIHoqBvlE6pn57_JllpUOsEq-FpMIoMIHoiLJZ077NEVTB1sRCrFfxCYh_e-eErM74MNekq3v5Q7rx0lba9uAhPE39Pv9W1SAPhzkxa8m-Z2wArS5vQEffs/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;553&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Realizando rollingBack a una aplicación (desinstalando)&lt;/b&gt; &lt;br /&gt;
Se realiza de la misma forma que lo anterior, pero en lugar del método install, se usa uninstall. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 3 – usando las herramientas de configuración de .Net Framework 2.0 &lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
Configuration Tool es una herramienta visual que permite administrar cualquier aspecto referente a la configuración de un assembly. Esencialmente ayuda a 3 tareas: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Configurar y administrar assemblies localizados en el GAC&lt;/li&gt;
&lt;li&gt;Ajustar el código para acceder a políticas de seguridad&lt;/li&gt;
&lt;li&gt;Ajustar servicios remotos&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Configuraciones de navegación&lt;/b&gt; &lt;br /&gt;
Lo primero que se necesita para usar una herramienta es abrirla, ya sea mediante el administrador de herramientas o mediante líneas de comandos: &lt;br /&gt;
Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc &lt;br /&gt;
Tenemos las siguientes opciones: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt; Administrar el Cache del Assembly&lt;/li&gt;
&lt;li&gt;Configurar el manejador de assemblies &lt;/li&gt;
&lt;li&gt;Configurar la política de seguridad de acceso a código&lt;/li&gt;
&lt;li&gt;Ajustar los servicios remotos&lt;/li&gt;
&lt;li&gt;Manejar aplicaciones individuales&lt;/li&gt;
&lt;/ul&gt;Vamos a ver cada una de estas opciones y discutir lo que hacen. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Administrar la Caché &lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;de Assemblies&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;.&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Las siguientes acciones pueden ser tomadas mediante el uso de esta opción: &lt;br /&gt;
· Ver la lista de assemblies configurados (seleccionando la vista de lista de ensamblados en la caché del assembly, y lo mostrara con todo lo disponible en la GAC) &lt;br /&gt;
· Agregar un assembly a la cache de assemblies (seleccionar agregar un&lt;br /&gt;
assembly a la cache de assemblies y navegar hacia el assembly dado).  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Configurar el manejador de assemblies &lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Las siguientes acciones pueden ser adoptadas mediante el uso de esta opción:&lt;br /&gt;
■ Ver List de las Asambleas configurado &lt;br /&gt;
■ Configurar un ensamblado  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Cambiar una configuración &lt;/b&gt;&lt;br /&gt;
El proceso para cambiar una configuración, se realiza con los siguientes pasos: &lt;br /&gt;
1. En la opción del árbol de configuración de assemblies, seleccionar Configurar un assembly.&lt;br /&gt;
2. Un asistente aparecerá pidiendo que seleccionemos la ubicación del assembly.&lt;br /&gt;
3. Seleccionar el assembly que deseamos configurar.&lt;br /&gt;
4. Un cuadro de diálogo permite especificar las propiedades del assembly. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia0kVLoWVLdxLZc_fvenF63tLJCWsPBzKjBK27Y_WjitqmtbZmevSwB0J_BO1agUP_YcDS5YxyA7y5I0gWJKVdQ6T2WpE4HyU2tZQSNaE2TqH0pz2VbIC0UVcX1O6z2WC1ESC1jMCLCug/s1600-h/image%5B27%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;359&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-WC3xAYLoV7BWr0ewnfM7FBYuLO8oXKcwBkoGCtYTk9myDnwfmxrCuNhERCDIbZzLSiEwzVbriO_NpXNvfvREI8jcLao-muzvMIbimv_QX0ySttztpCRafGTnd2CbkuIOZ4bxbqxnKO8/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;341&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Otra área necesaria es la de opciones de seguridad: &lt;br /&gt;
· Abrir .net 2.0 configuration tool, seleccionar mi computadora, y elegir el nodo de directiva de seguridad. &lt;br /&gt;
· Cada nodo tiene códigos de seguridad, permisos, secciones y políticas de seguridad de acceso al código. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5n-PsBOXcg8QjsHOsox17bbC8lQYP47qE0UfJyGcgUMJWeOWw90sdxRZz4vyPw52pIz7z_RicVVCJPQM5I2tFKl_j6p7SKN_9AXrzbYCqoeYXH8lkBx86nTrwosO5ji1OpF93tqmnlUQ/s1600-h/image%5B25%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;341&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1v9t_hDjexc8u6g0HObIdm3LddMWT_zZP4kvEFg9qbXHspAWkh_83Sl59QmBoSXWlN3upZQ1hMC4zX62SdTL3VzsFhJkImP1aHTfR5KVfaybAnFPHG3wHkj09ngEfwPeE5VeQyHMgwrY/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;357&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para cada zona, se pueden ver los conjuntos de permisos (default Level) y si se quiere cambiarlos. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDjVqoEBzlJmn4BGLI6_9URkgSS6ad0F2Bcg2WDcFlFEuXBHVzW1rbPYtkK9OdtIiBvRMaPshvQdyXQf3B7Wwkx1r2CFgXIt0cDod8F5QH54gEYLXdDterP9YH9o905msX70XQi0ZKom0/s1600-h/image%5B24%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;356&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-gPjahUBqbQk1aC74jxmf6R38ExF3FWrqMupRljJWcZIY-dbzBFasoXFv1jQ6Eamtrq_GMt23fzTS2BIZr68gwMzUXNLpE9ARVpAGvt0eHcvI98ace241TVe_kGkvQ4GPJyIALhRmAhg/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;335&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Pasos para crear un conjunto de permisos:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Abrir la herramienta de configuración y ampliar el icono de Mi PC, Runtime Security&lt;/li&gt;
&lt;li&gt;Policy, and Machine nodes.&lt;/li&gt;
&lt;li&gt;En Machine nodes, hacer clic en Conjuntos de permisos (Permission Set) y seleccionar Nuevo &lt;/li&gt;
&lt;li&gt;Seleccionar el registro de la lista de permisos disponibles. &lt;/li&gt;
&lt;/ul&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhifSP2OajYt97RQGBUV7rjYskKdOl9GzVfyoJPjkk0VOWhyphenhyphenAca57Oth48eYTQfYDFHZs1iYWow60DXjuaJbnd5AyVbK6WAUYZyo68VHCPLe8r1G-S_zLCqXB5BwaJL63vv5Po1doytI9I/s1600-h/image%5B23%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;364&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQhfh5yRTB_JGOBwegj4NE1njsdtRX12-USF0rZZSINbjztBhzpxa3cNmki1JtnBWwqgEK7pyuTYbQAMDTKpgmbeZ8RLdrV7N4_NK9spvKGs7jO-9XbebkhJUB3_pcJvwsJmflUKvmnJE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;380&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Hacemos clic en add (y aparece la sig ventana)&lt;/li&gt;
&lt;/ul&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXXV_9T0IRgITVgnkN6mwyrc4jlR117Z1_Iom6wj1IDaoi1uOg1s196cuC9Itg5a7D0CzPoEqlcqjvM5A24EUefBPM_m6ort4jIV0Ay7NLSHxK3SoOi2I5MKhkSClDY1xo3AqxoR9Xcok/s1600-h/image%5B22%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuSNHFaKJ5590EZ7gOtTxgZeyWyhdulVzvcnJYodO9NEySnkEqMPY57gRgB9VwJ_FD0Tjq44JrU5hyphenhyphen7_y9lJuLm3yMFONwv5p9Fq6TNxmT4uz8aJLMjcEkjJAEzcuJFIwOQ98_svrP9BM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;332&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
se deben insertar datos en la sección Key, tildar los permisos Read, Write y Create. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Para la creación de nuevos Code Group, se debe de entrar al nodo Code Groups. &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Reseteando una configuración&lt;/b&gt; &lt;br /&gt;
En tiempo de ejecución seleccionar el nodo de política de seguridad y seleccionar la opción Reiniciar todos los niveles de la política. Aparecerá un cuadro de confirmación que le preguntará si realmente se quiere hacer esto.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://vicrodg.blogspot.com/2010/11/capitulo-9-instalando-y-configurando_17.html&quot;&gt;3ra Parte&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&amp;nbsp;&amp;nbsp;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/7471353877530106733/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-9-instalando-y-configurando_16.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/7471353877530106733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/7471353877530106733'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-9-instalando-y-configurando_16.html' title='Capítulo 9 – Instalando y configurando aplicaciones–Parte 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt-zCYO0hiNwukgiOz8Rv7FIHoqBvlE6pn57_JllpUOsEq-FpMIoMIHoiLJZ077NEVTB1sRCrFfxCYh_e-eErM74MNekq3v5Q7rx0lba9uAhPE39Pv9W1SAPhzkxa8m-Z2wArS5vQEffs/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-9166429118590198931</id><published>2010-11-11T12:49:00.002-03:00</published><updated>2010-11-17T08:28:01.516-03:00</updated><title type='text'>Capítulo 9 – Instalando y configurando aplicaciones–Parte 1</title><content type='html'>&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 1 - Opciones de configuración&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
Con respecto al desarrollo de aplicaciones, siempre hay una mejor manera de hacer las cosas. Un área que se debe evitar es &lt;i&gt;hard-coding&lt;/i&gt; (se incrustan datos directamente en el código fuente, en lugar de obtener esos datos de una fuente externa) de variables. El Framework de .Net brinda varias herramientas para evitar este problema.  &lt;br /&gt;
Antes de .Net Framework, los desarrolladores tenían 2 formas de manejar la configuración.  &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Setear las propiedades del appSettings (forma muy rígida).&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Definir una configuración personalizada y construir las clases correspondientes para administrarlo. Pero se debe de escribir gran cantidad de código para realizar esto.&lt;/li&gt;

&lt;/ol&gt;.Net Framework brinda una herramienta para configurar una aplicación en pocos minutos sin necesidad de escribir mucho código.  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Configuración en .Net Framework 2.0&lt;/b&gt;  &lt;br /&gt;
El namespace System.Configuration es la librería que sirve como repositorio de todas las clases que se usan para administrar la configuración.  &lt;br /&gt;
Este namespace contiene las clases Configuration y ConfigurationManager.  &lt;br /&gt;
Métodos y propiedades más comunes de la clase ConfigurationManager:  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;Nombre&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;&lt;b&gt;Descripción&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.configuration.configuration.appsettings.aspx&quot;&gt;AppSettings&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;Devuelve el AppSettingsSection que aplica al objeto Configuration.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.configuration.configuration.connectionstrings.aspx&quot;&gt;ConnectionStrings&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;Devuelve el objeto ConnectionStrings que aplica al objeto Configuration.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.configuration.configuration.filepath.aspx&quot;&gt;FilePath&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;Devuelve el path físico del archivo de configuración.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.configuration.configurationmanager.getsection%28VS.80%29.aspx&quot;&gt;GetSection&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;Devuelve el especificado ConfigurationSection.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.configuration.configuration.getsectiongroup%28VS.80%29.aspx&quot;&gt;GetSectionGroup&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;Devuelve el especificado ConfigurationSectionGroup.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.configuration.configuration.hasfile.aspx&quot;&gt;HasFile&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;Indica si el archivo de configuración existe.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.configuration.configuration.namespacedeclared.aspx&quot;&gt;NamespaceDeclared&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;Obtiene o establece un valor que indica si el archivo de configuración tiene un espacio de nombres XML.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.configuration.configuration.save%28v=VS.80%29.aspx&quot;&gt;Save&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;Este método escribe los settings de configuración contenidos en el objeto Configuration al xml.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.configuration.configuration.saveas%28v=VS.80%29.aspx&quot;&gt;SaveAs&lt;/a&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt;Lo mismo que en save, solo que se especifica a qué XML.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Pasos para recuperar los valores de configuración:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Crear un objeto configuration.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Usar los métodos del ConfigurationManager con el prefijo “Open”, para abrir el archivo de configuración de la aplicación a la máquina.&lt;/li&gt;

&lt;/ul&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcgB4WupBQn5aNHgMOXGbbOOI5_rKFeZB4sZnRbRh1lNSNKxiOI63lLpWq2qagQbIyUfZr9Vc3kH1M1u7LCKBJ9WIlGZRogGW2jmMH7cDSzhyatkHSs3iD6WjBapHjL-IAIbYgkp8kBY4/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;87&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgraIlDZW7QUL1cnCiTRho3UI-N0D1_dBhyv-b7VtMB26ef7dinoUePCQIgaNDq2H7hFUrRbANX-8bBjaAHLZbL9Xd7lb6KDwTQ_pz93xytkCLPxoyU-FJ9BanhDDIayK3-1LbVSO3DVno/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;573&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
El enumerador ConfigurationUserLevel tiene los siguientes valores:&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;196&quot;&gt;&lt;b&gt;None&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;402&quot;&gt;Obtiene el objeto System.Configuration.Configuration que aplica a todos los usuarios.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;196&quot;&gt;&lt;b&gt;PerUserRoaming&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;402&quot;&gt;devuelve el roaming System.Configuration.Configuration que aplica al usuario actual&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;196&quot;&gt;&lt;b&gt;PerUserRoamingAndLocal&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;402&quot;&gt;Devuelve el local System.Configuration.Configuration que aplica al usuario actual.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Se puede usar un ExeConfigurationFileMap para especificarle al runtime lo que se quiere hacer y dónde encuentra cada archivo de configuración.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOhjdXRpfPmHiP4J5loVqZmyhwCX8XPL3xuOzFiB8gMqx9tc5CeOpc8n7kNCQF6x8NY-sA8gV_jV1IBlqZJZRHOpto_eB5d5ZWvCm4SksuQf7Vz5b92lziKnhaZi2MFUNhif3_x3Rfoo4/s1600-h/image%5B7%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;113&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvfH4zyDSi56pVCOpRAXx1Hht3WfHceLPQ1zPRtKdvd22ueDbiCMKMG0alMQJXAfNdIseeykP_f3aK5DlWaHPAoAKAfpV9z80w_2y9MLHGN8YmGhjnFhrx3u9GllBsfQgsHx_N4ftyFRk/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;574&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Cuando llamamos a OpenMappedExeConfiguration o OpenMappedMAchineConfiguration, estamos informando al runtime la intención de utilizar un mapped file. Debemos asegurarnos de que el archivo de configuración exista y de que se tengan los suficientes permisos para acceder a este.  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Configuraciones comunes (Common Settings)&lt;/b&gt;  &lt;br /&gt;
El termino Common hace referencia a algunas áreas que determinan cómo las aplicaciones se van a ejecutar.  &lt;br /&gt;
Ejemplo para correr la aplicación en una versión del Framework especificada (lo podemos encontrar en el app.config o web.config dependiendo del tipo de aplicación):  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl7u7gjYmIyIMZgeC8kOSfWtEcSd1k93BcosuwAivx9LZLy__fjovPwJIpHiYxRg4Zw7adfIQWlrgWdcsFPa5zZG-0Mi0cEf9Ta659_o36OFifulU8hQ11Pn5jTRE7KwhQpLNMw6qB59s/s1600-h/image%5B11%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;116&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOPYKihsWNQaU5HijIVq-YVsXgaM1JzRFUXWeexcjAe_APrLWMXNzrzyDxcQzFRiKCLfUlmd99W9d_kyVoMV2DDYUnopMU1C6cv2GongAThlhwURhI988kgE7fEuK5TDzRk9Kd04Q4tnE/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;394&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Hay ciertas restricciones respecto a las versiones:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;- Si la versión del Framework en que fue construida la aplicación, se encuentra en la máquina, se utiliza esta versión.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;- Si la versión del Framework no se encuentra en la máquina y nada fue especificado en el supportedRuntime. La aplicación va a correr en la última versión disponible en la máquina. Debería utilizar el Framework 2.0 incluso si la aplicación fue hecha en versiones inferiores.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;- Si no se encuentra la versión del Framework, se usa lo que se indica en el supportedRuntime&lt;/li&gt;

&lt;/ul&gt;&amp;nbsp; &lt;br /&gt;
Otro escenario común es el de usar un assembly compartido y verificar que este funciona con múltiples aplicaciones. Para acomodar esto se debe:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;- Añadir una variable de entorno DEVPATH que apunte a donde se encuentra el assembly&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;- Setear el developmentMode en true de esta forma:&lt;/li&gt;

&lt;/ul&gt;&amp;nbsp; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcnYlWDCuO13IDpyoj6xMJHnAOB-NrUJIIRrgu2MXCN1_PZKpfUrz5isYmVdl__s-n3OhGZ6YbJxmv3w_jW2t2p9gBM34YbHz4SZ17HIsev_KJMJGZL2n8-4f9m8VS-07pWz4nv7n57Ho/s1600-h/image%5B15%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;92&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZYgOSwTGr6N5RC0tw2IYF_FinbaCqie9judIGXzckc26hTlpnd7QJKd0-E3FN68P4tPhY-3I0jqoJ1NCQWtwQUPhBKMabYBy2JeZDbksO5vvCQl6tOuIKbbXM_5O_t7nb3osrVdiDYGI/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;446&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Una tarea común es especificar donde se encuentra una versión de un assembly. Para esto podemos usar el .Net Framework 2.0 Configuration Tool (lo vemos en la lección 3). O configurarlo manualmente de esta forma:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoeKtdy8BrrmY_j3j7sMN-fPKUGL0J2srTcsYrNiJB4_CHwgm3NADebSVy6SnMONb0ZfftcnZt_zusLZcnudw1e-HDUMsa1t0exRMdMFrYnNvK3-lrKa7D_kYEF7ndgLzDLGFVVLjajEE/s1600-h/image%5B19%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;221&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWfLm-k4bNLY2PlH7FPZLotH9PPxAP3RFf9iShJVAeEO7hoUS7kHXkkgQ7nRuWszIqs802gkyTxGIoODZ60aSvbbabGhzwPK3KhR4fnP4nRjchrzQi9AVtnP9oWjtcoaYiV70clGD-buI/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;457&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Otros valores comunes de configurar son las secciones de AppSettings y ConnectionStrings.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHWOlUH5N4c_MjaYDitOHB3Vs5bYJiQFr3upfBXYINc3M2-Z4_RvmSNg7o6C17Pj2hlnUBLllJS3DSaWbKzaHz_qNy6VWpY3JvnwYEnGcEoMyTa9cpwqZcDUQvBUR99XhkcPXFr54SpI8/s1600-h/image%5B23%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;199&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpborSUp-8kiMaPweIrKV6HjiGNl0yA4ZAhiqORlNKW06IXcKkTlXtFawXvLNAPpPqDTLlCv1oMQDkpsXeSWhqP3Qgz8tQO4h9KLbtHMsyDUpv5IdUpzJiJcDWLlrRpeNXt6xoOX1EUhw/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;486&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Para poder utilizar la variable de AppSettings se puede realizar de la siguiente manera:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv1omlPv-uRtYNVjjUUphAyI_2aQYUHAv0W-9ISCvhhJsXZcSa0wf6Ls9D32djEAfPg-RCgnmCA32JQE0mx0ht1os9aQ8ILyj7jc8H9bOUJy0DScVpdXVSNyl1Wzg6B5vZUJB2UkLnXHY/s1600-h/image%5B27%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;27&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeG1hMG1BgfHPaYbwmGERo6YT33enb4Oj6R34zxZjhD6ZdQN6ls0t67nuYuMc46hB0aYzmkxS6oufMmFE5eHKhsJW3E0bqNjLWAqG_wm-R8JMAkf5cecOd27wQuDhzoJ4RTVIz4PHnbAc/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;566&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Pero la manera correcta de acceder (sin producir warnings en el compilador) es a través del ConfigurationManager:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGE6LCDSgND5paJ39WR21kEVhj3-X5LcOoTBllsYPZEqOH4SoOEFwIjzgUzqAZrAVFSLjE9x9SQdyG59YAPmool8NdxH5NDo0VRc4e4W_q6TGxAGK0tonMrqJ1hW7UwXUnD_8GB-K-8Q4/s1600-h/image%5B32%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;72&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBH3ge0spvcNpDZdAwOunKxp7mu1JR5pTxeLLq66dnU8EN33WD9uhDZG0GoSBs17trubxkGKe1_87wSxpIifW_UfEUdqD_hVEOsDcZceu1A5RAOaF4JqZnrS9gqmTDuQeMVs1VnMcmqFo/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;281&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
La clase AppSettings se puede enumerar (implementando la interface IEnumerable) para iterar sobre esta:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyg0NTl7YUMKj0ko8odHXM8gzX454cL0H1Gxs46yC6g0RGWaJZztvCYpkbnA6iivGIG-zQaaDuvGn4tcZUcMDG4aln83VFLHF0sz80eWUhWMPlyNfDNYonIytDQLhjLeSBZIKVaQwfYjI/s1600-h/image%5B36%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;114&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio4eHuoAs90Qo_QZ2dIKZekMhoyIDSItAMHa-nBIp_Wst8sFFNkQcMZF8n81MZwP93JAYih6NecgQA9-hjkUhxnyaQce2CTS8fWHp61C4hMvLD6juKrWreTLoy_aq2R3DTeyX-cp9i3zU/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;520&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Usando el componente ConnectionStrings se puede realizar de la siguiente forma:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDkeYysaTnNfhF9YiBS3-WUCCoJaCTaZn-qibl_CjQ9Vf_MuD9evm2MccU1ax8XvZ-rJdXVxeRTTBECCDiAKTawjDrLDCoZK2EN9WjrbRznI27OCZL8OQOCeaQ7DwUVYvyUCN5z3xs5Vs/s1600-h/image%5B40%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB5H7J_diBBE-mc2uY4By0MNR47hsuKLd-UbSfnS74LUhfnLVYyqYw-Hdv0YRCN7RodawvMXbLvJSEbSGZqfsqBpaf6DRn5dgqex-5qfwdn-RoLBNEbbPGWLIAsTdBead5nL24Ha8Alcw/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;535&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Se puede colocar clear al comienzo de la sección ConnectionStrings para eliminar cualquier otra conexión existente y luego especificar para cada ConnectionString:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;- El nombre descriptivo de la coneccion.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;- El providerName (el proveedor de datos que vamos a usar), por ej.: System.Data.OracleClient .&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;- El atributo ConnectionString con la cadena de conexión para conectarse a la base de datos deseada.&lt;/li&gt;

&lt;/ul&gt;Para poder utilizarlo en el código de nuestra aplicación:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIo2ST9OVPCpG1OOmmj4Hw3RYR9E8wt_u5GZoWLbPIrDTkosSqPpa8oFvGUBpphcJFAkxb8kiTSnmn2kAhDkaDdOkDiWtHjhALu3-0zUq0oowvu0Wdwg04lbjk1EpswcU1llb-75bIu6Y/s1600-h/image%5B44%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;104&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVcWu1wQpAQHadzECi0PZU5Qywn6tCmMCKaVZL9QFpmsX5Atc1NjxT3cZpt0XhVWqhAMIzPrZwt9BPgVhY97Kf9nYcEtVUq9HhouTETrLqOmmueeZFgO4-0_1sRNV-SlSXuYcE2cG-GG0/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;513&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
El ejemplo anterior usa la clase ConfigurationManager, que es utilizada en winforms o aplicaciones de consola. Para aplicaciones web (asp.net) se emplea la clase WebConfigurationManager (del namespace System.Web.Configuration) que es muy parecida a ConfigurationManager, salvo por 3 diferencias: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;- El WebConfigurationManager tiene un método llamado GetWebApplicationSection que la otra clase no tiene, este método devuelve una sección del web.config (equivalente a GetSection).&lt;/li&gt;
&lt;li&gt;- El método OpenMappedExeConfiguration del ConfigurationManager es reemplazado por OpenMappedWebConfiguration de la otra clase.&lt;/li&gt;
&lt;li&gt;- El método OpenExeConfiguration del ConfigurationManager es reemplazado por OpenWebconfiguration de la otra clase.&lt;/li&gt;
&lt;/ul&gt;Ejemplo de cómo utilizar el WebConfigurationManager:&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0IE2UaWCuDzuszXcsJeXmo0RDssYEluW3tsQS7tHplLZ30N0Er9kobr423_iMpVMybi41L-3vh3N1vqP1MetJRpFzgsZYEqshle_HTBY6QpnL2j9jemqyrBn76JXpVEJJb2Osu2N7Kpc/s1600-h/image%5B5%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;419&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjynH4r-xH8f2aLKHu74AHN63iLs5S2iBm9zlmofSj4cDPwtSeedxzvthKx9L2ATRP_k1xqNdu51CVba8LDeZucT6ePQN43EXKPnDYKv-qXWtVEV5wWtel7B_d43jtmAeE2HJZ7s1e7O9Y/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;552&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Application settings(&lt;/b&gt;&lt;b&gt;configuración de la aplicación&lt;/b&gt;&lt;b&gt;)&lt;/b&gt; &lt;br /&gt;
Son los valores de configuración que se aplican a la aplicación: incluyen cadenas de conexión de base de datos, las direcciones URL de servicios Web, configuración remota, y otros. La forma de utilizar los ApplicationSettings, es la siguiente: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM-UDXW3m9zVb87H-j9zN9FT2qjOu5Fi-F06LI-6sAq6emKgi2B8E4DkCZkZ3G8twnEVlIyZQ3sSwEouerOJCSIp0QyUDolknYarc9zfcXflz662T-2QcUcSlOmHAiSA84L8G0AAWOA10/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;136&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGVsLpw4NsX4kZM1MOprNYc1CK8jqW9OD1ehuGVJZ5N_4PypibGhFL-Lz_twO8rOqZhxA_QxHC4WoEgV8gIdln2n73xPUSJOxaDxgzskyEYZ8w7r0PQaNb2J04iO29m89PXLpOs2Ky2pc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;525&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Y se utiliza de esta forma: &lt;br /&gt;
&lt;i&gt;Ejemplo de una configuración de la aplicación llamada WebServiceURL, con una clase llamada SampleSettings.&lt;/i&gt; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh20XBSb5k6rpvpryasfCq2wxWEkSqbV7XZprs9CgNMXtG1JYeFmWTBIquElNnMK6hwArNRQFfLLpIPTngtQDNyw26XfYcO3j60wfq9cnECwJ-TXuVcV4opz3OLM3r7pc7fvvST_eeHil8/s1600-h/image%5B13%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;61&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinRW-gegDhRZwHI-2SRqIhmMVbzleNTpeUvfcvW1sL24-BEmGO1HXz63X9CHYnTvbPWDQrQaIL3FBXYcPgeuCc5Qs9-3EBgqZsD82VPaoEFoTkRH0GUt_mtFXop-ZJxbU0aK8ta-JOGtc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;477&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Aclaración: nuevamente estos pasos solo son usados en VS2005, pero como nuestro fin es el de seguir con el contenido del libro… lo muestro igual. Más tarde voy a comentar como se realiza esto en VS 2008 o 2010 (mucho más fácil y corto, por supuesto &lt;img alt=&quot;Guiño&quot; class=&quot;wlEmoticon wlEmoticon-winkingsmile&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2CShl9ZYw3Bff9msbM-DMgpt7vrN090Hr3QFx089kcbn51sFvpw_ROMMezQIhBecGLF2ZRuY0wO52UdzXiNP5lH88xInLLk5GAgD-ii64IDNQ19QK4oPDxv4Aio0GOVXBEDmYPmoQhV8/?imgmax=800&quot; style=&quot;border-style: none;&quot; /&gt;&lt;/i&gt;&lt;i&gt;)&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Hay dos maneras de hacerlo, aunque una es mucho más sencilla que el otro. La primera es escribir esto a mano. Pero un espacio de más o algún error ortográfico puede causar que la aplicación funcione mal. El otro método es utilizar la clase Settings y aprovechar el diseñador. Se debe agregar un nuevo proyecto, y crear elemento del tipo de archivo de configuración (SettingsFile). &lt;br /&gt;
En vs2005: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0PoMls-CDSK1rpTQOM8yicDelKzpMytK5Wniu0NVe7AzSUIpKjPqfi25ZqgA9TpI_xOSLzmefvnjixPWVQf2O63o4SsIoFXAU0ztYEdvJOSNWiB2UXJAu2mUuOGwBuidzkXxLBynqLlQ/s1600-h/image%5B26%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;329&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5MqF40N81atoNyE5Qws5uOykk6vrptWxB0zEhNFX9MwuzyurZEvdlyXG0ybmfHFtf4W2MN_W8dgc7pgb8JwJynfnma4StzyVFYgs2bNwRumq3PJ96Azy2DZ0fddqnAeFwZ_k86ZQR5zg/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;536&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Después de crearlo, aparece un cuadro de diálogo Configuración para crear y cambiar el nombre de las configuraciones, fijar su alcance, el valor por defecto: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd5lQTnshOXimcUuGXhaxtlTgVlzrlCqLsEc7YDaTlpPFW0yG5FcVxj6JgXZtq1H6J1hxFn8CHXOEzHQ8vbHVmukm2MKV3YY26mKCnvgBsJV70vArmi4_8Ds6R_3MtQjBn9qfBXLn_6Ls/s1600-h/image%5B24%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;198&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_r6yOriKdFptyQzn3dswyJ0mTyYVBh679m2dmwoU7B_YU7Vi9dv0cxdOoIXh9RyTKvpbUIplV1xz_ZpTPGZj7b2MxXGF75vO8mo_YWjP1AhSllPW6IOVx5_I0jvHbfRtsKpUCTT2H_gk/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;540&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Otra forma de almacenar y devolver valores es ApplicationSettingsBase que posee una colección de Key/Value. Lo único que se necesita para usar esta clase es heredar de ApplicationSettingsBase y decorar cada propiedad que mapee a los valores de configuración con su UserScopedSettings o ApplicationScopedSettings. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXO6YLECdampiXsVpi-X3ATJlqIIqGJz9Bw6VKEN615tJPMZzo0shP72LjJ9Cjd2V2KOHbu9RQNn2_UeCrY11_szPXijK3tX_qr-GmyZs-GnA3InEtnHAbMGZrHmbqna_7JKWNM2JgsVs/s1600-h/image%5B31%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;281&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpuhQkn060mbc3C9yHFjz23mQ-d9CAgcMevZ6b9QVb43O-9Xd_j0vVZ-K7Dw7GAGkY4gHud3W7J0hbn-_VIsuwAPc30tlgmkqk8sgIcXWD74X36ywew-c55QClWSthQL4wv-kAEcJk4s4/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;485&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Uno de los mayores beneficios es la de configuración de componentes remotos (permite indicar dónde se encuentran ubicados los assemblies sin necesidad de recompilar o implementar nuevamente. &lt;br /&gt;
Ejemplo de la forma de registrar un componente: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTQquH9iPTqg9AfzzZ7DRHN-n93mu8bzyq3s5bygASo1ZeI9fa9OThTudjPzfIJq44mIgUnfi9fcoWfwbuIrTrCG2nuXaHIbcweoHHNjblmSqScZwaHHfIh2JR0Ib3SIKkjmUX5q4rpTk/s1600-h/image%5B35%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;138&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy5C0UNXRfzFDUuqQIpk3jJcBPG2goRZrN5iKyL1fzxfg1wMuzqhhCMloSk4tGoKrXfQY59dwaQPjh5Bj8K74SLDrEIuSzrppsYIlEoP9LJlEFhyphenhyphenbPE4cDNu4UIUqnYbfL4gOWm9Oc35g/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;569&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para los casos de un IIS, se debe de tener cuidado a la hora de la configuración, porque se tiene que señalar la máquina donde se encuentra y el puerto. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3Xcxm_-LUeUZhYDNd1WqSMhyyJQkVUmVuwAFj4ilP5BkFVv544CFPwKe_iSOPFKfPUJFgJNC3ZFb06IgiEYCKEa7h9Nh3UpR37Q9qkMOXfVH35Pjb5jrmZaiX5SMHtSwzRbFHTJljs8k/s1600-h/image%5B39%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX1Ga2Aii9gjwJuzLwReBndyyLXzarbuynfVIyGY8WVOlAhfs_Ayn-abBs8HzWIgdsRPGj20v8esSPF_VjBF7f9oTZdbLiw2Kp4vPcNMXpt2XNR2sEpKYdb1jdI6hboTjxddvFaBXRGjc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;564&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Acá les dejo un video que encontré, es bastante completo, está en inglés, pero muestra todos los pasos para crear Application settings en Vs 2008 / 2010&lt;br /&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:d5bec185-3bc0-45ea-be8a-c50adf7e9e28&quot; style=&quot;display: inline; float: none; margin: 0px; padding: 0px;&quot;&gt;&lt;div id=&quot;ce188dfb-c735-4a35-8c44-709c009d6443&quot; style=&quot;display: inline; margin: 0px; padding: 0px;&quot;&gt;&lt;div&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.youtube.com/watch?v=t9WIvYQ1dNU&quot; target=&quot;_new&quot;&gt;&lt;img alt=&quot;&quot; galleryimg=&quot;no&quot; onload=&quot;var downlevelDiv = document.getElementById(&#39;ce188dfb-c735-4a35-8c44-709c009d6443&#39;); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;480\&amp;quot; height=\&amp;quot;385\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/t9WIvYQ1dNU?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/t9WIvYQ1dNU?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;480\&amp;quot; height=\&amp;quot;385\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFZMtV0YhfMc7nTQYz0vSE-q5UDb4wKkuoQsRUeASvfY21P92ckpZ8CanTEmfFddj-OrTczm-DTSYCHOCGBpynNs_Y4CWv9Z-YowMC17XbUhQ_zApMF8Rr8Q-faez9PD1nTmo3cJ0Xwkc/?imgmax=800&quot; style=&quot;border-style: none;&quot; /&gt;.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;b&gt;&lt;i&gt;....................................................................................................................................................     &lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://vicrodg.blogspot.com/2010/11/capitulo-9-instalando-y-configurando_16.html&quot;&gt;2da parte &amp;gt;&amp;gt;&lt;/a&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;.....................................................................................................................................................&lt;/i&gt;&lt;/b&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/9166429118590198931/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-9-instalando-y-configurando.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/9166429118590198931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/9166429118590198931'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-9-instalando-y-configurando.html' title='Capítulo 9 – Instalando y configurando aplicaciones–Parte 1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgraIlDZW7QUL1cnCiTRho3UI-N0D1_dBhyv-b7VtMB26ef7dinoUePCQIgaNDq2H7hFUrRbANX-8bBjaAHLZbL9Xd7lb6KDwTQ_pz93xytkCLPxoyU-FJ9BanhDDIayK3-1LbVSO3DVno/s72-c?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-7198641441048728403</id><published>2010-11-10T10:44:00.005-03:00</published><updated>2011-03-17T12:54:22.043-03:00</updated><title type='text'>Capítulo 8- Dominios de aplicación y servicios–Parte 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 3 – Creando servicios de Windows&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
La creación de servicios, permite correr un assembly en background (por detrás). Los servicios son ideales cuando se necesita monitorear algo, cuando el assembly necesita escuchar por conexiones de red que ingresan, o cuando se necesita ejecutar un assembly antes que el usuario se loguee. &lt;br /&gt;
Debido a su naturaleza, los servicios requieren seguridad especial y consideraciones de instalación. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Que es un servicio Windows?&lt;/b&gt; &lt;br /&gt;
Los servicios de windows son procesos que corren en el background, sin interfaz de usuario, y en su propia sesión de usuario. Es ideal para una aplicación que deba estar corriendo constantemente y no interactuar con el usuario. &lt;br /&gt;
La única forma de debuggear un servicio es instalarlo, iniciarlo y atachear un debugger. &lt;br /&gt;
Se debe crear el instalador de componentes para el servicio de aplicaciones. La instalación de componentes, instala y registra el servicio en el servidor y crea una entrada para este, con el Windows Services Control Manager. &lt;br /&gt;
Las aplicaciones de Windows Service corren en una situación diferente de la ventana interactiva del usuario no logueado. Una window station es un objeto seguro que contiene un Clipboard, un grupo de objetos de escritorio. Los mensajes de error deben ser logueados en el log de eventos de Windows en lugar de mostrarlos en la interfaz del usuario. &lt;br /&gt;
Los Windows Service application corren en su propio contexto de seguridad y son iniciados antes que el usuario se loguee a Windows. Se debe planear con cuidado qué cuentas de usuario debe correr con el servicio. Los servicios con mayores privilegios son los que tienen más ataques. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como crear proyecto de Servicio?&lt;/b&gt; &lt;br /&gt;
&lt;i&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;b&gt;Aclaración: visual studio 2010 ya no cuenta con las mismas plantillas que se explican en el libro, para saber cómo se realizan en la actualidad hagan clic &lt;/b&gt;&lt;/span&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/9k985bc9.aspx&quot;&gt;&lt;span style=&quot;color: #ffc000;&quot;&gt;&lt;b&gt;aqui&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;b&gt; o en un post muy útil que encontré &lt;/b&gt;&lt;/span&gt;&lt;a href=&quot;http://blogs.renacimiento.com/dprovencio/archive/2010/01/12/crear-un-servicio-de-windows-con-visual-studio.aspx&quot;&gt;&lt;span style=&quot;color: #ffc000;&quot;&gt;&lt;b&gt;aca&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;b&gt; , pero con el fin de ver todo el contenido de la certificación, lo sigo explicando de esta manera.&lt;/b&gt;&lt;/span&gt;&lt;/i&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
1. Crear un proyecto usando el template de las aplicaciones de Windows services. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVxIMV7c-8NDJO__OU_yu8-Ihn-wJGc-x2qlW8yb_p_TqCwdk5uKWJAojEbwdQpsIZ0PHXdiMBi_imOXEBWyhxepA9-1VaeuG0WEG7YBm_jor06FE4iDuWrLXnBCfr7KJ41PwG5gtCHJE/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1vh8KUebbJJ_vlpnoG6YYBsyL2g-gokajL1EiZx0UqBhxnKsrSAzZzARFIu608v6aVehg-DS_QJwEvLBDOlkWRJWkJAasW2xZ85jFx9Fbf4gnjRSypSnoZnso-HlC2MWEzzmFLCckqxU/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;547&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
2. Escribir el código para los procedimientos OnStart, OnStop y otros que quieran redefinir. &lt;br /&gt;
3. Agregar los instaladores necesarios, por default, un service application contiene 2 links de instaladores, uno para el proceso y otro para el servicio asociado. &lt;br /&gt;
4. Crear el proyecto para instalar los servicios e instalarlo &lt;br /&gt;
5. Usar los servicios snap-in para iniciar nuestro servicio &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como implementar un servicio?&lt;/b&gt; &lt;br /&gt;
Después de crear el proyecto de servicio, se deben seguir los siguientes pasos para implementarlo: &lt;br /&gt;
1. Modificar la propiedad ServiceBase.Servicename (es usada para identificar el servicio). &lt;br /&gt;
2. agregar código en el metodo OnStart (este se llama cuando se inicializa el servicio). Si se desea ejecutar algo de forma mecánica, se puede usar el componente SystemTimers.Timer y este lanzara eventos periódicamente. &lt;br /&gt;
3. Adherir codigo al metodo OnStop para realizar acciones al momento de parar el servicio. &lt;br /&gt;
4. Opcionalmente se pueden sobreescribir OnPause, OnContinue y Onshutdown. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como crear un instalados de proyectos para un servicio?&lt;/b&gt; &lt;br /&gt;
Para la instalación de un proyecto para un servicio se utilizan las clases ServiceInstaller y ServiceProcessInstaller. &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· ServiceInstaller: define la descripción del servicio, su nombre, el nombre del servicio y tipo de inicio.&lt;/li&gt;
&lt;li&gt;· ServiceProcessInstaller: define los settings del servicio.&lt;/li&gt;
&lt;/ul&gt;Pasos para crear un instalador de servicios usando visual studio (2008, 2005): &lt;br /&gt;
1. Abrir la vista diseño del servicio, hacemos clic derecho en el diseño y elegimos Add instaler (agregar instalador) y se crea un ProjectInstaller. &lt;br /&gt;
2. Estableces la propiedad startype (del ProjectInstaller) como: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· Automatic: el servicio inicia automáticamente cuando la computadora comienza.&lt;/li&gt;
&lt;li&gt;· Manual: el usuario debe iniciarlo manualmente.&lt;/li&gt;
&lt;li&gt;· Disabled: el servicio no inicia, ni el usuario puede empezarlo&lt;/li&gt;
&lt;/ul&gt;3. Agrega una descripcion y un displayName para el ServiceInstaller. &lt;br /&gt;
4. Specifica el contexto de seguridad, seteando las propiedades de la cuenta (Account property) del ProjectInstaller. &lt;br /&gt;
&lt;blockquote&gt;Los contextos de seguridad pueden ser: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· LocalService, corre en el contexto de una cuenta que actúa sin privilegios de usuario y tiene credenciales de anónimo.&lt;/li&gt;
&lt;li&gt;· NetworkService, permite autenticar a otra computadora en la red.&lt;/li&gt;
&lt;li&gt;· LocalSystem, el servicio corre con ilimitados privilegios y presenta credenciales a cualquier usuario remoto. Es de mucho riesgo.&lt;/li&gt;
&lt;li&gt;· User(the default), causa que el sistema pida user name y password cuando el servicio es instalado&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.blogger.com/%20%20%20%09http://www.ziddu.com/download/14224381/Resumen70536-cap-08.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF&lt;/a&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;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; &lt;a href=&quot;http://www.4shared.com/file/1zBbWu3f/Cap_08.html&quot;&gt;Codigo Ejemplo&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/7198641441048728403/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-8-dominios-de-aplicacion-y_10.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/7198641441048728403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/7198641441048728403'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-8-dominios-de-aplicacion-y_10.html' title='Capítulo 8- Dominios de aplicación y servicios–Parte 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1vh8KUebbJJ_vlpnoG6YYBsyL2g-gokajL1EiZx0UqBhxnKsrSAzZzARFIu608v6aVehg-DS_QJwEvLBDOlkWRJWkJAasW2xZ85jFx9Fbf4gnjRSypSnoZnso-HlC2MWEzzmFLCckqxU/s72-c?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-370166012830076608</id><published>2010-11-09T14:58:00.005-03:00</published><updated>2010-11-11T09:03:04.469-03:00</updated><title type='text'>Capítulo 8- Dominios de aplicación y servicios–Parte 1</title><content type='html'>&amp;nbsp; &lt;br /&gt;
Los dominios de aplicación&lt;b&gt; &lt;/b&gt;permiten llamar a assemblies externos con la óptima eficiencia y seguridad.  &lt;br /&gt;
Servicios son tipos especiales de assemblies que corren en el background (por detrás), no tienen interfaz de usuario y son controlados por herramientas especiales.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 1 – Creando aplicaciones de dominio&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
A veces es necesario correr un assembly externo, pero cuando esto se realiza se puede caer un manejo ineficiente de recursos y en problemas de vulnerabilidad. Para evitar esto se crean dominios de aplicación.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Que es un dominio de aplicación?&lt;/b&gt; &lt;br /&gt;
Application Domain (dominio de aplicación) es un contenedor lógico que permite correr múltiples assemblies como un solo proceso, previniendo acceder directamente a la memoria de otros assemblies. Ofrece varias de las características de un proceso como: espacios separados de memoria y acceso a recursos, pero son más eficientes que estos, porque permiten a multiples assemblies correr en dominios de aplicación separados sin la necesidad de correr multiples procesos separados.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyicu9XjO7vcoJuPvLzbG6BwoPBaPr2edJh942YW_Qyhnr3oKfjaJsxqaCcWKtRYCIm8yFCWg1ptrbb3nquqOFPWfnQjslCtdov6BAdbFUuagvUzAyDT_F-0vgwNbbeRDkZ8o048QrX6M/s1600-h/image%5B8%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;270&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2lm0k1v2922yp0ZdXzxFyMJe7ukZ0ntgaIeGmfePR_FdpegvS7QmAhHYzW1iHroCZnMEOCOqQVVKWiNDfinf2SD8c2WfcfzT6fqJZST735oKFhbuoNnGOjHse_Bv-corT2tl5lr7hO9Q/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;527&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Un ejemplo de Application Domain es el IIS: si un sitio web es visitado por 10 personas, IIS va crear un dominio de aplicación para cada uno (ASP.NET corre 10 instancias separadas del assembly). &lt;br /&gt;
La mayoría del tiempo, en tiempo de ejecución dependemos del host para crear dominios de aplicación automáticamente para nuestros assemblies. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-WxvREh-XSZNwGmiOx7uIyVeCX15sgm-swh9JeVU185edQeEHvjDwKba02wxiuLyqaJ2j2guv_9bx2fHAtySXbse220kWZTpCG5j95u4xf7NYZxIIQlWQgTrcDJZQVm3H__3GRSDrbCY/s1600-h/image%5B7%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;326&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO8_JRaTOMdpDYmKLusqR-TWOs8clRpmJHu-yZA6EtFyT5nP3eLtDjjR-Yh5YRX2yaIxFaUoIygu6B8r4nCshPB-Cc4Tc-N7iIJ85dys2puH_p8A-e0QfWrCz2JJoz8f8HfsW37-qfn90/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;526&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Se pueden configurar el comportamiento de los application domain usando herramientas como Internet Information Services Manager y el .NET Framework Configuration Tool. &lt;br /&gt;
Aspnet_wp.exe crea dominios de aplicación para aislar múltiples instancias de un assembly. Podemos crear nuestro propio application domain para llamar assemblies con riesgo de que el assembly pueda realizar una accion o acceder a cualquier recurso que no se ha especificado como permitido. Incluso, un Assembly puede almacenar varios Application Domain que almacenen assemblies. &lt;br /&gt;
Además de aislar un assembly ,los dominios de aplicación brindan confiabilidad y eficiencia: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Confiabilidad&lt;/b&gt;: para aislar tareas que pueden causar que un proceso termine. Si un appDomain se vuelve inestable, se descarga (unloaded) sin afectar el proceso. Esta técnica es útil cuando el proceso se debe correr por un largo periodo de tiempo sin volver a empezar, o cuando no comparte información.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Eficiencia:&lt;/b&gt; Si un assembly es cargado en el application domain por default, el assembly no puede ser descargado de memoria mientras el proceso esté corriendo. Esta técnica se usa para minimizar el trabajo de setear procesos de larga duración que ocasionalmente usan varios DLLs.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;La clase &lt;/b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.appdomain_members%28v=VS.80%29.aspx&quot;&gt;&lt;b&gt;AppDomain&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
En .Net , se usa el namespace System.AppDomain para manejar los dominios de aplicación, este contiene las siguientes propiedades y métodos: &lt;br /&gt;
&lt;i&gt;Aclaración: coloco los que más se usan, pero es recomendable ver el &lt;/i&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.appdomain_members%28v=VS.80%29.aspx&quot;&gt;&lt;i&gt;link&lt;/i&gt;&lt;/a&gt;&lt;i&gt; para conocer un poco más a esta clase.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;ActivationContext&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;obtiene el activation context del actual application domain&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;ApplicationIdentity&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;Obtiene el identity de la aplicación en el appDomain.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;ApplicationTrust&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;describe permisos y si una aplicación es confiable o no.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;BaseDirectory&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;Obtiene el directorio base que el resolvedor de assemblies utiliza.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;CurrentDomain&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;obtiene el actual ApplicationDomain del Thread.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;DomainManager&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;Obtiene el administrador de dominios que fue provisto por el host cuando el appDomain fue inicializado.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;Evidence&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;Obtiene el Evidence asociado al appdomain que es usado para políticas de seguridad.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;ApplyPolicy&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;Devuelve el nombre del assembly después de que una política es aplicada.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;CreateComInstanceFrom &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;Crea una instancia de un tipo de COM.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;138&quot;&gt;&lt;b&gt;CreateDomain&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;461&quot;&gt;Crea un nuevo appdomain.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como crear un dominio de aplicación?&lt;/b&gt; &lt;br /&gt;
Para crear una appdomain, se debe llamar a una de las sobrecargas del método appDomain.CreateDomain &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT3ltsrSW11zzE_oTQJSvUnbqltYvR-WMME2_JX2xgBeOfN2G6sNXIa3MYMj5OV3MqcjJ6AUfow0FfUHrlKYhsZF5H4KezYld2PJweryrwBefgRBbCPgU7jhSess-nbr25hsF0jnKRsW4/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;111&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKozasz3s8dSY5T-iGqEiiOHDwoRNslRa93O1dtkB8kiHvEiowyMYXFDVv_jHguTg7rKmAsVfEGJyY0mqKwWH4F0Ne0uOKLaxzg5HK27mjxzagIB14ylhcBo6ujtilRne5eHWww8yTYXE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;549&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ5kXOSkbZgOItylzRury6j5qsVoy_L5GDurhSatl3r1V-hTQjr6xpYa8INlPEtohHaIBYJLUszJ-wSYFnsfpi859qAvMstXK075cb4sWbhQWB7J6kD-RQwGV0llS7S8gAB3LgCWnw9bM/s1600-h/image%5B16%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;34&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8tCYCmQD1tc559bjcKG0gbv0BCnGNX0A7Zm3BO7d_RtfNoUrTRjQTmPe-Fie0chHS0uZXwsylfgdvpx5zedFjF4hYX7SLDCnBNRc6FAhiTtbZVcIDo8-aA5NimXBf-oRqQLJSbGDYdDE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;315&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como crear asemblies en un dominio de aplicación?&lt;/b&gt; &lt;br /&gt;
Crear un appdomain y cargar un assembly dentro de éste es igual de simple que lo anterior, se debe llamar al método ExecuteAssembly: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7Lb1tWUIdP_Hu96fL2NhON_l3sPVOsfvtHi9A8G0CH8iM4atzqoLj7Zyg58dq_UPsMmE5OohY07AudTUw_7_ZiUxsKLxviRL1N8Jm9dusTN129yKpSLCa0sBoUjHcd_Jc7_uGKRs8R8Y/s1600-h/image%5B21%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQl9pvpHqjl9vNkW0nXXw6j-g03Eu0GzJSQVZD3fHjfPm0EKP0SB0yg641iIsc7Y9j8vJuo4EfMqZg4XTyQn9MAWbgnuiGESZIdt4NZoha_8KH3FCjhP77ZnrAgxHN15sLKDjM2ST0me8/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;434&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como descargar un dominio de aplicación&lt;/b&gt; &lt;br /&gt;
Una de las ventajas de cargar assemblies en un dominio de aplicación es que se pueden descargar en cualquier momento para liberar recursos. Se realiza llamando al método AppDomain.Unload:     &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbjf-nzFGZtcBsjGFILkeSEmHs4yExjISLGZ8Nvtse0N-ATF4NqIQPIe8Q4qBfKHrUzdOmPNibKkilPzUqTf2Ba51Bb62mH7BL70rrs9Ui5tXTSXiD6KxpFSRNa4R41vYcNWFvooyuMkU/s1600-h/image%5B25%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;81&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hY-83DAcvuj7CYW0oNpEX5ZAQ5wah7L7uQEN-wIMO64GrjkbxIakPIVMXk_553J8h1sb8mkY-Ne_vqcOg1Hhlj0kyPhvt8x2aHcyEhiGmX3-aCDXDEqCcLNntAmf8LFflval97rBom4/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;446&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 2 – Configurando dominios de aplicación&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
Se puede configurar dominios para crear entornos personalizados para assemblies. Lo más importante de modificar configuración por defecto es restringir permisos para reducir riesgos asociados con la seguridad. &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como usar un Applicaction Domain para lanzar assemblies con privilegios limitados?&lt;/b&gt; &lt;br /&gt;
Restringiendo los permisos de un dominio de aplicación se puede reducir el riesgo de que un assembly que llamemos realice alguna acción maliciosa. &lt;br /&gt;
Ejemplos de assemblies con privilegios limitados: &lt;br /&gt;
Defense-in-depth: es la seguridad principal para proveer múltiples niveles de protección, de esta forma se está protegido de una vulnerabilidad. Es muy importante cuando se ejecuta código externo.  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como proveer evidencias de hosteo para un assembly?&lt;/b&gt; &lt;br /&gt;
Cuando creamos un dominio de aplicación y lanzamos assemblies, tenemos completo control sobre la host evidence.  &lt;br /&gt;
Evidence: es la información que se reúne en tiempo de ejecución sobre un assembly, para determinar que código agrupa. Su grupo de código, determina sus privilegios. Las evidencias más comunes incluyen carpetas o sitios web que el assembly corre e incluso firmas digitales.  &lt;br /&gt;
Para proveer evidencia para un assembly, debemos crear un objeto system.Security.Policy.Evidence y después pasarlo como parámetro a una sobrecarga que tiene el application domain del metodo ExecuteAssembly. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheesDD1e0ZN2Nec1aNBqloYZ0IL_clLZ5K8olWPDk0f1gPTM8waeFXTMwsTnC26XSplHYRt0emHiaM0RS4UvWzk9BIe4aVoenQ-eN0XbfQC0iDlIhNRc11cfFrcgxAylzN46JXrZvUsFw/s1600-h/image%5B32%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;42&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0cZaarfWbqD8gpW-3xWHIKEzYMjf92pkyVC2XJ44hgz2Jnwwc_HCzChxttkBJ52V3XPS0D7Uoo-JCHcis7rMJLYdWdM7FIv28zGh5T66Lv-4rloZcOeFT4xcrXdni-vV9YaOY1W2-H8w/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;534&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
Cuando se crea un objeto evidencia con el constructor que requiere 2 arreglos de objetos, uno representa los Evidence del host y el segundo, los del assembly. Un Evidence puede ser cualquier cosa, un string, un integer, una clase personalizada, etc. &lt;br /&gt;
La forma más simple de controlar permisos asignados a un assembly de un appdomain es pasarle la Zone evidence, de tipo System.Security.Policy.Zone y el enumerador System.Security.SecurityZone: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRRju_JoQnrGUOqvK0DR8fpEuuNEOaNg9THoXBxjmbGuTO6i6yOulX726w_6tSsQ7QMHFTwboURc21f82FbQFRcDjDjmE_5TnWp_JdDW82T42kBU39Ik5DC-TntWNMPKPTI6G5oS7SR-k/s1600-h/image%5B33%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;87&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglMRfIQ5cWJQ-K8fQuz4cuGDI3OkP1wq05cGDeU1Q1LcBEFpwU98v-9RN1waCS3rGixR4m1_dEuch1T541ZGiZ-qNhAsX0i5yRpNnmYMVuEAfd2Rhun57oicoWNRI5Fz5ybYwXVMMPwvY/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;529&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como proveer&lt;/b&gt; &lt;b&gt;evidencias de hosteo para un dominio de aplicación?&lt;/b&gt; &lt;br /&gt;
La técnica es similar a la de la evidencia para un assembly , usa una sobrecarga de AppDomain.CreateDomain que acepta un objeto Evidence (se debe referenciar a los namespaces System.Security y System.Security.Policy):  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQNSpyTMkk6fzqjawI32zhOAoC3AgMpd8i9KihyDtWy2zeroK85Zycp0ZFeL0C2CCGKJM5AAZ0-WrrV3FGKZOnXWN1yl6cgOqe_h0t_zUwhjRqNRScJJsnUvjlodKqHiloZ045pv36jwQ/s1600-h/image%5B37%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;76&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1PLaFBUp4zrwTyc8BexHo23FIU75R2yiT4T19VV6hsmUhyphenhyphenlb4KnVB8bHjJOgfL5-_XJw32H75lgzkwuewmL31aSukSGC_WOYiElJqEj80czb4379iZ6lsCZY0IPCcH44FJtAMuYGAH2Q/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;562&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Como configurar las propiedades de un dominio de aplicación?&lt;/b&gt; &lt;br /&gt;
Se puede suministrar el common language runtime con información de configuración para un nuevo dominio de aplicación usando la clase AppDomainSetup. &lt;br /&gt;
Cuando uno crea su dominio de aplicación, la propiedad más importante es ApplicationBase. &lt;br /&gt;
Las otras propiedades del AppDomainSetup son usados por el host para configurar un particular appDomain. Cambiar las propiedades del AppDomainSetup no afecta a ningun AppDomain existente, solo a los que se crean después. &lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Acá les dejo el link para ver las propiedades y métodos de &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.appdomainsetup_members%28v=VS.80%29.aspx&quot;&gt;AppDomainSetup&lt;/a&gt;.&lt;/i&gt; &lt;br /&gt;
&lt;br /&gt;
Para aplicar las diferentes propiedades a un dominio se debe crear un objeto AppDomainSetup y pasarla junto con el objeto evidence, al método AppDomain.CreateDomain. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic1b-aWkRJ-vLee8VuSY0a2lXHBEdCc3SMnzOjkYtEJnqrwEDYgbzznFOeoij-VRaz4rwaq9ceGMSmeIX5ZVJVw148lYDf5zMTd5Nj7csqKMZRQg8zSVSnGYuDJ4u_J15-PxjKDSVIDSM/s1600-h/image%5B41%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;159&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDOE7GzpN4KLCQ0ZOBjSjvpviKjab-7rCQarzTd8Df47IfJ6AkxtfzIsT6MSfYAZkI3s2LZQ2-_IoZzR-a4OwtcwFYfccHkrdKYsRhF5kZOvCXQNuqTKuBRaItSVKPlqotG9sAgWDw7j0/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;569&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Para examinar las propiedades del appdomain actual, se usa un objeto AppDomain.CurrentDomain.SetupInformation &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkZHkaOksnsqC8DNKyIxjZZtA_svWwToSYBiQBdLeuZaPJZqMxl5aQ9EIluUK9GlxA9bRJrSxftiSdCEGria9bUKgDOWAE5Q97QxhhayHpP-vM3_WOe7yShyFzoNccAp1GXrvSERDln2g/s1600-h/image%5B46%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;126&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiQwRgK4Dc-G5DXEy4LO7TE0h0qlwzs7Zy_Zl4pmQOf73Fjm6pX6hwKzJDLZauqbP98MB9yAj5ZTyvS0ro_LKmtqAhyphenhyphen6_QHs1b-zxEpU7EOm59nT9BSpSwAg-qkpqkYatuMEqrNbZ7HTQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;569&quot; /&gt;.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;b&gt;&lt;i&gt;....................................................................................................................................................     &lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://vicrodg.blogspot.com/2010/11/capitulo-8-dominios-de-aplicacion-y_10.html&quot;&gt;2da parte &amp;gt;&amp;gt;&lt;/a&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;.....................................................................................................................................................&lt;/i&gt;&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/370166012830076608/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-8-dominios-de-aplicacion-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/370166012830076608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/370166012830076608'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-8-dominios-de-aplicacion-y.html' title='Capítulo 8- Dominios de aplicación y servicios–Parte 1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2lm0k1v2922yp0ZdXzxFyMJe7ukZ0ntgaIeGmfePR_FdpegvS7QmAhHYzW1iHroCZnMEOCOqQVVKWiNDfinf2SD8c2WfcfzT6fqJZST735oKFhbuoNnGOjHse_Bv-corT2tl5lr7hO9Q/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-5277305968860098261</id><published>2010-11-08T15:24:00.006-03:00</published><updated>2011-03-17T12:52:42.328-03:00</updated><title type='text'>Capítulo 7 – Threading (Manejo de Hilos)–Parte 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;&lt;b&gt;Lección 3 – &lt;/b&gt;&lt;b&gt;Modelo de programación asíncrono.&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Entendiendo la programación asíncrona&lt;/b&gt; &lt;br /&gt;
Permite que distintas partes de código sean ejecutadas en hilos separados. &lt;br /&gt;
En .Net Framework existen muchos métodos de la forma BeginXXX y EndXXX que trabajan de forma asíncrona para poder crear otro hilo que trabaje, mientras nosotros realizamos otras cosas en el programa.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Modelo Rendezvous&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Hay 3 estilos de programación asíncrona &lt;br /&gt;
&lt;br /&gt;
· &lt;b&gt;Wait-Until-Done:&lt;/b&gt; este modelo permite empezar una llamada asíncrona y realizar otro trabajo. una vez que se realizó lo que se deseaba, se debe colocar una llamada para bloquearse mientras se espera que la llamada asíncrona esté completa. &lt;br /&gt;
Ejemplo: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUlPeydJR557OOjXVIzeQarkpX8Uf_W6m_cIwWbVGRQQDNYdEnbhZVAAwXh-N46d2ph304hP0n-BBDIHBoVQ_0k6Xf2Z7yxzx3r2EnuqrfdHvBv6LLnrVtPUxyZdNWNo2NmnTYFVRTIUk/s1600-h/image%5B4%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;288&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyZPXOaek2p3XW_gv2cOV-NLil1fd_SHZgeNaO9K6SmaDlGf7EAyWV3d2FJIG1ImrcXO2ZjO6LIpzzsaGrWvexe7otnXMUgWZYOdytI5TmDvcteAAUTekfRvu35gbmx68A5X2x23Ax1OI/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;557&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Es del estilo de BeginRead y EndRead. &lt;br /&gt;
&lt;br /&gt;
· &lt;b&gt;Polling: &lt;/b&gt;muy parecido al anterior, solo que la forma de revisar si se ha completado la llamada asíncrona, es mediante el objeto IAsyncResult, se debe consultar a su propiedad IsCompleted, para ver si se terminó o no. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCfoYDc2tzWMDpdDUuSl0szgj0WgaSwkmEwW9w4lGc7RUIiQFtmfuaeaG6z2SKBQDJcATgfmSW-ZCAUa-Mn5FiYoyJbzI_piECicNimlmbTTXieTGYuAgEVmgDoc47U85D1JVKe8D_gGo/s1600-h/image%5B9%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;384&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCGU4pDv2KWnpJJw4vy8x2g-ZxqXgIWpHTGiLTmzzYDuxAcsX4_bR_eK-Go076eYgvO7KnPo1n96J5-lWR6nqG7xGBrkDjwg5MAZS9UPAP5tn4pCWFvDu3fxuDc1RXrjPZIUxv9TR_F4U/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;557&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
· &lt;b&gt;Callback :&lt;/b&gt; El modelo callback necesita que especifiquemos un método a llamar e incluir cualquier estado que nosotros necesitemos en el metodo callback para completar la llamada &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5SCw2s4MM3AWcLXHYdfVY-v95_ZlwONtREqiR-OP360Czg_jsW3oHUJBeYQA7Rg_J5nio2j_UjS7vxv61yz4x_-8GrKcnm1sOP3bA6kdhU9-yUfXlsDvRa1E47fHKIzfaQD_fCGkckTc/s1600-h/image%5B14%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif-DX0w4LguGQ2EqP2fulKY6aRLSpMltlUdpJymKN49OrVyIklUhrZwr87cldtLI2UjFo2AWa5ZDFxBGch4R_k0udgQ1kGAwOvFzH-repzyNnZOELG3a0cMoHkJltpJ9csOsSgYg3oqTQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;552&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
El parámetro stream, cuando se realiza la llamada asíncrona, es porque puede ser necesario pasar el filestream como estado. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKMilkH-FX4GTe1GoooMmuqAoKA1uU2FAjGUYxpd3ORvvRL4_FeVMtPNLKf_3k7u8WksahqPBWY6iaTGbeKgoJqOL00EJ_-u_6aovhEaBXwkZuOLQlSzH893FsY_Q16JwiAUycGeqqZlg/s1600-h/image%5B18%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;263&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA_qNdIqEiyfLDc_T5_SBIfgraH0Ml2No7XZMVkMnnZ4DkgJTaAfCizMXCJ4LjO6wtVIT7Gu-zrFgX1qkVh31UhV1UVkkVjJanK5MogtlIih6J5_Pza3WkUSE7B077EdV8ZmyS7gNCn_8/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;564&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Excepciones y APM (modelo de programación asíncrona)&lt;/b&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Cuando se usa APM, pueden surgir muchas excepciones. Si ocurre una excepción dentro de la llamada asíncrona, ésta es mostrada cuando se llama a EndXXX (se debe realizar try/catch) &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV5QoZocNIxu5TB1phFrhE4Yrr4iOs7jBjmh3ogqU2samCPsylaFVJKGtYCXlBDU9WRLLLwghqarUdHJVNpOy9U8aoxXeadp7ulRM-ouBk5G4uSqEbuTRVAJuZu3teZqP0EA1Fn4hueuc/s1600-h/image%5B22%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJnXJOH7pMeat2Hynhxu954hwmnmSC7MOA6ojgTCbRdKusyF8dBkLnT0diJQq43dcP97OaobkLp_OIlDTBBQGogc5OLJ_xdHbs7g7NHfZGbho66Wc-Ni3_8MVk3Hooj-W4QpO5HQZ-XWE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;434&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Usando ThreadPool&lt;/b&gt; &lt;br /&gt;
En muchos casos, crear threads propios no es necesario o sugerido, .Net te soporta un pool de hilos que pueden ser usados en muchas situaciones donde se necesitan crear hilos propios: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz8nouomWP4SFxqL6cdqj0bThe9zuzxhNURoq2n9MvUCQjNEtrwEoHYKq_pbKsA8GNuyeiVrEM34-9yT4IJzEJIQl70WUMauaBUXjruxN0u2Gq_qyII-r9aNCh935QN0kV3nmLIsMLT2Y/s1600-h/image%5B29%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;152&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKLpKiSPfAF8GeDyqPK42eb3LYgT4eE3ciswTuyE6cBGBJKcgqapCf3LZ1BqPUeBSkiU4xOOKkaLByZjgpqTD_aE_mV_wQsoK4dQ6NbzIXg5xFVA63RpiCU8xL7BhhLyo8Wn0BRYxmuwc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;567&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirpD7sUwM9w2F2yNFoDxtBcnyomzrf42IOUd1PIZ2G4hM4y3sJy2oOkOw3ykHR5zUjy6oEjJ4HjMYqa8Xvr5Q8NewHgQuYp9az_NtXAnl9D8jA-yROWCzTWh91uxazQwRd2znTwWUkBwo/s1600-h/image%5B30%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;89&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxhHtOjLgmqSO_Wis-HDy7O-rxOIS6seB9azNvUbI978zVJ3cwlYGNMvo8f7uezd5ndp0fe5hYC2F8AlhNfF6tQPWbT0C1fn6pru5wuOsFRV_y9YpRHDCRBS7G4aYB_wb6ZMGrfeeUZXc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;572&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
.Net mantiene un conjunto de threads que pueden ser reusados para la aplicación.es más rápido porque se reúsa solo lo necesario. &lt;br /&gt;
&lt;br /&gt;
La clase ThreadPool soporta métodos no solo para encolar trabajos (queuing up work items), sino además para administrar el ThreadPool.  &lt;br /&gt;
Métodos más importantes y usados son: &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;168&quot;&gt;&lt;b&gt;GetAvailableThreads&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;435&quot;&gt;número de hilos disponibles para uso en el pool&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;168&quot;&gt;&lt;b&gt;GetMaxThreads&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;435&quot;&gt;Número máximo de hilos que puede soportar este ThreadPool.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;168&quot;&gt;&lt;b&gt;GetMinThreads&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;435&quot;&gt;Mínimo de hilos que son creados en cualquier momento.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;168&quot;&gt;&lt;b&gt;QueueUserWorkItem&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;435&quot;&gt;Agrega un trabajo al thread pool para ser ejecutado en un hilo disponible.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Si quieren consultar un poco más sobre esta clase y ver otros métodos usados, se puede hacer clic &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/y5htx827%28v=VS.80%29.aspx&quot;&gt;aquí&lt;/a&gt;. &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Limitando el número de threads en un ThreadPool&lt;/b&gt; &lt;br /&gt;
La clase ThreadPool soporta algunos métodos estáticos para limitar el mínimo y máximo de threads que se pueden usar. &lt;br /&gt;
Existen 2 situaciones donde se debe de cambiar el límite de hilos del ThreadPool: thread starvation,(supongo que la traducción seria, Inanición de hilos o falta de hilos) y aumentar velocidad de hilos. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Thread-starvation:&lt;/b&gt; cuando la aplicación necesita muchos hilos y sobrepasa la cantidad de threads que la ThreadPool contiene. Se usa ThreadPool.SetMaxThreads &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6gHxIkzT9aB6WgNL0vh-BNgNZRAEBpd_z9m7jUP7wpww0uUddQfkIglHgnSstYX-YK9qR3YbJspGCAe-8qLt79F0HJIQ2PT77uFiESGF0FF3rnRO3herPGO7ulWgo4eVhcvKrf3OOpVs/s1600-h/image%5B34%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;157&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9OTGfF9cy1jZW3cPC7kFznD4IGgs8WcZ-G6w3uSknFBqegMZ7CGLKvgeTw96nt9xtXIah92xU2ao1DQg_76tJvYARplU1Vfb_MWiqYLot3_pnCNS1OlZVfTZKs7SUrVjTe46tHa5kgSM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;559&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Un completion port (puerto de finalización), es un hilo de nivel de kernel que es utilizado para hacer operaciones I/O a archivos. Normalmente hay más puerto de finalización que números de hilos administrados. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Elevar el número mínimo de hilos&lt;/b&gt;, puede incrementar la performance y permite que la aplicación cree threads mas rápido. &lt;br /&gt;
Se realiza de la misma forma que la anterior: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNWE9h44iXM8tjBHmx3D5DwlfUpRKwvGubwPCHvqPpN0FkFSdRL9oE0v2onOfMFdWSMBgxXyRiR7EqmKUgRMVdb0dVvodiFF_6CmN_D6HXjlvd-YvKtgeCcNZmw6o1t7_mqVv4RPHjZCM/s1600-h/image%5B38%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;99&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOBuWrlh8arqZGk8sY4Kj7adsDVCerN5CgHn4vSXKVMacwQs57xIsXOAeEfndxrQK8QeAztzlcCnjfgGOOrD5SteA3Eg-VZyxV0MW6cQK9Oqa4R7vFc6nB354jPRi-4XeXZ8HBgqECaqc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;558&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;ThreadPool y WaitHandle (manejador de espera)&lt;/b&gt; &lt;br /&gt;
El threadPool también provee mecanismos para que los threads esperen manejadores (handles) y llamen métodos cuando reciban una señal: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge9HPj3zFwfdTDmivy1i_S-_qKOpqfH6TQLBTleRVCuJ8VrRKImhYXHedGSUG1IfSbSXNGNrAVqG7GZYhSx2Ix0No7o7AxF4MPZ9RtjJg8dxvvUN5TF1IivTRcgpTol4YnwtWP3LtUWBw/s1600-h/image%5B42%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;147&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxVl8R025yE5GZK9StABC5Dcv0p1l1YgQ9TqDcJvYU0rGQ0eGZfTFrY1b0cNMMmA8S9QFjP0MC4VUT1AykmbhlYxV1qYbqbLwo899vODb5ntCM83g04nXqC_xONgmasFU5eRBGc6UrNho/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;567&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Método llamado:          &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8DDsPWuLtjK-mMfW_F5SuTWk-mSTmdW8iYXjT06h9S1HKcl5k8pIow9jg7qW0eaTlVUdLx5aO1-UCOfKr3rpoBL8EUYZwbq1MPaAM98EcWvnMA56y7wIAOBIF9tk4YvRvxom0b9sm2WM/s1600-h/image%5B46%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;135&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVWy-G4oQMYW24ZmjtraZM7sRhyedO8sfCj9-4Lyq8j-hBnVOXoN_hDG6nMnXN-6iacJ3J2WRP7QVurwkVLh-EUFhynJjqHhdPlocfNpsQIo05EYVheE9XufV1OnL3O9ai9GlllVC3A5Y/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;446&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;La clase SynchronizationContext&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Existen diferentes modelos de hilos en Windows Forms que en ASP .NET. &lt;br /&gt;
Para tratar con estos modelos diferentes se debe trabajar con la clase SynchronizationContext, esta permite escribir código sin importar el modelo de hilos de la aplicación. &lt;br /&gt;
Para usar la clase SynchronizationContext, se debe crear una instancia, llamando a SynchronizationContext.Current &lt;br /&gt;
Después de esto se pueden realizar varias cosas: &lt;br /&gt;
&lt;br /&gt;
1. Llamar al método Send, que ejecute un código y este se va a bloquear hasta que el código ejecutado retorne. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivdmZ-zEfTIGJVK4ttsTvytjGoqGxRWENJ1JoSsSAoIPmWqEz9zucWjaEbrR5F5lij1GNm4I0PoaYHZiq0s-Tpm7xxncICC8aMPtKuy7tcFFgyYclONvvxLRmETJaKPJjW4KEaPoRcrok/s1600-h/image%5B53%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;98&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDkyIvEw66PEGrrX-_2ZpZUMPA04Do-YPrV9-uWtQxVpcP-4Ej8ujSQA1lCyC1wp82WzNWtqbzHMPaT5qaWJ_zyxiwp2ezyYl3-gyL6GndcMVOt7CzqaK1Qm7xPYODFP2xvJfzHVS_GGE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;566&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
2. Ejecutar el método Post, llama a un código, encola el pedido y retorna inmediatamente si es posible. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtOO_SFwMgj-RMSaRaS5IhXfhYeYuPrwe3znF25GSD_1Yke-8-RfvJmmVCoq_6_zCCKV6XISl_TbhtwPB6SV-Zj_ae5arGN8oi2mfw5TOQZyVcyd4JWftFN2k_lXpRiueftqcEBVpQxJs/s1600-h/image%5B55%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;89&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQGhwagBJpj_Rm_7i7d65mtJM7RU8jZ1_94db5eziwAyIW-EtWOhJnz3LoFUnpLGXIT5GcjBpgfHnCkh4Xr8hTtIIh-0aLePpbpvi4vxBL0CZyZUQ_ISR_x6IYUJy5atdcBLMUZBIrC1k/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;566&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usando objetos Timer&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Un timer es un objeto básico que se dispara una llamada asincrónica a un método basado en el tiempo. &lt;br /&gt;
Cuando se crea el Timer, se especifica un delegado TimerCallback que apunta a un método que se desea ejecutar cuando el Timer lo levante. Se debe especificar cuándo se quiere empezar, así como el tiempo entre firings (disparos). Por ejemplo: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiewKcvpX_sj3PyhZxd0YIL-wWID8CZXfqQZyGstaG0gGhne-_zvtm6-_z7_JSZcK8POldYuzfDjORCdIKM46PFvOSVrybE76jZc9gaGvdyMMBRJeBe_xqldpGThw1dCMEXBTj2grdVClY/s1600-h/image%5B65%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;34&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWYGjNz3bdKY_euAMnj_RGJ0tbcHCiGlzEfjs8h7Ya_8Ivkxg0gYIN6BfkO1LVYQ3cOg7e_n1zFKXGLc2Bb7DFgNMQerXosEgh2DMLzVHpvrUIO1eT0g_3x70dlAYCKGJGSr88Bh1Z2LE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;562&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5IfGUhu0WA_BGr_V21jx9pUAtcmT8RmivWnZI5HdvfrusFxGWY-wiasuKPJQWyNO6AU59-mMDx9EBtsDhMPo7_cgG_Mb-40TvuUU0qqEEwbK3ZQH1LXMXt0kJWkFA_ucHvjfM_fX9zFs/s1600-h/image%5B66%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;75&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAtj-8_uCm_f-KYNjzib4EVmdTblmEwKjjArBMLRQxJNboWaJolYFeYosQ473YNE0ne4wiGGHEv5nPflCmZgXcoXJZ4OBOzTQSiiz5EiwFJ3cEfSbQmYb_L90eF-_cfznQ53iuGbwPHAo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;271&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Eso va a crear un timer que se ejecute al momento (o) y llame al Callback (con el método TimerTick que imprime Tick) cada segundo. &lt;br /&gt;
&lt;br /&gt;
La clase timer también soporta el método Change que permite volver a especificar cuándo comienza y los intervalos de tiempo. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLhyphenhyphenf_S5XSzu1D1eL9zmVbzzsA-ndhcAeVFp9_J_x_HIYjG01izEk3SJ8KWnOlKnwuS6vafi-q5lI4OCr1rF7eDZxPo4-N1hm8XeFyZSalNNrbiDXT0fkl2jIQZ-D1raNiAcnVJw_nHOA/s1600-h/image%5B67%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;25&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9p8WQ-6z6iaE6yzop65EIkYn9QyRm9DZUmmMN_qxR-QGUjI0IirSTIGL1luxpFz6VLbZ4R8hW8wEVSG2HFkFVAg2CTJlfoo5VrOuq2U6ve-W4gS9ymr1yEye8BxjN1Smi-QPaw5FZl18/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;283&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Infinite, significa que a partir de ahora, se detiene el timer cada un segundo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.ziddu.com/download/14224384/Resumen70536-cap-07.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF &lt;/a&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;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;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;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; &lt;a href=&quot;http://www.4shared.com/file/imsbEwxH/Cap_07.html&quot;&gt;Codigo Ejemplo&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/5277305968860098261/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-7-threading-manejo-de_08.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/5277305968860098261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/5277305968860098261'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-7-threading-manejo-de_08.html' title='Capítulo 7 – Threading (Manejo de Hilos)–Parte 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyZPXOaek2p3XW_gv2cOV-NLil1fd_SHZgeNaO9K6SmaDlGf7EAyWV3d2FJIG1ImrcXO2ZjO6LIpzzsaGrWvexe7otnXMUgWZYOdytI5TmDvcteAAUTekfRvu35gbmx68A5X2x23Ax1OI/s72-c?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-5149584330068215755</id><published>2010-11-04T18:15:00.001-03:00</published><updated>2010-11-08T16:20:30.020-03:00</updated><title type='text'>Capítulo 7 – Threading (Manejo de Hilos)–Parte 1</title><content type='html'>&amp;nbsp; &lt;br /&gt;
El concepto básico de threading es el realizar múltiples operaciones de forma concurrente. Cada una de estas operaciones puede ser realizada en un hilo separado. Es muy útil cuando se tiene computadoras con múltiples procesadores. Cuando uno no utiliza threading en una aplicación, se está desaprovechando el procesador.  &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 1 – Creando hilos&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
Se encuentra en el namespace System.Threading de .Net framework y tiene los tipos necesarios para crear y administrar hilos.  &lt;br /&gt;
&lt;b&gt;Hilos simples&lt;/b&gt;  &lt;br /&gt;
Métodos y propiedades más importantes de la clase Thread:  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;IsAlive.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Indica si es hilo está ejecutándose actualmente&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;IsBackground.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Indica si el hilo está ejecutándose como background&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;IsThreadPoolThread.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Indica si el hilo se encuentra en el pool de hilos.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;ManageThreadId.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Obtiene un identificador del hilo actual.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;Name.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;nombre asociado al hilo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;Priority.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Prioridad del hilo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;ThreadState.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Obtiene el estado del hilo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;Abort.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Levanta un ThreadAbortException para indicar que el hilo debe de ser abortado&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;Interrupt.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Levanta un ThreadInterruptedException cuando un hilo está en estado bloqueado.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;Join.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Bloquea el actual hilo, hasta que el hilo termine.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;Start.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;440&quot;&gt;Setea el momento de ejecución.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Entre sus propiedades estáticas de Thread, estan:  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;CurrentContext.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Obtiene el actual ThreadContext relacionado al hilo actual.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;CurrentPrincipal.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Obtiene el usuario asociado al hilo actual&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;CurrentThread&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Obtiene el hilo que se ejecuta actualmente.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;Abort&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;puede dejar un AppDomain con un estado no estable.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;GetDomain&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Obtiene el AppDomain asociado con el hilo.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;GetDomainId.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Obtiene un identificador para el AppDomain asociado con el hilo.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;ResetAbort&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Cancela un pedido de Abort.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;Sleep&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Bloquea un hilo por cierto tiempo (en milisegundos)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;BeginCriticalRegion&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Indica el inicio de una región crítica.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;EndCriticalRegion&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Indica el fin una región crítica, donde si ocurre un Abort, puede dejar un AppDomain con un estado no estable.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;152&quot;&gt;&lt;b&gt;ResetAbort&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;447&quot;&gt;Cancela un pedido de Abort.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Creando un hilo&lt;/b&gt;  &lt;br /&gt;
1. Crear un método que no devuelva valor (void)  &lt;br /&gt;
2. crear un delegado ThreadStart y especificar el método creado en el paso 1.  &lt;br /&gt;
3. Crear un objeto Thread y especificar el objeto ThreadStart creado en el paso 2  &lt;br /&gt;
4. Llamar a Thread.Start para empezar la ejecución del nuevo hilo  &lt;br /&gt;
Método&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj96H8ofT_ho29hRtmxlSllCRY4N9zlwN3EIaY4uVv_E6t8UHtqj-xVr_eh4OK8WpQsYtZ-0Z7H1jryv4_X8mweCYXmXizS4Fb7VRbhHp_HpqY-y5A6X_jMOXYqXVo1pT6371yWNocEVfQ/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;71&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg18RDL_y3O2D07Y_8lE-4SBOCCSwBy3KP3SVmoe4EvRQRLO86HGLFpxakdz5v0pcSGLr9iN91v3TTlEgVki1Or5OfAjR9Y_9Ki0Yul8-iKLnS091UEM6davn1B8EOHKk82cNXGldIUCcE/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;561&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqkRQH9gLx-jKufBwiWVVLu-qmnwGCsk7TrepynkVBgRFwFSERBatC6vLdDyXSCTRZQXY-YBVOsOxVfFfgkCz9-2aL6GbTCaBK0WkzSaTeX-nN9Skcylv8uZVpY8mH2kEebjv_semXPM0/s1600-h/image%5B8%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;132&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKBsEgbTE9snWHjKIrrAHKDUSiw14AV_3LnbTyywg2LJrlR2Dnc3dnFjBfxymvgojMIOUeVFuoEYTUuLskrvyQ3p6vK9gtgEyOWMOdu19Kmh4Nv3-KE8_dB2atM0fsJsRmAVOtuz4XBro/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;429&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Al llamar al método start , se ejecuta el método trabajo simple , que imprime por pantalla la propiedad ManagedThreadId (prop numérica a cada hilo).  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF3XOUbWaK2YBcIx8URyNTbNyJRdVfu6nGYJXlI62D3YOKNCW6W8zjUaAQhNmcv_ZfQsdgFMSi_Ia0we-diIuoLZpiYsjgB8h1bqbFTDmp3-FU7JCteMxg77OK0RmFbHi8Xu9TrrFrzzk/s1600-h/image%5B15%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;22&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR-Ri0tG_7KLmDtizm54-xRocxH_zlPy59FsRTefotfTP7_hD3MMr-KJtyAIX38U-7VL7kFaYkvpS3wW9Vy6H4fkuvojEdiXyOAyzryF2gQDsPEpiyixooBIOEaSjw-54-AjDYL_n_-Ws/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;145&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;Usando hilos multiples (Multiple Threads)&lt;/b&gt;  &lt;br /&gt;
Ejemplo de creación de múltiples hilos y empezarlos a todos en un mismo trabajo.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6PN42Cxph1yBwh4lxFHYviNPFLOCHEEuGK4BEvlDbQACqnvRgJJW17wuI9oiGV83ND3a5ZC8mjKSyLy6CAr8hvuyv6AGv3AWD6s0saCH6qV0pEoTpoifuZZRwwZDK2fxgeyQ08OvoPcI/s1600-h/image%5B19%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;194&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI3-8UokUbP64Z3qNxskWAoIniHBarJ_YAI8yPf9UGe0cPVfqPqiCuN1dXyhdRsjZ5GgYW3UkRDRFasqPofg4mxnr6p3QLeonKvOn-29yoAkjeKI1zykcQp9KiHmzfSEG-XQScw7o2DqU/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;506&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Por pantalla se ven hilos consecutivos, porque el método “trabajoSimple” es muy rapido:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqwDTE-t74Xit0akMcE3LgIlYKjqYmqpyLVydoOmgXOyxumvMLh4bGVmoMvM4VVp0zbpNt2QsRq9KQ2O77uJCO82_hgr_jmfLqsnPZ0ovQxSpRbOLt-2klaxIISrEvsPQ7M4UMubwM-As/s1600-h/image%5B22%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;139&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHtLcSJmt_L-1QixFGkV-N4J7cJsJDTLUSYqCQJwgzBLbVEwJgAQtaSU4cjMQdlHUa9OjKyFNzv7ocrBS0xmBoqIIRalZli8CSJpfxluZ8gRqdu6UisczHiWg-nil9oXPJDGgQT8pjtYM/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;209&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Usando Thread.Join&lt;/b&gt;  &lt;br /&gt;
El método Join de Thread nos permite esperar por un hilo. Es decir, hay que llamar al Join del hilo que se está ejecutando, para esperarlo.  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Thread Priority&lt;/b&gt;  &lt;br /&gt;
El enumerador ThreadPriority , indica la prioridad de cada thread, tiene los siguientes valores:  &lt;br /&gt;
Highes, AboveNormal, Normal, BelowNormal, Lowest  &lt;br /&gt;
Normalmente, cada hilo tiene su información asociada y ésta es usualmente propagada a nuevos hilos. Esta data incluye seguridad de información, settings de localización (como el Culture del thread) e información de transacción de SystemTransactions.  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Pasando datos a un hilo&lt;/b&gt;  &lt;br /&gt;
En la realidad cuando usamos los hilos, se necesita pasar información y eso se realiza mediante el uso de un delegado llamado ParameterizedStartThread, este delegado especifica un método que recibe un parámetro object y retorna void.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEr3eNXtG1Co83FZJyHfxCXHudjHfyx3Dqkm4ossOYhDVtIse5l9WqNwk5O5vgXPox8QxSTUQdwGGHLnuWaopJy3Mc9gvkuIuwrWKS6Qpv67gv-e1P11UtHfRGBE3pAdKj2UTt64avxOM/s1600-h/image%5B26%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;142&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4RxfgTpWCpLVtDxlqXYPbns0xW5kHJBXO_xceuwa6GZbTWUUuTLsLjl5uynTIHJDyLfRnD8-5-jqGgoDfYzlbq7A3p2ZSotdM39sGg-edNThCniCScRvGlEZrd8aVe0kvzATSiTZDHDI/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;530&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Para utilízalo como punto de partida de una llamada a un thread se debe crear un delegado ParameterizedThreadStart que apunte al método y usar la sobrecarga del método Thread.Start que un objeto como parámetro:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlFIxGwRYA9-v6bufqubc9tXiNVo-w-MVUZGvYX63bWOeABZsjX44CCbogoPzoMLAqIdeWbvCsrVrfpd0DgOrK470i0Fw4wvCw0NaYATJTS548qGyB1ta6J2AsgJ0OCh9gl4KQJKURFmY/s1600-h/image%5B30%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;168&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihJyg-0aClGCyDU7h2kXlnpHP7Pjd-fZUvFQtn8rUEpzb2fvx63INMyN3apg_UkVBnQcCJS2cBAGp9lB1eIBXWDaAnG5zQXWpuj6p53t4Z-x7jvY9duhGWFf1RrF5gSyAFkK0iFrpJO0Q/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;523&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Se debe tener cuidado de que el objeto que se le pase sea un string como se espera. Sino levantar una excepción, ejemplo:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tW3A2jMhI4mBueK9xbrg4pteXpEb6dK4WTWArT331Thi6G7bX1D8FlQnuu3g1KPPdbmmQcQHm1K_WA7_syf-JIG5gRY_PYfQiez-nihReALh3JeDpmslxSQqofBP1VZmNa29UQXJ5h8/s1600-h/image%5B34%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;249&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixCtjDBji9zg_zq-ED6ZxOGYQ3k_LBcKZgCWUblvF-MbZaFyJuDGTwv0XB7exr5vBikghykjHkU7BV023zRt-1lTSTh46DTtvjdWCERY2aVsocQnHMbrbDmRjW5p1gHiF-iNqsRSsMchU/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;538&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;Parando hilos&lt;/b&gt;  &lt;br /&gt;
El mecanismo primario para parar threads es usando el método Thread.Abort.  &lt;br /&gt;
Cuando se llama a este evento, el sistema se prepara para lanzar la excepción ThreadAbortException (se produzca o no).  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiITV2Ffq3mh4LMfokNuJfmmUOXvL-iwpIb-BLLZDNH2Qf3FhsnzaArBIEl98p-nZjGy7VHVcJdTFoKL2AARbTHasrga-hBU_5R4zigHVGSxdrEBnE6_8kuAPQRSW09Swi0R4ergAzZNxg/s1600-h/image%5B38%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;144&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlOHYkvko4LBzr_Ef7C0ahZL9Y76O7Lr66Cn9BgOT_GfJc6GPBqplqbf9QzU72gV07dPpgYrsAP6DmuZ8xkq1I2aRw3AK1UGpYOvlzzYzfFzsA3Tf0lz5GuwxglGm9y1M_oz5FiJMhgdc/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;i&gt;Se debe colocar Thread.BeginCriticalRegion y Thread.EndCriticalRegion esto le indica al sistema de hilos que se puede abortar el hilo, pero &lt;b&gt;NO&lt;/b&gt; en esa zona. El código dentro de esta región, será ejecutado como si fuese un solo hilo.&lt;/i&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Ejecución de contexto&lt;/b&gt;  &lt;br /&gt;
Cada hilo tiene su informacion asociada y ésta es usualmente propagada a nuevos hilos (información de seguridad, localización, de transacción (SystemTransactions).  &lt;br /&gt;
La clase ExecutionContext brinda métodos estáticos para controlar el flujo del contexto de la información.  &lt;br /&gt;
Se puede suprimir el contexto con ExecutionContext.SuppressFlow, esto incrementa la performance, pero se pierde seguridad, cultura e información del contexto de transacciones.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuPx9vtnH9Q3mz7ThSw63L5cwqz_aeFoAJHaoJl4-Y0x1P2wiHRqoWkM88HWEcygBMjQ9lqRcStYGIbLWG9yxVF760gk2Tq-AeocXdF7AlJx7ySm3Pw68rnKkGbwqWElTQryE0Tjj1Jds/s1600-h/image%5B42%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;95&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5ta8oBdZg4gaad1qOj1Wzt21ew-zqk3C0cVhgHCWdiQY-km5PR3FAPvZsSu1qnH20vXccPm9Fq7ZYHkupME2uAlvkSkSCZFvlMWfcW5dSYcNiLFIClT1pztNkmuGKmuikG6p13nMVRg4/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;440&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Para restaurar el contexto, se puede llamar ExecutionContext.RestoreFlow o flujo.Undo():  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ1j2JCeTrl8QLgmKLOzf08Skpalzr_okE9bEJtNkqplvJ8OIJvYWM-F0wlWePhpLx16rzx0dyt1IfwD7czNNI_XdqIog_LZBa2v6lrVLdD5OvMPTnmaTBKmGFTH3Nbka0clJILi2X58g/s1600-h/image%5B45%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;76&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifN6z8HMPz3-ZmAN1DD-KuENhH21KMRiwE8qvyvlOg1AGT_DtmCBtYC_-vYDzH3E9RHJ-PkSPaWQieH6OBA2fcV-Z5nfCAI7UpKAv7f41Z0gjOFdhCE_o1N42VUOaMHhF3mlFUArM-kfo/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;234&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Se puede llamar el método Run del ExecutionContext, que permite especificar código en ese thread e información de uso. Para usar el método Run, se debe tener una copia del ExecutionContext (se realiza con ExecutionContext.Capture ).  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXnZIaGfhYBFBaXjN8me7Cp48aDOFXl2FTyjee542Xi8QRebs1QsLS3GS0frk6wE2ryhfH1uMXMtLKhyphenhyphenCvUu-IJGvoiK9gbv8t8Ofu3YZZLIJybWz0VnYSD7vYCd9COVr4M1Whqr4RWpI/s1600-h/image%5B49%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;91&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoGD_GTQsJ4ywW2BDd1tr7kfrwmEmSoVh9bXQhBbFq1fF5nALF2Wj9DY7YYbdD7t8hFHS6PVgv4YLFb9HinrYZod8vrAcEJBK6KO4spGfXGgqCE_FpB-wqHtXD1GnLjezlhOmZHZevAw0/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;488&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 2- Compartiendo Datos&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
Uno de los mayores problemas al trabajar con threads es el compartir información entre múltiples hilos.  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Evitando Colisiones&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
El problema clásico del contador, es que varios hilos pueden tener un mismo valor desde memoria y luego de eso, incrementarlo y registrarlo con el mismo valor.  &lt;br /&gt;
Al compartir información, esto se puede resolver utilizando la clase Interlocked:  &lt;br /&gt;
Métodos:  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Add.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;Suma 2 enteros en una operación atómica.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Decrement&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;Resta 2 valores en una operación atómica&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Exchange&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;Intercambia 2 valores, de forma atómica.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Increment&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;Adhiere uno a un valor de forma atómica&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Read.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;Lee un número de forma atómica (64 bits).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Synchronization Locks&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Permite sincronizar el acceso a los objetos en .Net. Para usarlo, se debe de colocar lock(this) en el método.  &lt;br /&gt;
Clase:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibT6Id64_JxmpjKTDAsLk2PR4rwlFq26uDOfh56KxNK16nMJXXNzN_2r7pKoOZ7tZryzaXj1e8c-EynopjTS7C0R88D_HNijEf-aNkqNVi1m_roGXd4KYacT4-GFqatvSFvuRkV_K0N3U/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;420&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9pW6esQvpxIATVRp_t-c5nQ0G7_3KzOgX_yWHFhMEvqhYDC03NO5Wd6zONGvCfrCPBlVjfdFj2GalDeN8sWtcIuNOoQUZ3tilWwA-m4MihgzCzgoAoAwAkAvMo0x59J_ayMghZyNbRqk/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;396&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Código para manejar la clase Contador2:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWi2V8ayUXysi1slUYj9uEZ_U4ccMUgJs-NhvI49kkjtZei_BEePD_4NroswfOEKhe2WgVycllEnLNaW-p3-z0L-S-jLxKXyFxbzsN2-1Sv5-8H9Tmgf5nE-jESBIaNVqJP4X7WorQ_5A/s1600-h/image%5B7%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;279&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1_JgwhjjsVIBbSzSNJcySXV3sJt2AagwhiB_eV1G5geGf-Nx3j-QxcsWZ6ex4sDe3YCG11_UrPo3cVnJ0HHi6hhM0Pw8Hfs0on3vTygjSQfhz2sE7SPew2b9FSLo7Qz5g0GUQsJWy09U/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;564&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Se muestra por pantalla:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ4yY_ixixpwQ90WcKHClfsKv2fOvl7G4OmggfIWVRPWbYvRjFPsMc7rRZt8obkBtY-SxPSoFLQjJZYeaIi5u2mQ8JBVee5Bqj6Dk-XSsIAEQvQwE83bGeBFHDm0R-WVbanRh-NnaRPtk/s1600-h/image%5B11%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;107&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVpRUo71xHRb_ghzdCEl6EXWW9sbAcX0BpMaMkjg0NZIHePUDDmjUPOjSjWI3NhRXPrzhiiVTb60TEe6lpKhNSWcNGw195AtB_ovhhIg8y_Fl6GS96SX_Yn73vy1CqF5zsReUkcOcR5oQ/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;408&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Para tener mucho mayor control sobre la sincronización, se puede utilizar la clase Monitor. Métodos:  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;&lt;b&gt;Enter.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;510&quot;&gt;&lt;b&gt;&lt;/b&gt;Crea un lock exclusivo para un objeto especificado.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;&lt;b&gt;Exit.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;510&quot;&gt;Libera el lock exclusivo para un objeto especificado.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;&lt;b&gt;TryEnter.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;510&quot;&gt;Crea un lock exclusivo para un objeto especificado, y soporta timeout&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;&lt;b&gt;Wait.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;510&quot;&gt;Libera un exclusivo lock y bloquea el hilo actual hasta que este pueda re-adquirir el lock&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Cuando se requiere una zona sincronizada, se puede modificar el código:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxzwgaQ3Ywc6TZ4tP0lvplvkY3nd2G-Ki-O6UchjC-XgZAMUE2ygz2kfZ6i1Q8-0Z-ywG0q8zz7wRzQtXPYoH5A7_NQ6JS2Y_oyBJj5y06pXlO64qqWR6K0w56ZmaGp-6UU8p3tVBVvi8/s1600-h/image%5B15%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;309&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2ovZv95wqsR2o6w6DBaHLqNA69BgN_u5fad-XqbCWOooALDhqcPowYOGoaaHfi5EcVtK70PfOMXJR1Z_HV7G_vT1pVA7EWrsaH1khVlWYgoav9KRgRN3AHy2TPFFoofgiHqFkjWE_Duo/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;354&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;i&gt;Aunque se resuelvan la mayoría de los problemas, se debe tener cuidado con los Deadlock &lt;i&gt;(cuando dos piezas de código tratan de acceder al mismo objeto pero se bloquean entre ellos para obtener los recursos). &lt;/i&gt; &lt;/i&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Otros métodos de sincronización&lt;/b&gt; &lt;br /&gt;
Además de la clase monitor, se poseen otros mecanismos de sincronización de objetos: &lt;br /&gt;
Clase &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/d1aawyz4.aspx&quot;&gt;ReadWriterLock&lt;/a&gt;: permite diferenciar entre las dos clases de código que usan los recursos. Bloquea el acceso a lectores y escritores por separado. Permite múltiples lectores para acceder a la información al mismo tiempo, pero solo un escritor puede obtener un lock en la info. Todos los lectores deben liberar su bloqueo antes de que un escritor pueda obtener un el suyo.  &lt;br /&gt;
Ejemplo de cómo adquirir un reader lock: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWU8U2sX4mWtB0jt9nix8YXkVS6hwWDQ8D9-NghKqB44FTM0AKvq4jBVAa8_3Pt-K9Aq1eNNv8VwQqwK0tA9qtlOdH_p3CQ3BZSxjcRPdD_XR5ziXWGIUNa67XBhxj8b4VnTQxYkSkigc/s1600-h/image%5B4%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;401&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNfZwMAoV9FQZjtEnfyqvAHhzTOR6HChKuWYs91QLGIBAskwfZyZnbXhe8wyy7noXdfvDjDfCJxetm0kIi0ErStvGAJjb0hoiZiVpta1wSdYExq0IeEpj4QyE8O90PASDFV8aeLf733bU/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;483&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Ejemplo de cómo adquirir un writer lock: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivzat8Wwh6sQm_oNkOZz51nrP3ViiXM0dQHMW5XL-TtrynZJJRpgIGaQCVmiA77AOHzX7uYuxSRmHT5MZ4hB38kxET3YWFYXWswcE59lGiGSsZSGK_wG26Jt3UknosixWRMDHzWpwwZE0/s1600-h/image%5B8%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;388&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF-_wYJfw_AYRDntQeDRI5FEzywxPLmKqgLDH_d0UoPWC5T3RPKB8JCnz1mV3ewWu1pV0fjkDWV_DNvocjsFqM8yFRrU1xR98jvV4yBqrVGIkCjFpHdmEdaFyUXzwAEjQrTq7ylSS80hc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;491&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
El ReaderWriterLock está diseñado para trabajar con las dos clases anteriores de bloqueo. También soportan pasar de un bloqueo de lectura a uno de escritura (UpgradeToWriterLock) y de este último volver al de lectura (DowngradeFromWriterLock). &lt;br /&gt;
El método UpgradeToWriterLock devuelve un LockCookie, es una estructura que el ReaderWriterLock utiliza para permitir el bloqueo escritor a ser bajado (downgraded) cuando se termina de escribir: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOLdvthms8rZmixum1uBQCwx7FFY5laIkIiqSMcwpv8ZZnCoZ3sl6RWREyb8rkPg975WIz7ySngOB-cZDnNL9LNzdEeR5xv9N8aRKPlDS7zm0IDwmSr_Z2Nf-rZ_3AlDFV12TS8QDrSZg/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;190&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgSzVUK56wz1lxNCJRP9r_dcQfPPSKjFc9G3O58JbwNpTc6wtNIE0pIyEXH91wzhv7-uQThwqD3dwpDKCJaJUkMrGFokw2Fhyphenhyphen8QAgVjVV3bfRdFHS-25TOumru2B1O23Ls5sJ7W5q4R9A/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;426&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Sincronización con objetos Kernel de Windows &lt;/b&gt; &lt;br /&gt;
A nivel del sistema operativo hay 3 objetos kernel que permiten la sincronización: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt; Mutex: permite la sincronización a través de AppDomain y procesos frontera (boundaries).&lt;/li&gt;
&lt;li&gt; Semáforo: es utilizado para dejar acceder a solo un número de hilos al recurso&lt;/li&gt;
&lt;li&gt; Event: provee una forma de notificar a múltiples hilos que un evento ha ocurrido&lt;/li&gt;
&lt;/ul&gt;Todos derivan de la clase WaitHandle, que tiene los siguientes métodos o propiedades:&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;106&quot;&gt;&lt;b&gt;Handle&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;486&quot;&gt;Obtiene o establece el objeto de manejador del sistema nativo.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;106&quot;&gt;&lt;b&gt;Close&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;486&quot;&gt;libera todos los recursos utilizados por el actual objeto kernel&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;106&quot;&gt;&lt;b&gt;WaitOne&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;486&quot;&gt;bloquea el hilo actual hasta que el objeto kernel es señalado&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Clase Mutex &lt;/b&gt; &lt;br /&gt;
Provee el mecanismo de bloqueo, muy parecido al Monitor, solo que tiene esa característica especial (bloquear datos a través del AppDomain).  &lt;br /&gt;
Ejemplo: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9x1ncGe-abEel6IVVABdScqaBL-37p-juIrwetou_ejEXdDxevbDcPixenL07dNLiM-VE5fSksJ3gZnxcbs6XB44rH2JssohpLbSMqWC_HJoPqEoMmbURd682rtWS-gLgBDhzAB6gLog/s1600-h/image%5B16%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;388&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8ZixqyFJgpIQUCt2tCsIho8aIeAka6sI5_MyjAcYnrMdXErXt6kfd8kkgzUja3HWSPBStcjeq3JYQtbuayuY-569S3qux-rrWNBS9EnMSp12zLFz0Fs3uDVPmq2q5wJLm5mLxSYTMeds/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;525&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para crear un mutex con un nombre con el que puede ser llamado después, es: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi21cNSLACz5BVXOLMG33klDd_WF5yMTse7JmAI1zx5gQpW3McA1MVjcpIpzcWAD5gE8TzZ6eoa4xxZjypFVKiSQKEaOW9viOXrWTccdsuhObQ3WB82hhvvWTKpz2-Vq0t5R-suMD2Gv9Y/s1600-h/image%5B23%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;50&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHwGFrcZ4DAXF_Lck2epIUSd7JzRse5VKmVPydX950V6KLSjRWEnHKCrsrjvenwi4B3J-Xa7JmOflLIJB30K-D8UQR-klUL10AS_zlGWhXtg6BIxg2L0006XtBgWBKs0cFmiEjF0WAkR4/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;370&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Y para obtenerlo:     &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZjA9BaDQRzQfeTVjB0Kv7zPR_Ji9BAHARS1QkevNMzzoUtJeOQw7zG7UbiGLI6_sosNbvYAfnhyaK_feNusoydjpqvRPg3W1zWjgWGT0AW7xvtPQgn-5OTqVa_vPWmKkSQZVukdY-bAc/s1600-h/image%5B24%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;42&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKnUfwj_Pu-5QKbf0Ol0-2AgzcKhvT6RNFVCm58ynNY77ja9X2m1KyQRDCYbOlR3zhvchNbbml2EVZLO6Cipp8bd_1t3BGWCfo6p4fssQW4_VPxB_1gn4kD1H9NnHwqgLuyTe2M5Wmxww/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;351&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Clase Semaphore&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Es usada para acelerar el uso de recursos. Crea un objeto kernel que soporta un numero de slots válidos. &lt;br /&gt;
Creando un objeto semáforo, permite especificar el número de slots usados y el máximo permitido: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihaOj-7D2doT5VQDAa7mnAnxJrQFm0ORTsHWf9lEGJgcsBTJQMKpYuy9Oe-1ifcev9s1BRZpW0hyHxP717OrGIuELlxsufMXglty5wCIA_C3cx6h3a8KNYniv_hbzGAxiRz-RnRcx4V9g/s1600-h/image%5B28%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;41&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgslWxyDjBiMPsgT8Wx_rmB-B6QZvdHzJBgnrQQ_Yg58veJhCSSe0p5BW_EIhRgNFfL_HIC14YV52C6YOm_JIQZciarq8g0zqDDdZSCehipfP-gBA1GgGFA_pniDdYPs7HNw4Gk_CRSNDk/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;558&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Cuando uno desea liberar slots, se puede hacer indicando la cantidad que se desea liberar &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7PRTUD4c-neSE5KII84u7GkWmaFN29JsS9ABrpm6cBdFC0kCdo9hBJFQHte8Ukk-gFdmAkg6LGZdncmwlOJuodDJJfMZd6L2qJ-j5UZPkmXBMYMD2Ka4vFOtB2hyINqhgC3inm2U3Bf4/s1600-h/image%5B32%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;38&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiePmvvwRARE_CqrJgR_M427l9-We3AVlPfF3NEGQIVjlCewsqMF30L55F9Pl1POAcaN5fZPp8ZJwufYk6KNur1HfrQjBDBEOBXokalg-HQF0iedEbasiHpZXr8kPgtBQjjZsmNSlc2OCU/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;288&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Se puede usar por medio de un nombre (de la misma forma que con mutex): &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjix7nWMy-GKrFMUyto66DCuTuNRSr0LkRIKIbkWR6jaI3W4to3XM0B8lsZ6RReaqyGUDzWeWVm_R4hQRG4cwJfMg52PUwiRpMCmzsNYQbEyo4vtHmVWJ24Uhcj3g0yUI2SGt-jnCr4udA/s1600-h/image%5B36%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;105&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_NGA3Ln3H3S_gVXkkhohcTTYGtowb-JMsnhbh-YMUn6jEaxqsC8UqI1JPpqY2ee-sTDXdhcxxSRryvXzSSLCS_LEZzgBTU5fGzfCSrgPywRxzt1FggPWyV87vLFXLCDkbv4_9eCzXnMg/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;378&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;Clase Evento (Event)&lt;/b&gt; &lt;br /&gt;
Es un tipo de objeto kernel que posee 2 estados, On y off. Esos estados permiten a los hilos esperar hasta que un evento es señalado para hacer algo.  &lt;br /&gt;
Hay 2 tipos de eventos: auto reset y manual reset.  &lt;br /&gt;
Cuando un evento auto reset es señalado, el primer objeto esperando por el evento se vuelve al estado no señalado. Un evento de reset manual permite a los hilos que esperan por éste para volverse desbloqueados hasta que manualmente resetee el evento a estado no señalado. &lt;br /&gt;
Estos eventos son: AutoResetEvent y ManualResetEvent. Ambas clases heredan de EventWaitHandle. Cuando se crea una de esas clases, se especifica el estado de la señal del evento: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8lTeW9gB_Gb5znce8wAUeoCbMOxirIi6dgwjF1w_iEYmTV8O2xR1ACrzc5CSqxlS1EEpuywWB2vMtrqxokb7lp0iCaMEnI9I9Otq2LLVTKe5r4yaGYOFX4EZ09E48iR2PBE8CsVUj_go/s1600-h/image%5B40%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;135&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLS0qIiTz1r8LMKxlynWjcviis3ndSTh17bmInuF_2pn6roxznN8fQmJ4s1Qt76Kdt6mUwhYYeY7rXHiKGTS3BUwanQ6m5GSKwJ-rCEnore7kAyyVr6Tu2DNgApU7AOl9zRHF11ujJu_g/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;538&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Como las clases anteriores, también permite colocar un nombre al evento:    &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3-ZxFnvkHSKXLewdNlXPYEB95zav1NvR3PF2Et4T0-csz2Eop4eJql4_EHjrM0sa5ntJnYndJIACZTLnQvbU7Mahyphenhyphend8sLJa1WpzGc9bhwZwEi87fXpj3IKJRrHYH-2bzUdvLq_2AG-l0/s1600-h/image%5B44%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;90&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnbMbjsqC5-BjVpw2RBFjAspkjR7oa8ImCXgULMZWwtrpSPAePuO4S4MlqYaIE6AubwUXDDDlPQAmNE5dgwkvJ1qNTbuh6VwM2lrI54jrCTwJNyok4ZquxjdLyC9vnGdSVAKHqfsLET70/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;547&quot; /&gt;.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;b&gt;&lt;i&gt;....................................................................................................................................................    &lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://vicrodg.blogspot.com/2010/11/capitulo-7-threading-manejo-de_08.html&quot;&gt;2da parte &amp;gt;&amp;gt;&lt;/a&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;.....................................................................................................................................................&lt;/i&gt;&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/5149584330068215755/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-7-threading-manejo-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/5149584330068215755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/5149584330068215755'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-7-threading-manejo-de.html' title='Capítulo 7 – Threading (Manejo de Hilos)–Parte 1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg18RDL_y3O2D07Y_8lE-4SBOCCSwBy3KP3SVmoe4EvRQRLO86HGLFpxakdz5v0pcSGLr9iN91v3TTlEgVki1Or5OfAjR9Y_9Ki0Yul8-iKLnS091UEM6davn1B8EOHKk82cNXGldIUCcE/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-92460273163178323</id><published>2010-11-02T16:19:00.004-03:00</published><updated>2011-03-17T12:50:07.175-03:00</updated><title type='text'>Capítulo 6 – Gráficos</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp; &lt;br /&gt;
Se puede usar gráficos para mejorar la interface de una aplicación, crear gráficos, reportes y editar imágenes. &lt;br /&gt;
&lt;code&gt;&lt;/code&gt; &lt;br /&gt;
&lt;code&gt;&lt;b&gt;&lt;span style=&quot;background-color: yellow; font-family: Arial;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;code&gt;&lt;b&gt;&lt;span style=&quot;color: yellow; font-family: Arial;&quot;&gt;Lección 1 - Dibujando gráficos&lt;/span&gt;&lt;/b&gt;&lt;/code&gt; &lt;br /&gt;
&lt;code&gt;&lt;b&gt;&lt;/b&gt;&lt;/code&gt; &lt;br /&gt;
&lt;code&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;System.Drawing permite crear gráficos o modificar imágenes. Cambiar de tamaño una imagen, crear círculos, líneas u otras formas, hacer zoom a imágenes, adherir copyright a logos o textos, etc.&lt;/span&gt;&lt;/code&gt; &lt;br /&gt;
&lt;code&gt;&lt;/code&gt; &lt;br /&gt;
&lt;b&gt;Clases:&lt;/b&gt; &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Bitmap &lt;/b&gt;Encapsula un mapa de bits de GDI+, formado por los datos de píxel de una imagen de gráficos y sus atributos. Un objeto Bitmap es utilizado para trabajar con imágenes definidas por datos de píxel.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Brush &lt;/b&gt;Las clases derivadas de esta clase base abstracta definen objetos utilizados para rellenar el interior de formas gráficas, como rectángulos, elipses, gráficos circulares, polígonos y rutas.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Brushes &lt;/b&gt;Pinceles de todos los colores estándar. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;ColorConverter &lt;/b&gt;Convierte colores de un tipo de datos a otro. Se tiene acceso a esta clase mediante TypeDescriptor.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;ColorTranslator &lt;/b&gt;Convierte colores a y de estructuras Color GDI+. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Font &lt;/b&gt;Define un formato concreto para el texto, incluidos el nombre de fuente, el tamaño y los atributos de estilo. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;FontConverter &lt;/b&gt;Convierte objetos Font de un tipo de datos en otro. Se tiene acceso a la clase FontConverter mediante el objeto TypeDescriptor.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;FontFamily &lt;/b&gt;Define un grupo de tipos de letra que tienen un diseño básico parecido y algunas diferencias de estilo. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Graphics &lt;/b&gt;Encapsula una superficie de dibujo GDI+. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Icon &lt;/b&gt;Representa un icono de Windows, que es una pequeña imagen de mapa de bits utilizada para representar un objeto. Los iconos se pueden considerar como mapas de bits transparentes, aunque su tamaño lo determina el sistema.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;IconConverter &lt;/b&gt;Convierte objetos Icon de un tipo de datos en otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Image &lt;/b&gt;Clase base abstracta que proporciona funcionalidad para las clases descendentes Bitmap y Metafile.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;ImageAnimator &lt;/b&gt;Da animación a una imagen que tiene marcos basados en tiempo.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;ImageConverter &lt;/b&gt;ImageConverter es una clase que se puede utilizar para convertir objetos Image de un tipo de datos a otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor. &lt;b&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;ImageFormatConverter &lt;/b&gt;ImageFormatConverter es una clase que se puede utilizar para convertir colores de un tipo de datos a otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor. &lt;b&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Pen &lt;/b&gt;Define un objeto utilizado para dibujar líneas y curvas. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Pens &lt;/b&gt;Lápices de todos los colores estándar. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;PointConverter &lt;/b&gt;Convierte objetos Point de un tipo de datos en otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;RectangleConverter &lt;/b&gt;Convierte rectángulos de un tipo en otro tipo. Se tiene acceso a esta clase mediante TypeDescriptor. &lt;b&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;Region &lt;/b&gt;Describe el interior de una forma gráfica formada por rectángulos y rutas. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;SizeConverter &lt;/b&gt;SizeConverter es una clase que se utiliza para convertir un tipo de datos en otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;SolidBrush &lt;/b&gt;Define un pincel de un solo color. Los pinceles se utilizan para rellenar formas de gráficos, por ejemplo rectángulos, elipses, gráficos circulares y rutas. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;StringFormat &lt;/b&gt;Encapsula información de diseño del texto (como interlineado y alineación), manipulaciones de presentación (como inserción de puntos suspensivos y sustitución de dígitos nacional) y características de OpenType. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;SystemBrushes &lt;/b&gt;Cada una de las propiedades de la clase SystemBrushes es un objeto SolidBrush que es el color de un elemento de presentación de Windows.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;SystemColors &lt;/b&gt;Cada una de las propiedades de la clase SystemColors es una estructura Color que es el color de un elemento de presentación de Windows.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;SystemIcons &lt;/b&gt;Cada una de las propiedades de la clase SystemIcons es un objeto Icon de los iconos de todo del sistema de Windows. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;SystemPens &lt;/b&gt;Cada una de las propiedades de la clase SystemPens es un objeto Pen que es el color de un elemento de presentación de Windows y es un ancho de 1. &lt;b&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;TextureBrush &lt;/b&gt;Cada una de las propiedades de la clase TextureBrush es un objeto Brush que utiliza una imagen para rellenar el interior de una forma. No se puede heredar esta clase.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;596&quot;&gt;&lt;b&gt;ToolboxBitmapAttribute &lt;/b&gt;Se puede aplicar un objeto. ToolboxBitmapAttribute a un control de manera que los contenedores, como el Diseñador de formularios de Microsoft Visual Studio, puedan recuperar un icono que represente el control. El mapa de bits del icono puede encontrarse en un archivo por sí solo o incrustado en el ensamblado que contiene el control.  &lt;br /&gt;
El tamaño del mapa de bits que se incrusta en el ensamblado del control (o que se almacena en un archivo independiente) debe ser de 16 por 16. El método GetImage de un objeto ToolboxBitmapAttribute puede devolver la imagen pequeña de 16 por 16 o una imagen grande de 32 por 32 creada mediante un ajuste de escala de la imagen pequeña.&lt;b&gt; &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como especificar el tamaño y ubicación de un control.&lt;/b&gt; &lt;br /&gt;
El uso más común de System.Drawing es especificar la ubicación de algún control, cuando se está creando de manera dinámica (por código). &lt;br /&gt;
Para realizarlo se crea un punto al que se le pasa dos parámetros (distancia desde arriba, distancia desde el lado izquierdo) para setear la propiedad &lt;b&gt;Location&lt;/b&gt; del control. &lt;br /&gt;
Ejemplo &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZzXiNr0GRy_CODNfVc8QnumBMY8GxvNidtpexD2K7YksVDi_piOu4NUPxKnv0c6Rz4iWs2OOjmNqzFBbYQ8NXxQ8zNTc1JlKCHxlAwxvXwtPI6sh3hfZBFyyb5jYuGzwEuImZJp-b3m0/s1600-h/clip_image001%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image001&quot; border=&quot;0&quot; height=&quot;24&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib3ruOzvZdNa2JJkxAXsaANviBkHL-gZzW-6qC_SZ0um_p8FELaeI36Ifj6uVN_ostsESxDMuQ4g58KbMLIygY3OOu5wXLqD7T7uhoRkd4nsRdMYA-Yg_17Z3QmWj_V0QqS1esSF9wevI/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image001&quot; width=&quot;336&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Una forma alternativa se puede setear directamente las propiedades left y top del control. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYBYwY7y14-N9hsjMsC2N0BC54AjzKfxUieva0AQU0vbljc_R1RL_Due3hb5pqdYFquugnYTkAE2Bj4gVAd8YUQLH3sh7T-WBF8CT9Z0iYaVgL1KEyyAeSgCzJfZoYMU1VignSsLvqjOQ/s1600-h/clip_image002%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image002&quot; border=&quot;0&quot; height=&quot;45&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilXkLW9fcP967OifF4KrLkKehWdGbLSSRRxJLkk7PMO1SuBLXLubJ2ijKuv7TBby7o4yt94_LJ0fL7UyyY-8C3XYH7uK3hbnwbcnNmlPjaSTCGygCPErl7WkZRUIGhoPi16MWbtwkGs9w/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image002&quot; width=&quot;141&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
También es posible especificar el tamaño: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ7bTInCxQmsEOQ0pBQ3EOmFXdUtHisjEsefQfODVJHf-g5M83_R5Iy_SwOhh_rs5xANYjz51UVGKPQtVlyHE8SNdNKHng0ZCXZlBz71T8w9WIipub73a2CNZe9ac1eJ7SdcRqJ6YlXhA/s1600-h/clip_image003%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image003&quot; border=&quot;0&quot; height=&quot;31&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit-3AFkRqs-3tFIxfsrIpUHkFrZUaI44nG-X8IoKo6c4Bt7QyvjhqULtEo-xq5XMUr0XAvapn-3TciongmljaII3Ho6j5Cr2EZ3WZnKK2b44qOZQK2DE93Mn47-HukBnzixMs-XlNlfHA/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image003&quot; width=&quot;239&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;Como especificar el color de los controles&lt;/b&gt; &lt;br /&gt;
Para modificar los colores de un control, se puede utilizar la estructura Color de la siguiente forma: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3clYtkIIQKlW81dS4rtNi14HEPEHmbeJVDGaQBXrOs1qhYb4jqrVAigTuFYxmH-ogqaxP4w_FeqBI0R-Z4nh3TYy4GznAc_afkqL5QVnC07OS9BLtRsoZGx38TejhugMXh18mt_vX49U/s1600-h/clip_image004%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image004&quot; border=&quot;0&quot; height=&quot;91&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGNHAz4Hbor62lpv2vHUiRPCMcU74xqU9D5gx1qS-oiolmusLwqTSyLM8bJDvOHFV-ELfB_R5D5e8q5mLIYcTRkzMKNk5YPXH7rVpU2mtCsEUh4RigI5lNn7Z1rFeVBLTYxlF2RhISMZc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image004&quot; width=&quot;231&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Si es que se necesita especificar un color personalizado, se puede utilizar el método Color.FromArgb(): &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYfosKMVnhR0p-dghNYU7bL5OBNfOvasHmzW1tXq4DkdpTXvfc1DCM5jXHaXStBKEjjts93tWi5SHdze8hh_AqGH0bKV3wLOFihtu6wdDcRx7iuawODee7qy8ZEXsCeIPWsGVNQHTxek0/s1600-h/clip_image005%5B6%5D.png&quot;&gt;&lt;img alt=&quot;clip_image005&quot; border=&quot;0&quot; height=&quot;39&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYfod3EwipYamra5TEiCqCfe_uyi8fpimiXiiMtkyyNfsC08PzdmWiF4HKC590ZU4QeKBQ6dXZFNVRDd1_rt4Dr4FdKTkzpWTpPUM-CN7agm9VewpKxf6PPd0aeM3Nw5l5oZHQFgpwFVw/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image005&quot; width=&quot;422&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Como dibujar líneas y formas &lt;br /&gt;
Para dibujar en un formulario o en un control, se deben de seguir los siguientes pasos: &lt;br /&gt;
1. Crea un objeto Graphics llamando al método system.Windows.Forms.Control.CreateGraphics &lt;br /&gt;
2. Crear un objeto Pen &lt;br /&gt;
3. Llamar al miembro de Graphics para dibujar en el cotrol, usando el Pen. &lt;br /&gt;
Una vez que se ha creado el objeto graphics, se puede utilizar muchos métodos para mejorarlo como&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;Clear &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;441&quot;&gt;Borra la superficie de dibujo y la rellena con el color de fondo especificado.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;DrawEllipse &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;441&quot;&gt;Dibuja una elipse definida por un rectángulo delimitador especificado por un par de coordenadas, un valor de alto y un valor de ancho.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;&lt;b&gt;DrawIcon &lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;441&quot;&gt;Dibuja la imagen representada por el &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.drawing.icon%28v=VS.80%29.aspx&quot;&gt;Icon&lt;/a&gt; especificado en las coordenadas  &lt;br /&gt;
Señaladas.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;DrawIconUnstretched&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja la imagen representada por el &lt;b&gt;Icon&lt;/b&gt; especificado sin transformar a escala la imagen.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;DrawImage &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja la &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.drawing.image%28v=VS.80%29.aspx&quot;&gt;Image&lt;/a&gt; especificada en la ubicación que se indique y con el tamaño original.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;DrawLine &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja una línea que conecta los dos puntos especificados por los pares de coordenadas.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;DrawLines &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja una serie de segmentos de línea que conectan una matriz de estructuras &lt;b&gt;Point&lt;/b&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;DrawPath &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja un &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.drawing.drawing2d.graphicspath%28v=VS.80%29.aspx&quot;&gt;GraphicsPath&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;DrawPie &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja una forma circular definida por una elipse determinada por un par de coordenadas, unos valores de ancho y alto y dos líneas radiales.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;DrawPolygon &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja un polígono definido por una matriz de estructuras &lt;b&gt;Point&lt;/b&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;DrawRectangle &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja un rectángulo especificado por un par de coordenadas, un valor de ancho y un valor de alto.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;Drawrectangles &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja una serie de rectángulos especificados por las estructuras &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.drawing.rectangle%28v=VS.80%29.aspx&quot;&gt;Rectangle&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;156&quot;&gt;&lt;b&gt;DrawString &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;443&quot;&gt;Dibuja la cadena de texto especificada en la ubicación especificada y con los objetos &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.drawing.brush%28v=VS.80%29.aspx&quot;&gt;Brush&lt;/a&gt; y &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.drawing.font%28v=VS.80%29.aspx&quot;&gt;Font&lt;/a&gt; especificados.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Para especificar cualquiera de esos métodos se debe proveer una instancia de la clase Pen. En el constructor de Pen (lapiz), se especifican el color y width en pixeles: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBWOPqjUJL21Oyxk9VaNnAQXT5yjDG7rI0Zi2LO8bvC60EFWwjgYwFcapLhZNiEwiM80Ty9agozTD3_IZWOVL_iaFYI9i4LHTWSrIH4aohz9p9IK2qwwfgNinGGFDp6eRcVFnKa-5gRPo/s1600-h/clip_image006%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image006&quot; border=&quot;0&quot; height=&quot;162&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7Inm55zsx8UqqXijEFpQU0PJQbsI366OWWcqKpcXobSwOq9PBMcIILi7dOiUeR3H9QfmBN5RDmrbI9pfsv9N5APx8-XZDrNlhbxyNYkg_2w0LyruRhnM47_yHb1FlmmGpR_uesWX6AW8/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image006&quot; width=&quot;471&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Métodos como &lt;i&gt;Graphics.DrawLines, Graphics.DrawPolygon, Graphics.DrawRectangles&lt;/i&gt;, aceptan arreglos de puntos como parámetros, para crear figuras más complejas. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Como personalizar Pens?&lt;/b&gt; &lt;br /&gt;
Además de controlar el color y el tamaño del pen (lapiz), que se especifican en el contructor, también se puede controlar el patrón y su endcap. Endcap es el final de una línea, pueden ser utilizados para crear flechas. &lt;br /&gt;
Para crear un lapiz que dibuje líneas punteadas, se debería de setear la propiedad de Pen.DashStyle a uno de los siguientes valores: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· DashStyle.Dash (guion)&lt;/li&gt;
&lt;li&gt;· DashStyle.DashDot (guion punto)&lt;/li&gt;
&lt;li&gt;· DashStyle.DashDotDot (guion punto punto)&lt;/li&gt;
&lt;li&gt;· DashStyle.Dot (punto)&lt;/li&gt;
&lt;li&gt;· DashStyle.Solid. (solido)&lt;/li&gt;
&lt;/ul&gt;Ejemplo &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga7Wy1oyMlPQhTYxPmxal-BDtDXY1cHxABW0WhfEq8m5fd0xr-dKQiGBPjmzSMmQPiTH9MFUmtGTH-5zuuXABo79eIgRiBhMs2nd2WjaJiLcKt0y3zMCkCaY_yjj2YAPHi4YPgi64AeIo/s1600-h/clip_image007%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image007&quot; border=&quot;0&quot; height=&quot;40&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5gXZRGpqgjhhioefzr-6uKX0uBHKqWcJ4cWjUWP7VTCX3ngHtLoQ_GNb-qQDG-EAuu5w_6btzEkQrm7uhfjEMYXCgdo-FfY_au8mnB9Z4B0hvex6Ve32ryA6PAyZkkWPotmbL9SWZgDc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image007&quot; width=&quot;372&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Tambien es posible utilizar Pen.DashOffset y Pen.DashPattern para definir patrones dash(guion). &lt;br /&gt;
Para crear flechas, uno debe de modificar las propiedade Pen.StartCap y Pen.EndCap, utilizando el enumerador LineCap, que tiene valores como:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;· LineCap.ArrowAnchor&lt;/li&gt;
&lt;li&gt;· LineCap.DiamonAnchor&lt;/li&gt;
&lt;li&gt;· LineCap.SquareAnchor&lt;/li&gt;
&lt;li&gt;· LineCap.Triangle&lt;/li&gt;
&lt;li&gt;· LineCap.Flat&lt;/li&gt;
&lt;li&gt;· LineCap.Round&lt;/li&gt;
&lt;li&gt;· LineCap.RoundAnchor&lt;/li&gt;
&lt;li&gt;· LineCap.Square&lt;/li&gt;
&lt;/ul&gt;Ejemplo: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOl2_AVHx5ljcgi9buvfkDv6lUuucKfLZfP5pJktxrwU8sDTvYtsCGgP5evinXIB3EQCZctHysD-U4AN62ht1s05JS7zM5B1mypFTzrCLM9Lm1gax7wPqEpc0O67HUYGGIazuoIrxyTZs/s1600-h/clip_image008%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image008&quot; border=&quot;0&quot; height=&quot;102&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg43l5eKean5oZrmdrxeMXUxYnqGs3mzG25G8XmQrTqKs0228NhzUHII6qbVcv-uCHVXDbqhhgww89939tyLQ74zJYOGLSw1kPm0ojysq8bWic_p9PfeGQ5-ntC3wVLHpkghE56JQ2WinQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image008&quot; width=&quot;419&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como llenar formas?&lt;/b&gt; &lt;br /&gt;
La mayoría de los métodos de la clase grafics tiene también un método llamado fill que dibuja una forma (shape) y la rellena. Estos métodos requieren una instancia de la clase Brush, la cual es abstracta, entonces se debe de instanciar una clase hija:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;&lt;b&gt;System.Drawing.Drawing2D.HatchBrush &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;&lt;b&gt;&lt;/b&gt;define un rectangular brush con un estilo hatch&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;&lt;b&gt;System.Drawig.Drawing2D.LinearGradientBrush &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;encapsula un brush con un gradiente lineal.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;&lt;b&gt;System.Drawing.Drawing2D.PathGradientBrush &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;igual que el anterior, solo que provee un llenado más complejo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;&lt;b&gt;System.Drawing.SolidBrush &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;Define un Brush de un color simple.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;&lt;b&gt;System.Drawing.TextureBrush &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;299&quot;&gt;define un Brush desde una imagen&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Ejemplo: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtt8ypdw8ZPuCqDcEYLaPpF0hiQ4jxNAB66fIcc4fH5jzJeps4MLtueDIHoOLcnKScUTapAY_xEQjFR9lDf9EZgDAvPK2TLoZVVOh-pkMildWYQxsPuA7NoEBjxI4rFSSf3YhPiIhiqI4/s1600-h/clip_image009%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image009&quot; border=&quot;0&quot; height=&quot;149&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp9IQHSb_bIygpUr7FLWWiN4cJ0ERAYUSr3BR-inOmNtARCwCG5AeXAuYL2KdH0FvvmEL7QcPOSJST9O1QZeigrKK2MPxr15QAX2fodSXMHnNNFDeX0xuAyCqt_Th3KzoexDkYK7iiAdE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image009&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 2 – trabajando con imágenes&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
System.Drawing.Image es una clase abstracta que permite crear, cargar, modificar y grabar imágenes, como BMP, jpg o tif. &lt;br /&gt;
La clase Image es abstracta, por lo tanto se debe de crear una instancia usando Image.FromFile, el cual recibe como parámetro un path a la imagen, y Image.FromStream, que recibe un System.IO.Stream como parámetro.  &lt;br /&gt;
También se pueden utilizar dos clases que heredan de la clase Image: &lt;br /&gt;
System.Drawing.Bitmap (para imágenes) y System.Drawing.Imaging.Metafile (para imágenes animadas). &lt;br /&gt;
Bitmap es la clase mas usada comúnmente para trabajar con imágenes. Los diferentes constructores de Bitmap, permiten crear un Bitmap a partir de una Imagen, archivo o stream, o sino crear un bitmap en blanco con un height (alto) y width(ancho) especificado. Bitmap contiene 2 metodos importantes que la clase Image carece: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;GetPixel, el cual devuelve un objeto Color, con los colores de ese pixel.&lt;/li&gt;
&lt;li&gt;SetPixel, setea el color de un pixel.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como mostrar imágenes?&lt;/b&gt; &lt;br /&gt;
Para mostrar una imagen guardada en el disco, se debe utilizar Image.FromFile, crear un control PictureBox y usar la imagen para definir PictureBox.Background: &lt;br /&gt;
Por ejemplo, para mostrar una image: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgrMo225nwYM2flkOpREK1viXVZc6vHj_Z6KjhK0ozrxxJCyJRR7pNOImxRAFcCuiC8bwMpJQkrA3JxbuOGqjUW2wguDp2aVBFl2tGvL5D4N5CGaBUS2wOjCT7aFa2ir1C9Xcuhdnu62o/s1600-h/clip_image010%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image010&quot; border=&quot;0&quot; height=&quot;123&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7y9Ke5Ai6nHTlcmSfVqI9O2TMzfyZKdWHhJH9ZWdU0UDkYWdTRdaoH4y4XjHw5H9TRZUZ4nyLB_N2PxqObZ-uCslmQCU1B3I6hNJu605QbXmSHWP12cIZY_jZ8lUfH1_4CaP0L21f8Pc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image010&quot; width=&quot;546&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para colocar una imagen como el fondo de un form: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzhhxLCsSZSbmpyZJAxAAij8BUWzCtadIbqObMsOyG1oTQbn2X4dM6PeDS8vYgsx1eaxTyHe7iNTcc4VDOzjXA4gWO0z_hG3ANlBKkWT_-Q5-kT1bOhzy1cgppfFy0zkHVKyfwkkhisAM/s1600-h/clip_image011%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image011&quot; border=&quot;0&quot; height=&quot;76&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrdWo6jzim9n0K0k-zEgPdAkb0LPjmiFn5thoYb5Teqna7NStxxZge0BuDTXTcIn912htgBRfBjAU9Ncq5_owTdwR-64cp-ChPGSkbASs4hWH9DhrJGd6Ae3Jwk3bbqWq3K_MffHtQ5Ao/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image011&quot; width=&quot;544&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como crear y guardas imagines?&lt;/b&gt; &lt;br /&gt;
Para crear una imagen nueva, se debe generar una intancia de la clase Bitmap (uno de los constructores que no requiere una imagen existente, con el método Bitmap.SetPixel o editar una existente usando Graphics.FromImage). &lt;br /&gt;
Para grabar una imagen, el Bitmap usa su método Bitmap.Save, ( que recibe como primer parámetro el nombre del archivo y como segundo el formato en que se desea almacenar la imagen). &lt;br /&gt;
Ejemplo: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNjLPI193Umi7d1I4y9VKpNkD6jFL65GJ8AuoL5WdoQHgGAB83ZVmhxMtb1zn_Nr4ucK0MCHcqBCpmFrL6yt_Sze0A2Ppe7ipSJ810yLehrS6CDs_9Nd86kFoQwHet69mH_JsdHQmCb4o/s1600-h/clip_image013%5B5%5D.jpg&quot;&gt;&lt;img alt=&quot;clip_image013&quot; border=&quot;0&quot; height=&quot;173&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM9lu6nhTY8_ywRW3uL12lm8NH3NEL6zakuXi6WZY40_cO-knv_Kazpt0U8YCreC2BRAeBWnJoZbE8FTmhnTqNghTr8DuwIGAEDhRlu1bADrdddn4AEpIljnmEBRSTHgCewCkO3f4V4Vo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image013&quot; width=&quot;545&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como usar Iconos?&lt;/b&gt; &lt;br /&gt;
Los iconos son bitmaps transparentes, de un tamaño especifico, para expresar el estado en Windows. Una forma simple de agregar iconos a un form es con los métodos Graphics.DrawIcon o Graphics.DrawIconUnstretched: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4A24KJbMgpt_ALRcNAa7-h5zq0i_iGHY0P84SK6bDb_QCYtnlxamobN58Uy8lSwAGL0dSScVKNOWv2AV3K5cuRxpvQaBW3fxAlSG9JdFCdxCTDP8iAOTxXQ0joixvF_LZgf8bjrbLjXA/s1600-h/clip_image014%5B6%5D.png&quot;&gt;&lt;img alt=&quot;clip_image014&quot; border=&quot;0&quot; height=&quot;48&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUOXeYqPo_S5vg4YwNrBtktZeViQbnskbSAf14vOOR9KcdU665Diuwn70-qdY8tnJLt_YLAT4qY0NAuOg5a8CV-1O16gZO0GtJcutRe4Eyokn2P3HUaW37bm8P2KCprqI7knYpHy_peOc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image014&quot; width=&quot;308&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
O  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3SSF6Su_FX8novL8nl058j06swDuZIDfWguCZK8T6IJPxwEmRx02zUdnlx0QRK0UEBd05j5onVbJV1msVM7Iegzt9xkZBKY-nvB1_Vht7PX_-fCkz0KwRa6U-UI9ApDgSR97zdL383SI/s1600-h/clip_image015%5B6%5D.png&quot;&gt;&lt;img alt=&quot;clip_image015&quot; border=&quot;0&quot; height=&quot;41&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGWsw4q7bHEo8L9PlmVJ2dpQLNmV2VwxCrd0fGuh9KWLElSaeKfOspYc442Pk5n3VgWujmqKhKkQ5zYSE5uI4xvaorWH-3RPDjptjyFbAS5rLiGTIV0hnombWc11py-TzkSYFZYMxM12k/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image015&quot; width=&quot;504&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Se puede editar un Icono, llamando al método Icon.ToBitmap para crear un bitmap que puede ser editado. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 3 – Formateando texto&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como adherir texto a gráficos? &lt;/b&gt; &lt;br /&gt;
Para agregar texto a una imagen, debemos: &lt;br /&gt;
1. Crear un objeto graphics  &lt;br /&gt;
2. Crear un objeto Font &lt;br /&gt;
3. crear un objeto Brush (opcional) &lt;br /&gt;
4. Utilizar el método Graphics.DrawString y especificar la ubicación del texto. &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como crear un objeto Font?&lt;/b&gt; &lt;br /&gt;
La clase fonts tiene 13 sobrecargas de su contructor, el más simple es pasarle la familia de la fuente(string) ej: “arial”, el tamaño (float/int)y el estilo (fontStyle). &lt;br /&gt;
Ejemplo: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvs0VbfwxiyThAFybrDtV7sbd3zO4elvUnyqavt7quxbpZST5iIkASdBxtNAr3iLTSF5D2wNI17QzdD_E7saYHosc6r2fY4j00j7yf_PYuAmyzHzvs4wA22h2kCmCh-ZIczY06Nlhkobc/s1600-h/clip_image016%5B6%5D.png&quot;&gt;&lt;img alt=&quot;clip_image016&quot; border=&quot;0&quot; height=&quot;32&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgTzTzqATUlnYVRUwjfLaC19A75PsEfI9rgkWKhmu9VZGOg5ooFVmdemA8KnWBKY0U2QvKvqx3TPfQazgajzPWdAVkDget0j-4FpzDeyQiUMR5bTgNXcdttMxdTrZIESjjrbvtO28f3H4/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image016&quot; width=&quot;343&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
O pasándole un FontFamily &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJe06_beSCY9FPCg7CxdGPwRndoG3rfNp2U97kvCEmf7MrZy6nVEhKJvE1aBRnb0HQoingsYmWuPX0r0u1x_7g2HjOgkk5bAXDOdLOlp6oAgcYkBQ6zWCTa3s3y2V-QGb5dFfS7jzYv9U/s1600-h/clip_image017%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image017&quot; border=&quot;0&quot; height=&quot;32&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDKZlBBP8fM01gylX7DHs_a5E8mxSlRw6CGzAPQOp4Yle5incWeHGx5R6e__nN14nEB_OmQp5wPhvR4js07Yr_H4qb6WIy1BG_DChCK7NmlSnd9qHreyEahWiWhh5I_6IE4qcufTFjDgU/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image017&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Y si necesitamos leer el tipo de fuente desde un string, se puede usar la clase FontConverter (no es muy recomendada porque puede generar errores) &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOy7dNqFNzqFSflmvIR4QgpTFXULTXRQo7B-Q-clq6pTczlVF8QL7lNfWIP90q4rtV1Je1jz651ONC59tETKEQiwgA4XBklqeRHFZPApZ33mSkIZ37GSY5FN-Fxi01lGad3A5xO0TzXFE/s1600-h/clip_image018%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image018&quot; border=&quot;0&quot; height=&quot;44&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghfB0Wv_MRFWmh2vv994PSzkFUhFlQbA-fgEJYdD1lFfYnqhj-xgE1OP19kMjy0viDZ2V8Sy_BH-8yW5Q-jNgjRyzdSM3J-9SQY7u4mfOdgQHTS_rsCo5_dnKouT0qFSRwl0aVnepSHgo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image018&quot; width=&quot;423&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como escribir texto?&lt;/b&gt; &lt;br /&gt;
Después de crear un objeto font, se debe crear un brush para definir cómo se va a rellenar el texto. Para agregar el texto a una imagen se llama a Graphics.DrawString: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1JC-fCLsS2HcQ5NdHJGmTO1qlfNB5SuoQebanmSBGvcFE13MbP10sGlBtDfCAU2YGICKmtEAxUtKPC13WwsKtCJPvSvUwRwXXb8WDc0hGNxKMMXNjd0TEcVBplZzMDe4RC_3sPmanj_o/s1600-h/clip_image019%5B6%5D.png&quot;&gt;&lt;img alt=&quot;clip_image019&quot; border=&quot;0&quot; height=&quot;55&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKlmqKGpP7_FuVDU2cMQG_9eNZA5-_Z9nhrKVvt8UEjqzan48JMDDvGNr8BTgcOJ5N5rtpNjwpL3NHvzXEv6mkXUv1Vw0NstDH_1UO2jCe2zkxEo8XQZWLHvYb2MUwodX5MhT0pxX7yZE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image019&quot; width=&quot;361&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como controlar el formateo de texto? &lt;/b&gt; &lt;br /&gt;
.Net framework brinda control sobre la alineación y dirección del texto usando la clase StringFormat. &lt;br /&gt;
Los miembros más importantes de StringFormat son: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip7sh-wKc2hlwWZvbAP3SKo0TXqJsQlOBOHXafU-JkEcSg9MsIT6150WoqP85JghrCTr6f8byFWlBQoC8szycItrkN1MtppA5tTd4kjCPAvdf6zo6tQs7hir2JWiLPvPwTjAdUjVdmSIA/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;574&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSqdH3U9IvjJJIviTlP6vE5edNiW6L5FZMxaGUtpG2WUa8nh-o0bo9b28VbnIN2AoPSDbErLoF2CLuTjRVpiiNTwxmz6k3m3w0SSRJH0xwNpUVVVHGhGXiurZsDpI-TF5hxmD6ciIRtB8/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;562&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Ejemplo de utilización de StringFormat: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0jPDtOlUzCS2u54s8t3GJMfjfYDKRmC3p_mKs165QbMJrMnPrWJRIsfAKwFbogKy7PwaCXWxEfcUtmlmd0e34d7EWSHZHxMD5c0wdyaw3olRNy3yLbI4RiT4cQNoJxA-0OLD-ZqiQ2s0/s1600-h/clip_image020%5B9%5D.png&quot;&gt;&lt;img alt=&quot;clip_image020&quot; border=&quot;0&quot; height=&quot;312&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq1vxia77ipElDtJb4cyPTMmFfGN_LL5UgQqzKoKUn7OobUzvYuWmC19R5I5KHMR2hh2asbydNMBhh02TzjPnMDgwmTuj22BrtBOeBl5Jy3eWx-vcopyzsBskn7iKGtU7LsHJ7aV1v3hI/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image020&quot; width=&quot;554&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.ziddu.com/download/14224383/Resumen70536-cap-06.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF&lt;/a&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;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;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;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; &lt;a href=&quot;http://www.4shared.com/file/TUVU2Psx/Cap_06.html&quot;&gt;Codigo Ejemplo&lt;/a&gt; &lt;br /&gt;
....................................................................................................................................................&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/92460273163178323/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-6-graficos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/92460273163178323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/92460273163178323'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/11/capitulo-6-graficos.html' title='Capítulo 6 – Gráficos'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib3ruOzvZdNa2JJkxAXsaANviBkHL-gZzW-6qC_SZ0um_p8FELaeI36Ifj6uVN_ostsESxDMuQ4g58KbMLIygY3OOu5wXLqD7T7uhoRkd4nsRdMYA-Yg_17Z3QmWj_V0QqS1esSF9wevI/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-771476506573439840</id><published>2010-10-29T10:40:00.002-03:00</published><updated>2011-03-17T12:47:34.879-03:00</updated><title type='text'>Capítulo 5 – Serialización</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Muchas aplicaciones necesitan almacenar o transferir información almacenada en objetos. .Net tiene varias técnicas de serializacion: Binario, SOAP (Simple Object Access Protocol). &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Leccion 1 – Serializando Objetos&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Que es serialización?&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Se implementa usando el NameSpace System.Runtime.Serialization, es el proceso de serializar y deserializar objetos que son almacenados o transferidos y luego reconstruidos. Se convierte el objeto en una secuencia lineal de bytes y viceversa. &lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como Serializar un objeto?&lt;/b&gt; &lt;br /&gt;
Pasos para serializar objetos: &lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt; &lt;/span&gt;&lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Crear un stream donde se almacenará el objeto serializado.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Crear un BinaryFormatter&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Llamar al método Binaryformatter.Serialize para serializar el objeto y colocar el resultado en el stream.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;En el método serialize, se le pasa como primer parámetro el Stream y como segundo el objeto a serializar.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Ejemplo: &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2XJuCSEhoBGG7ZlHSLuKBl_0CTCWA4dkElmFUAHH5zhAIF9Jpp67Ez1oauVZ6e5U8FfOaQbVqCebhZyIc7a5G9IyM4UvodwNeQKVNfz5pX9S1J3K24s45BCKV2ECD9IwzobptApwUAPk/s1600-h/clip_image001%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image001&quot; border=&quot;0&quot; height=&quot;174&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9wi0IYmO3O_xFN5kBMlVTZsRMOdlHRBKTzPV18XyMd2CCnmbGgHGKJrPV2BP7yypdI-sGQhhLN1TNF1nweYKfL9B11Uz5USBcsf3hw2F3hNFlqvQCoK7unomcHLFp-Ol5eoZmrgHqecQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image001&quot; width=&quot;503&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;  Se crea un archivo y abriéndolo con NotePad se puede ver esto.  &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7v-Uvil4Zs5rk9108trdBtlI2V0z9P8yBoTluCVgplKstgZAJ2ADthvv4JRwKMzgZkQ2EWu5xdlmturjk9DZ4cd54I3iuMrwdQg6NGwjeoahgo722f_Pm16pxdYQ9rC88z_x7RqHripI/s1600-h/clip_image003%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;clip_image003&quot; border=&quot;0&quot; height=&quot;93&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg76mxQg8FQ1ieurrbBM-d1s0XeXrNcPL0lPBN6lXAcVvxV10_xRg_j_qW3D7Y7i5Bm6hNyHmWRMgxb7XupKm0fqRx8MaMj8x2rMBofzeefNQdnIWdWWSzWhXPOljsllAPjhKrQCuWwhaQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image003&quot; width=&quot;458&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;  &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;  &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como deserializar un objeto&lt;/b&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt; &lt;/span&gt;&lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Crear un stream para leer el objeto serializado.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Crear un BinaryFormatter&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Crear un nuevo objeto donde almacenar lo deserializado.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Llamar al método BinaryFormatter.Deserialize y castearlo al tipo correcto.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1XYFfx7LLYdFwOUU2e6ojGHB6IH7HPhhdeFOpebcdUsNymXIImlHtjcbl14wsezS4sxOmS-OB8mWPc0728-PP-kYM74lhLoI-UqI4gW3Bpx1V5fzPEa-h4JFarUKRL61c24skmV18vc8/s1600-h/clip_image004%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image004&quot; border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDa2_MWnmEumckfHALC-2K7ONj86HOnyJNclDMu-geCD9cMcM-LoCgoXiERWmdDHs_4YGA6hRfC2lOHaXKpatr_KMY_rbGYnw5r-eh6oGayAjNNruBA1pzZj4-U9qcy3xtA0JtPYrdq5Y/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image004&quot; width=&quot;524&quot; /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Y por pantalla se muestra: &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt; &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihbYITIL9v9AN-JSGQZB_1op4XIZ1xSxHsJEwWIfvn8NlA58Q7jjPh4ULoXSXk_RNGG8JGnECSBqNlaO90pRrfG7jokysVO5rb2XbJ6LofwyRWus-6TlMEoLSg_lcUBLiSHikiK-4APco/s1600-h/clip_image005%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image005&quot; border=&quot;0&quot; height=&quot;29&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlNQDRRzrfQAj3ciRlPVeQiZ-e3KqqFfsFsfe1oB5g9LK3vhOM239IOIHexl8kZxEnwJGOdlZy2W-_kuA4lt45SKNxNT1p5l35AjXQ-_kdAWuo34Ae19B0IO_Q9HTPNL-gFiAwE28cZFE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image005&quot; width=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp; &amp;nbsp;  &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como se pueden crear clases que se puedan serializar?&lt;/b&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Para que una clase sea serializable, se debe agregar el atributo [Serializable] y esto serializa todo, incluso miembros privados.  También es posible controlar la serializacion de manera eficiente dependiendo de los requerimientos.  Si se desea que uno de los atributos no sea serializable, se le coloca al costado [NonSerialized] .  &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Ejemplo:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;  &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOE-mwuMpLS8Fu3_i1Ymi4ZK9aT-TxEY6NUg50EwRfEXr40cMnqHRdWdqK6ZMski3fjxKneCaiq7WezKvvtQUlop-hSOskDZRHanUOc27Z7WHfrgcXerLQhF-IzaNTDXCnwOZHU0_Txiw/s1600-h/clip_image006%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image006&quot; border=&quot;0&quot; height=&quot;161&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHT24AaIPlXSnwkb4q2yzHY0P1Qjjg9WP-zc5Kpt1kjloDaWTDmuFDhfxBdeYG4jmzAjYEq0okLjRKjMvDkQhnewhMGPOV_cGQ8TXDbhIIQLUW6puR_Mm58CbQbjygVqr8kKE6TDL7HFw/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image006&quot; width=&quot;373&quot; /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;div&gt;&lt;pre&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt; Si un elemento se puede calcular a partir de otros, agregando el atributo [NonSerialized], &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;en &lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;el proceso de deserializacion, no va a ser inicializado. &lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Pero seguramente vamos a necesitar que &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;se calcule antes de que el objeto sea deserializado, &lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;para eso debemos hacer que nuestra clase &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;implemente la interfaz  IDeserializationCallback, el &lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;método OnDeserialization(Object sender), &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;el cual se llamará en el momento que el objeto se &lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;deserialize.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA_wH7lyN5RaViNIMxRzbV5uIktlK9ckR-K-muvKyt2gnV5qKl7wdSwGFhcS1lrG1zEG7yoIkv6BrAcqKQT69D4txvNt-Nt-U9WzK7WcmgGM7LliLwmCIcPhNImzW_1t0NHw4hMQIY_-E/s1600-h/clip_image007%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image007&quot; border=&quot;0&quot; height=&quot;330&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwGhzObwInJmTAjEk0VuqnjlSEaF6JCQYKX9fxpE03axhCcTmhc4ur7BjyLqGN2KtK9BaEVO5OIifqteYGVpuDFvP4xc2ZnO3Vwdmt2RDDOTMEwW-4UKAJweM6gfXJykHKZHzMKR7WHRI/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image007&quot; width=&quot;508&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como proveer la compatibilidad de versiones?&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  Para superar limitaciones que pueden ser producidas por problemas de compatibilidad, existen 2 opciones.  Implementar una serializacion customizada (explicada más adelante – lección 3)  Aplicando el atributo para nuevamente agregar los miembros que pueden causar problemas de compatibilidad.  El atributo OptionalField que no afectará el proceso de serialización. Pero si es que en el proceso de deserialización el miembro no fue serializado, el valor será dejado en null sin arrojar excepción. Ejemplo&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidZRUjsK3gpnQ7uIWy0t46dIOEKAjfef8jbRo6QrlwDDoZOXEOcD59kWRYb70AJp6PZyOlcl_vKjl1LNb1vu-sv1sw4FMi-qkILrv-2JEzenFTB-DFi4HkllSuHHju_wse1uKUYwgJrN0/s1600-h/clip_image008%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image008&quot; border=&quot;0&quot; height=&quot;98&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQPt9BHH2LeRJwQbwl3M2sMahXZTmNsfTo6RbaRPqb9rcZElWUwDMe5O4QTVkL_OOf40etJshWnRLkATkZGs_TrHeTXvRg-RNmEtLyvXLyYt61nTjURhoC3JhTgvccDJuMgkcCpl_FDnk/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image008&quot; width=&quot;373&quot; /&gt;&lt;/a&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt; &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Mejores prácticas para compatibilidad de versiones:&lt;/b&gt;  &lt;/span&gt; &lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Nunca remover un campo serializado.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Nunca aplicar NonSerializedAttribute a un atributo que lo era en una versión previa.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Nunca cambiar el nombre o tipo de un campo&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Si se adhiere un nuevo atributo, colocarle OptionalFieldAttribute&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Si se remueve el atributo NonSerializedAttribute, colocarle OptionalFieldAttribute&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Para los atributos opcionales, inicializar sus datos en Serialization callback.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;  &lt;b&gt;Eligiendo un formato de serializacion&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  .Net Framework incluye dos métodos para formatear la información serializada, ambas implementan la interface IRemotingFormatter.  &lt;b&gt;BinaryFormatter&lt;/b&gt; (en NameSpace System.Runtime.Serialization.Formatters.Binary) es el formato en binario que se le da a nuestros objetos, se debería usar cuando uno conoce que todos los clientes a los que va a transferir el binario, tienen solo aplicaciones en .net framework.  &lt;b&gt;SoapFormatter &lt;/b&gt;(nameSpace System.Runtime.Serialization.Formatters.Binary.Soap) está basado en el formato en xml, la cual es la forma más confiable de transferir datos a través de la red. Debido a que es un xml, será abierto por cualquier aplicación. Se debe utilizar cuando se requiere portabilidad. Por a su complejidad, es menos eficiente que el BinaryFormatter.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como usar SoapFormatter?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;  Se debe agregar el namespace&lt;b&gt; &lt;/b&gt;System.Runtime.Serialization.Formatters.Binary.Soap y la forma de formatear con SoapFormatter es muy parecido a la de BinaryFormatter, solo se substituye la clase BinaryFormatter por SoapFormatter, aunque el archivo resultante es muy diferente.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzwLg0QD-DD_oN_8IkhjcP3F33I_AZyLcIu_HzhdCWlKqDL5m8_2zalH2UrbjEckP5ia0YAIMLTI4vB5sf2lIdcnTKcjHy0hg5U9mZY4dJ_8_a3JHPholFH4XeCZj038iM_rKnr7TIV_4/s1600-h/clip_image009%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image009&quot; border=&quot;0&quot; height=&quot;179&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCcHnNoPY00bti9RnvUYS5KucG6Zyw7sBbYLHL6NlptYpa1RjrxsXoZ9Rs740GyZtWDxCUOCnuyOge58MDWZdO5eqGlfRB5mI9WGUsVGKDjVFSzdbw2h_28pzx0xh_UaKWpn847Tf1vdk/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image009&quot; width=&quot;528&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;De esta forma se ve el archivo creado:  &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhudcJ3QAQunAiq8WbWxsgYJEHfV2FlUF7EpEdRFr2KiTYsuhWKy-s0S-Nd9xrztgX6d_O39Xv3tJX2bjCtx5Q_IgIamiBY5K-BLX1xqAbiz56IhwXq_daNr_fTeuVUdNu5lPCRW8zsVLI/s1600-h/clip_image011%5B5%5D.jpg&quot;&gt;&lt;img alt=&quot;clip_image011&quot; border=&quot;0&quot; height=&quot;251&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYoGuM2tRoO4W0wBVUIwdyYpcgFzFh14iq8eIRhHVWO-NlM32sBDv_nybc22ezXCaeT9G1435dOY2gauaceeTHlGK67Ny6CPVAZd9RsWz3c6Ruw_1hz3HlZueUgBTa4Y9efNoF1obio00/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image011&quot; width=&quot;568&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como controlar la serializacion SOAP?&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;Se pueden añadir algunos atributos para controlar el formateo de SOAP:&lt;/span&gt;&lt;/div&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;SoapAttribute &lt;/span&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;487&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;para señalar que el atributo va a ser serializado&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;SoapElement &lt;/span&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;487&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;para señalar que la clase va a ser serializada como un elemento XML.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;SoapEnum &lt;/span&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;487&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;para enumeradores&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;SoapIgnore &lt;/span&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;487&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;para no considerar este campo al momento de la serialización&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;SoapInclude &lt;/span&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;487&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;cuando este tipo debe ser incluido cuando se generan esquemas.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Recomendaciones sobre la serializacion&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;Ante la duda, se debe colocar como serializable a clases que incluso no se serializarán en ese momento, porque en el futuro se pueden llegar a necesitar.  Se debería deshabilitar la serialización para elementos que son calculados o temporales.  &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  &lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 2 – Serializacion XML&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  XML es un estándar, un formato de documento basado en texto que puede ser leído por las computadoras. Al igual que HTML posee un formato que puede ser leido y entendido fácilmente por nosotros. Se pueden almacenar imágenes, música, archivos binarios, e incluso información de base de datos.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;  &lt;b&gt;Porque usa la serializacion XML?&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;Serializacion en XML es usada cuando se necesita intercambiar un objeto con una aplicación que no esté basada en el framework .Net.  Provee los siguientes beneficios:  &lt;/span&gt; &lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Gran interoperabilidad: XML está basado en archivos estándares, y existen muchas librerías para que cualquier aplicación de diferentes sistemas operativos lo pueda usar.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Una administración más amigable: puede ser editado desde cualquier editor de texto.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Provee archivos más fáciles de leer: se describe por sí solo. Solo puede serializar datos públicos, no privados, No se pueden serializar grafos. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;  &lt;b&gt;Como usar XML para serializar/deserializar un objeto?&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  Crear un stream, textwriter o un xmlWriter para almacenar los datos.  Crear un XmlSerializer pasando el objeto que queremos serializar.  Llamar al metodo XmlSerializer.Serialize (si queremos serializar) o XmlSerializer.Deserialize (para deserializar)  El código es similar al estándar de serialización, por eso solo voy a colocar el código para serializar Xml. Ejemplo:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgCN7ks-vdAaRILq-4QW3JIbXOvmfvplzYI4D-dzqW2oLXvOEvt77hrFJPoMZtb6EJx_0PwVFsGS5xTdwQD7QetJKlDOygIqNye1YIpqtklchIF-3yR0sLwA79KW0Xx-v55wnufgGtAOk/s1600-h/clip_image012%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image012&quot; border=&quot;0&quot; height=&quot;162&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvaCPro6kybk5egZlYWa9EEXJCqfRqeFvkRRSfBIDv_U0NEhUFjkDKKxY8meZOedtZmRc-x-4A0qtZm9y8D_MPTJIQztM5Unur48yLSnvETklEzeAX0cut80ResEsMn7IZqNshBN9wrpo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image012&quot; width=&quot;450&quot; /&gt;&lt;/a&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;  &lt;b&gt;Como crear una clase que pueda ser serializada usando la serialización xml?&lt;/b&gt;  &lt;/span&gt; &lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;· Se debe especificar la clase como pública.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;· Definir todos los miembros que se desean deserializar como públicos.&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;· Crear un constructor &lt;i&gt;sin parámetros&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;A diferencia de los otros tipos de serialización, la clase no necesita tener el atributo “Serializable” para poder ser serializado como XML.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;  &lt;b&gt;Como controlar la serialización XML?&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  Una clase que no tiene ningún atributo para la serialización en XML, se serializaría a XML donde cada uno de sus miembros es un elemento XML, por ejemplo:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Clase&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;att1&amp;gt;valor&amp;lt;/att1&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;att2&amp;gt;otrovalor&amp;lt;/att2&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;lt;/Clase&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  Si estamos definiendo un esquema XML, es suficiente, pero si queremos realizar un documento XML, con estándares específicos, necesitamos agregar algunos atributos para controlarlo. Por ej. (los más usados):&lt;/span&gt;&lt;/div&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;591&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;XmlAttribute: permite que el campo, se vuelva un atributo en el momento de la serializacion, es decir estará de la siguiente forma&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;lt;Clase att1 = &quot;valor&quot;&amp;gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;lt;/Clase&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;591&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;XmlIgnore: permite ignorar un atributo para que no sea serializado (como [NonSerialized]).&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;591&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;XmlRoot: (&quot;nombre&quot;), sirve para especificar con otro nombre serializado a la clase que se piensa serializar.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpcjYe-saFb3jdmr909tz28pBwfAHzqWw15uUthS0asACVRhnJSnhgeMkRPfoKqTKllgwj8yzWziLmFRif5OLPhh_Pcj7Eauv8yyPcC682lpgb_SXpuArZOxABXsCyTouJeENBYIGhKbc/s1600-h/clip_image013%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image013&quot; border=&quot;0&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjss8746mleL8iYbIClqPd6eZoG5zTKF9nXSCuVxmgsj45WSD9n-MI5nd8Tdvl0XkwIDrwUDoD939VKwpT0HNEKpMdCv8DMowF3KmPeEkP5paXEKF9Is7nR9YDMtK1HeVBfEZycH4svYWE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image013&quot; width=&quot;244&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Podemos tomar control sobre la serialización en XML, si implementamos la interfaz IXmlSerializable con sus métodos ReadXml y WriteXml para controlar el XmlReader y XmlWriter.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  &amp;nbsp;&lt;b&gt;Como generar un esquema XML?&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;Un esquema Xml define la estructura de un documento Xml. Se puede utilizar la herramienta (xsd.exe) que permite generar un esquema personalizado o estándar(como clase) para las clases que se piensan serializar.  &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como serializar un Dataset?&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;  Las instancias de DataSet pueden ser serializadas a XML. Se serializa de la misma forma que los otros objeto, pero no provee un control de lectura que debería de tener.  De forma alterna, se puede utilizar DataSet.WriteXml, DataSet.ReadXML y DataSet.GetXml. Ejemplo:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt; &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLPA9s1NZuuA4bgxdz1XYOhYzXtKNWhI_xs1FcJFytdjr8AwBbPgQ9YPClIwXt-ZBiIkfnXG99yLZ5K2EmOTMhlkLOKKvMeIgP9vMNNhgecPkIu2wNWegE-RrC5MdGstDYTKF4bmNdYCs/s1600-h/clip_image014%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image014&quot; border=&quot;0&quot; height=&quot;345&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxwm35jL_Sue2OsjKvnMO62zEmGPztqxKEeHowyemfijPNrV7fRwmVDFGyHiUCMP8ahrT4nRS8S9pF4qdFnwi6vdShE81PEjEgwQohB_iNiNwcl152_vfA2jUvET3n_PPA7o06Vt2ZcQE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image014&quot; width=&quot;392&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 3 – Serialización personalizada&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Controlando la serialización es posible asegurarnos la compatibilidad entre distintas versiones. &lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como implementar la serialización personalizada?&lt;/b&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Cuando se desea hacer una serialización customizada, se debe de implementar la interfaz ISerializable, el método GetObjectData, además un constructor para el proceso de serialización con los parámetros: SerializationInfo info, StreamingContext context. Del SerializationInfo (es de donde se obtienen los datos de la forma info.GetInt32(&quot;numero&quot;))&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguBgNFHA6MzU_H8F43wHUzjXWKEVf9Laj32AXVtgMcYoK3ZCglrBPGo5DJXDB4JQl7TVI32Lx046_ENFwzB_AcOeCdfPeD3G_Aw0ckITHtMBFsj3dcVGYfkaoL_5AOa42o9d4ItdEfEUQ/s1600-h/clip_image001%5B1%5D%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image001[1]&quot; border=&quot;0&quot; height=&quot;458&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR6JfoJUIzVXGvbnmacj2RnVSSXeKhcB1U3sl5Mm52dxqYyf37s86N2kfdV-CSp65SoB1e98Ff_hijJR03_WDLBRpj0VeBa10DDy_I74xJBKAjQAW-xDNE4cVMMqc3PgP5vu_WJCEQZ7w/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image001[1]&quot; width=&quot;563&quot; /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Respondiendo a los eventos de serialización&lt;/b&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;.Net Framework soporta eventos de serialización binaria cuando usamos la clase BinaryFormatter. Hay cuatro eventos:&lt;/span&gt; &lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;OnSerializing: antes de que se serialize&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;OnSerialized: después de la serialización&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;OnDeserializing: antes de que se dé la deserialización&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;OnDeserialized: después de la deserialización y de OnDeserializing&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;(Estos 4 eventos solo se realizan en la serialización binaria, no en SOAP ni en la customizada.)&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Usando eventos es la forma más fácil de controlar el proceso de serialización.&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Los métodos permite modificar los objetos antes y después de la serialización/ deserialización.&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Para que un método responda a los eventos, debe cumplir con estos requerimientos:&lt;/span&gt; &lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;aceptar como parámetro un StreamingContext. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Retornar void&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Tener un atributo que concuerde con la definición del evento que se quiere interceptar.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Ejemplo:&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhOgahcsnsGcCKQSRROps9n_zdC5mfX7Hp18AkF8d4zfzUVYbSy7lddpf5VFSU5UffBQJpWKy_ESIJog2kRCOy3klbiYErgDTCOeI_e6uTco8VBTQGihnltQEHRDLfeHABMGYVLeTvsdc/s1600-h/clip_image002%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image002&quot; border=&quot;0&quot; height=&quot;388&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuAG_H8-8_cGAclWOBNzR5T3zUC5cdq0q-3r_gCr3H6p-GLhy0Lal8OL4oxozd2elLqtTe2qjxTAK7kjjG5KhOxjNrrpaTxEutVGin2mxBFGHC_Cnza3YRhJWbC8Lmd32o7HFehqIoC-I/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image002&quot; width=&quot;370&quot; /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como cambiar la serialización basada en el contexto?&lt;/b&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Generalmente cuando se serializa, el destino no interesa, pero a veces la serialización y deserialización depende del destino.&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;La estructura StreamingContext provee información acerca del destino de un objeto serializado para una clase que implementa la interface ISerializable.&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;StreamingContext tiene 2 propiedades importantes:&lt;/span&gt; &lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;context.- Es una referencia a un objeto que posee la información deseada por el usuario.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;State.- Es una serie de bits que funcionan como flags, pueden indicar:&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;CrossProcess.- La fuente o destino es un diferente proceso en la misma máquina.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;CrossMachine.- La fuente o destino está en una diferente máquina&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;File.- La fuente o destino es un archivo&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Persistence.- La fuente o destino es una base de datos, un archivo u otro.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Remoting.- La fuente o destino es remota a un sitio desconocido.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Other.- La fuente o destino es desconocida.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Close.- El objeto grafo está siendo clonado.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;CrossAppDomain.- La fuente o destino es un diferente AppDomain.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: small;&quot;&gt;All.- Es un contexto por default&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Cuando uno construye su formateador, éste automáticamente setea su Context a null y su State a All.&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Como crear un Custom Formatter?&lt;/b&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Para crear un Custom Formatter, se debe implementar la interfaz IFormatter o IGenericFormatter.Tanto BinaryFormatter como SoapFormatter implementan solo la interfaz IFormatter. La clase FormatterServices provee métodos estáticos para ayudar con la implementación del Formatter.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.ziddu.com/download/14224385/Resumen70536-cap-05.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF&lt;/a&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;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;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href=&quot;http://www.4shared.com/file/r5WDjEoC/Cap_05.html&quot;&gt;Codigo Ejemplo&lt;/a&gt; &lt;br /&gt;
....................................................................................................................................................&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&lt;/span&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/771476506573439840/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-5-serializacionparte-1.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/771476506573439840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/771476506573439840'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-5-serializacionparte-1.html' title='Capítulo 5 – Serialización'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9wi0IYmO3O_xFN5kBMlVTZsRMOdlHRBKTzPV18XyMd2CCnmbGgHGKJrPV2BP7yypdI-sGQhhLN1TNF1nweYKfL9B11Uz5USBcsf3hw2F3hNFlqvQCoK7unomcHLFp-Ol5eoZmrgHqecQ/s72-c?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-1876977731071905740</id><published>2010-10-28T11:42:00.004-03:00</published><updated>2011-03-17T12:45:46.018-03:00</updated><title type='text'>Capítulo 4 – Colecciones y Genéricos–Parte 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 4 – Usando colecciones especializadas&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Son colecciones con propósitos muy específicos. Se encuentran en un namespace System.Collections.Specialized  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Trabajando con bits&lt;/b&gt;  &lt;br /&gt;
.Net framework trabaja con 2 colecciones de bita: BitArray y BitVector32  &lt;br /&gt;
&lt;b&gt;BitArray&lt;/b&gt; es una colección de tamaño variable (pero no dinamica) que puede almacenar valores lógicos (bool). Soporta operaciones a nivel de bits como and, not, or, Xor (o exclusivo).  &lt;br /&gt;
&lt;b&gt;BitVector32&lt;/b&gt; ayuda a manipular bits en un integers de 32 bits. No es dinámico (no varía su tamaño), es de 32 bits así que puede manipular integers de 32 bits de forma individual.  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Como usar un BitArray&lt;/b&gt;  &lt;br /&gt;
Cuando se crea una instancia de la clase BitArray, se debe especificar su tamaño. Despues de creada, se puede cambiar de tamaño mediante la propiedad length.  &lt;br /&gt;
No soporta add y remove.  &lt;br /&gt;
Es importante cuando se quieren realizar operaciones lógicas. Ejemplo  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEo6QY3BSPHnu7HzuAefopRTpALBZJs_28HSymMbnfmb2ZG0zJy27UtflOQ0qBx49mjux6BXo5emhF2DQvvn_kwVMqvoe-JkLeHGlwhnpPBDpumyMf_U59UOG4apP6cwzp-U8MXH3mJik/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;370&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKGqqGkx3Db-HNwiba79E-OG3h6acQ3uDSLuZa66DzToyAkkjX_w4CQ7AlLvHjcd7AEGhyphenhyphenL2JAFW3_Pg1fdgtSneoIUEfDh6iaEGnyVQ9rF00HAbNwdhV9IzQuuqaOWsmBuC94b4X0be4/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;487&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como usar BitVector32&lt;/b&gt;  &lt;br /&gt;
La estructura BitVector32 es usado para manejar de manera individual bits de un numero largo, un entero de 32 bits. Fue diseñada para simplificar el uso de binarios como un bit individual de información. Tiene un método estático llamado CreateMask que es secuencial.  &lt;br /&gt;
Si se llama sin parámetros, se crea la máscara para la primera estructura y llamándola secuencialmente con el último bit al que se le hizo las mascara, se va suplantando por la del próximo bit.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzWKJwpypFkCXV4C47H8xIvEMXFd8gfUppKwkTnT_JcrITI1eaERZboXgk3nQnvBr7PhENAQXp-jMfhs89uJWVXRcEOs098YAg3UpAPq2EchfcNTa3hMJHE0CCdvP_X6lokOalZE6bCa4/s1600-h/image%5B7%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;262&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_a-NqAB8JiLi82-fz-0arIjTcleaF2xlREdP95whxBa4cqRvr0o1-zYyUNPxIMD0NtHayAHbY08di6zc5VgQoJwj-gebMv-2E_9h_nc3_wCWxwkEHg6C50gz9IspABQXne-tY_ntxmAQ/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;419&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como usar un BitVector32 para un paquete de bits&lt;/b&gt;  &lt;br /&gt;
Esta estructura permite usar toda su capacidad para almacenar varios números pequeños y ahorrar espacio. Crear secciones que serán usadas para almacenar números de un cierto tamaño.  &lt;br /&gt;
Entonces para almacenar valores se puede usar  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKqju7tm1dBHsUvRn8xFSh7wMsasZu6hXwTfRfl_ohonYIVc3ZbzvFSStEqJ3l5NzWt9Jh4SnpU_hl8D2DSi3sH-K_J0KZowLyz8Fd6xQbjO8ziBl3xc-YySiESvjZQj0LCbAAbA_Rp18/s1600-h/image%5B14%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;223&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmWhFP8UtNe4iIGoPFiqCP_9SqkAgYS_1Bi4WoZknfNzDN_wpOV1cgxQlllrM_CVo4hnh0tOy1Pu36kCZ0p8St-uJocYPWiNSzV6ExjdGHtrwQ2oZsV_oV1ZrKt50JvTbYzqHuzXI497I/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;570&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Y para mostrarlos  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-FkW6YCtSsMNketZFhb_0sElJDFsa5ZvInt_YJO5KdGFgLILhc6A-eOxi-PNDfqdn0KpCzD8JsnWWidhGMbzrRvKH9CKZ5rm2VL8tAaQmgl7-8XRcWdGRyriOnPnSsR6Y-mly3evaF5U/s1600-h/image%5B15%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;57&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi2aQGp_Uwqg21cOuEBj997k25nuroQaWJHVu3bb7jNTwFz8iqhqoygiG3M3yxu-PzVKtxBpbglrftEdw7Gek16TnOvehE-ihkMv88RXpAo7Tq68N8U82op2LRqO4a0CAfaIcXbd8Fd0Q/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;428&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Coleccionando strings&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Clase StringCollection&lt;/b&gt;  &lt;br /&gt;
Es una colección dinámica de tamaño cambiante, que solo almacena strings y su uso es igual al de un ArrayList:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr5bmCTBavKTOCs3BnBaCTDjhX2i8o-oj6KcLBGSjXCXiOjzFA_qaXKFoLomK0DEui9oF25GzZgJUzv-rhgLyAKESim7VLaCcPwlWNk-XBvWOwQLkHylsXQ8o0cwr0VeK0jRPD_7iIaSY/s1600-h/image%5B19%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;98&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikM-2mLmUwQ_5FoCeKj9Dz_0Nm-EJhBnRbHn8YtpOFftQ063XEvo1UC2_eAo8_cnPF_zQEx6LXW9Cy1DkDc4R7vK4vOqU4s4NilfGhQXtXSx6uDWvsIzutV-LlVXQpbPikd379ALSFsWA/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;382&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Clase StringDictionary&lt;/b&gt;  &lt;br /&gt;
Es una version de la colección diccionario fuertemente tipada, su uso es parecido al de una hashtable, salvo que tanto la llave (key) como el valor (value).  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiljxaSIKt7onxWF2la7Hx3ZJtNGtVcrMOy31MOl3wvT6I9Ol08cL0-xUCqlblUdLdK4DMiPtjYs0UpYUQUp1_TqSR2S034O_YdkDSCNlePZr4Fv-P8wDGcyp4RIWOcySS96nO4y_Z21g0/s1600-h/image%5B23%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;116&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi65PBXGtPS-aCuFq7h_399WInCUf60XoNSmynKyjznZY0Dk8i0lW2iuaXmkbK_cEFJFiVadrc3sWiER-2sUfWYEBuo2Ifn6WGf-YFZy_dBR33Ktoyv3MyloMWEsuBYsT9uWvoVCjgZUTw/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;389&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Colecciones Case-Insensitive (no sensible a mayúsculas y minúsculas)&lt;/b&gt;  &lt;br /&gt;
En las colecciones se puede controlar la forma de comparar, Case-Sensitive o Case-Insensitive, usando CreateCaseInsensitiveHastable o CreateCaseInsensitiveSortedList.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzO7NZpvVCPYXPB290jWPnN9TXChnfIr8ciKR6adPBgW3KQrUvSWFxK8x7Lk69RhI3zYXIvp0wjDw1J0WoYBoLoV-3zNjwNr92Kl5g0MDE3n9zSP_n0kV895BfxcspXn5NIWNCyGZT3XA/s1600-h/image%5B27%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;82&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTNAoxlRQXhclzppTf3OqRBaDJCzGgiRr-DOewa0iNsy457lxDPmBobVdzjl4WWrVqWCR0E2bdzBMxKz91vqSZn4vC1zLmQdQxfY_tEJPhmuAuRqxPh9bzlQnxMiVyLTdMXhcPYeb1MqM/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;553&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
De esta forma se toma como un mismo elemento y solo se modifica.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTph1HBVKtuDdotumnxtz0B_DGw8naWjacyWyYPNyLwdQpRtJfl3py_o_R6CWyU3edPLT-ggGJrc2XV54DrIiSB047pbk-LDHGp1zW7IseMNy7BKcpVgUoDih484UQ3nfFTjZAxkudL1Q/s1600-h/image%5B30%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;28&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKHq2MXCH-y9V9_LpiyzfduhVOv7jNy4GIl0PD8GG-s4eASrqha9PmqypxQPXjZI5TVx7wDX2KauE6RhSOaUwGa7hSJmCPfpoRjGgMT1_DZNpg7JTL8Hb8LRER9AFkn7r8lLExY3bE-hM/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;227&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Colecciones de cultura invariante&lt;/b&gt;  &lt;br /&gt;
La comparación es dependiente de las reglas de la cultura actual.  &lt;br /&gt;
En muchos casos de aplicaciones web, se debería hacer que la colección no se vea afectada por la cultura. Para esto se utiliza el StringComparer, tanto para Hastable como para SortedList:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtbmXnJA5E4m57UcfCqHgBEHe4EUU9ae_Vqax9nxrDdsXlt1DseR5e9He_uG90fnI7f0kOBUGHYSgxHqWthrIwBv9PLsxpswMM_xN7teS7J4Un-CLLwkJgx-bNcG0bjSxpfZGgAQGxb_g/s1600-h/image%5B34%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;29&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2fR3OHfWedTCIci_Eg4ETifNv-KbajwFIcIZ4nDiIv1jhOf130onTolcw4gqBMsR4MyK00-LeonrCHRYqewn6UOt646OY-UzEJ6gxv_boHfpW_F4BJzUO5qA8c1myeBF5DxHoOcSEVlc/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;546&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Clase NameValueCollection&lt;/b&gt;  &lt;br /&gt;
Es similar a la clase StringDictionary, solo permite strings. Admite múltiples valores por key, así como también se puede buscar los elementos por índice o key.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9fkXb33q_ojMbrlcKudMkXrxaTbeJQwcBR2qIanuMAIv0OoK6cHCi1h_blmLDrT-jSmzFB8g4BD5yUsFxabMDrWLwED2N7QyJqaXkQGOtWu_70pfJl50MfeX2c0yMUZ0EF-c2vLyglVY/s1600-h/image%5B38%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;109&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPLmMmgdbKJJJAG9Vsn_Z7qPJu4NgtKQ8a1enk0o_UV1j4yXHyjDS-C1I2OnI6dnPK2otbQq2MX53__CF5wsvLNK19uY17cqghY6C2JR5LvHhWygWkFw0vskKQbQ3u6lYG3P0hPRBi34s/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;417&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Conosole.WriteLine devuelve ambos valores.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrIqzapVTpPtmBlUKvqRHP3_txpkFiyShjUDgJRzMHdrbPWja3k4TDNCOOf42IHLN8eGS1mldj93Fam3M06-ybV5eO2rHjsxZuGcgUqZBR7uGjG2Vn7OejUDEGbCDo3EWBI5GHpfCqXUA/s1600-h/image%5B42%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;46&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb9dPOQZxKP-5EGu2H56GMQAoaRFxGlbfKu1eIv00jxbGWroR6qJKc55t2XJssiWODGys1NKCbiUQ1JYlspDFYEke4voXA44RLc-iFFOB3HZD3H-HJpbEAhxlXuoA22ye3OhNnjN_hIjg/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;144&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 5 – Colecciones Genéricas (Generics)&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Las colecciones genéricas están el namespace System.Collections.Generics, a diferencia de las colecciones normales estas pueden trabajar con un tipo de dato que le definimos cuando se la declara. Pueden usarse para crear colecciones más rápidas y type-safe que sus equivalentes no-genéricas.  &lt;br /&gt;
Para inicializar una clase genérica se debe utilizar un parámetro adicional después del nombre de la clase, entre los caracteres “&amp;lt;” y “&amp;gt;” pasándole el tipo de datos con el que la colección deberá operar.  &lt;br /&gt;
Ejemplo:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGS2dcXaBZ4HK0lsyFTKZ45kAn7i7qiW6xglEuZfPTi-pXoD6BeZ0qJ3CpMLS5n7Fl-5xKEVsajSvi2Vm2EFYOJ2C9kb_efFvcHTeI7lDqKeJYv_1CHuwJA4oEWes2fav0LVWHUf4zl5U/s1600-h/image%5B46%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;193&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSBHPEOsoxPRvl5jWXZZfrWrhmhWLn7kF1kSCPAZrPds_-yI_vzQkLFPoyhJd4ZP0bTtRjEraOJqm1La6-PUO2DQiUbiMYEk1kwZYJ-1MQjfjq27W-HHoGQonTeWo5F2DJcVJhYZbduhc/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;461&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Los tipos genéricos y sus equivalentes no genéricos  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis2mHvIGR-g8mVXEgyfZUdMtvMggya1FoVG5AfXErz7ZDSPv253Rg_U2TBVtFiaWPThhTX3eRw3sI8pLBaSzaKXAQ_EUBP8us6WEXmAUm0bxs8Ef2fTCT9HyOHbZTQgCk_2h4SGYba-fg/s1600-h/image%5B50%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;323&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigqOIhq3DcfV4u84Ue9HJlGPmjZwCzgxVu_WHm0XiS3jyzzt04Q_Kb1O8RGfcPDMZ1ll4Dtv8xcpIhH9IYqD73RXqKCyErr2bBrzQqg_Dq1ZFr0cTEYkGpeiVfWnBPzYLqwwvl2nwuxbU/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;489&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiS6VUmbYDHuZS7nuP7LO3MQmjOdXdMak8paWBG3LCkSTa1Wqpt0RIMmovw_mGNBzCap6IWNf3d7vNq43voAT9bxu_agR7pEbLFiNLANNVopndFNp-G80AwYTaEGjlZIx5rig1eRlVQNY/s1600-h/image%5B55%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;85&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCJTCnpo4hU-i2caULlyB5iY1VBUesVGuZwXQApO83ngZwFJOzCAtgvUkx9X8b64H9IOxm8kGYIdNakTEAXVgPU0q-z95lgwLmRReM5lJbJlBcQVCySL0mxHHsSeTI5kuSbr32iQW_eTc/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;490&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
En general el manejo de igual al de su compañera no genérica, la única que no tiene su análoga es la clase LinkedList.  &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Clase LinkedList&lt;/b&gt;  &lt;br /&gt;
La nueva clase genérica &lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/he2s3bh7%28VS.80%29.aspx&quot;&gt;LinkedList&lt;/a&gt; es una colección para almacenar ítems que conocen su propia relación en la lista, y permiten iterar sin tener acceso a la colección. Es decir, que únicamente teniendo un objeto de la colección, aunque no tengamos acceso a la colección directamente, podremos iterar en ella.  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;El método &lt;b&gt;AddAfter&lt;/b&gt; añade un item después de un item dado.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;El método &lt;b&gt;AddBefore&lt;/b&gt; añade un item antes de un item dado.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;El método &lt;b&gt;AddFirst&lt;/b&gt; añade un item al principio de la colección.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;El método &lt;b&gt;AddLast&lt;/b&gt; añade un item al final de la colección.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;La propiedad &lt;b&gt;First&lt;/b&gt; apunta al primer item de la colección.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;La propiedad &lt;b&gt;Last&lt;/b&gt; apunta al último item de la colección.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;La clase &lt;b&gt;LinkedList&lt;/b&gt; colecciona objetos &lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/ahf4c754%28VS.80%29.aspx&quot;&gt;LinkedListNode&lt;/a&gt;.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;La propiedad &lt;b&gt;List&lt;/b&gt; devuelve la LinkedList a la que pertenece.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;La propiedad &lt;b&gt;Next&lt;/b&gt; devuelve el siguiente elemento de la colección a la que pertenece.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;La propiedad &lt;b&gt;Previous&lt;/b&gt; devuelve elemento anterior de la colección a la que pertenece.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;La propiedad &lt;b&gt;Value&lt;/b&gt; obtiene el contenido del LinkedListNode.&lt;/li&gt;
&lt;/ul&gt;....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.blogger.com/%20%20%09http://www.ziddu.com/download/14224382/Resumen70536-cap-04.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF&lt;/a&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;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;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;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;nbsp; &lt;a href=&quot;http://www.4shared.com/file/RWaAhITB/Cap_04.html&quot;&gt;Codigo Ejemplo&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/1876977731071905740/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-4-colecciones-y-genericosparte_28.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/1876977731071905740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/1876977731071905740'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-4-colecciones-y-genericosparte_28.html' title='Capítulo 4 – Colecciones y Genéricos–Parte 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKGqqGkx3Db-HNwiba79E-OG3h6acQ3uDSLuZa66DzToyAkkjX_w4CQ7AlLvHjcd7AEGhyphenhyphenL2JAFW3_Pg1fdgtSneoIUEfDh6iaEGnyVQ9rF00HAbNwdhV9IzQuuqaOWsmBuC94b4X0be4/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-5491422955144783444</id><published>2010-10-26T17:37:00.001-03:00</published><updated>2010-10-28T11:49:55.987-03:00</updated><title type='text'>Capítulo 4 – Colecciones y Genéricos–Parte 1</title><content type='html'>&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 1- Coleccionando Ítems de datos&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
Las colecciones de datos son algunas de las herramientas más utilizadas a la hora de desarrollar una aplicación ya que nos permiten manipular información en memoria de una manera fácil y flexible.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tipos de colecciones&lt;/b&gt; &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;19%&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=142613817781134327&amp;amp;postID=5491422955144783444&quot; name=&quot;classToggle&quot;&gt;&lt;/a&gt;Clase&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;Descripción&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;19%&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.arraylist%28v=VS.80%29.aspx&quot;&gt;ArrayList&lt;/a&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;Una colección de objetos simples, basada en índices, su tamaño aumenta dinámicamente según se requiera.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;19%&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.bitarray%28v=VS.80%29.aspx&quot;&gt;BitArray&lt;/a&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;Administra una matriz compacta de valores de bit que se representan como valores booleanos, donde &lt;b&gt;true&lt;/b&gt; indica que el bit está activado (1) y &lt;b&gt;false&lt;/b&gt; indica que el bit está desactivado (0).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;19%&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.hashtable%28v=VS.80%29.aspx&quot;&gt;Hashtable&lt;/a&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;Es una colección de pares de clave y valor organizados en función del código hash de la clave.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;19%&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.queue%28v=VS.80%29.aspx&quot;&gt;Queue&lt;/a&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;Representa una colección de objetos de tipo &quot;primero en entrar, primero en salir&quot;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;19%&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.sortedlist%28v=VS.80%29.aspx&quot;&gt;SortedList&lt;/a&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;Representa una colección de pares de clave y valor ordenados por claves a los que se puede tener acceso por clave y por índice.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;19%&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.stack%28v=VS.80%29.aspx&quot;&gt;Stack&lt;/a&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;Es una colección sencilla de objetos no genéricos LIFO (&quot;último en entrar, primero en salir&quot;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;19%&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.specialized.stringcollection%28VS.80%29.aspx&quot;&gt;StringCollection&lt;/a&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;Una colección de strings que aumenta su tamaño dinámicamente. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;19%&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.specialized.stringdictionary.aspx&quot;&gt;StringDictionary&lt;/a&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;Colección de pares de nombres y valores de strings , que permiten ser recuperadas pasando el nombre o el índice.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
La clase ArrayList es la más simple de las colecciones. Esta es una clase que representa una lista de datos (de cualquier tipo) que puede aumentar o disminuir su tamaño dinámicamente de una manera eficiente. &lt;br /&gt;
Para crear una instancia de este objeto, se debe utilizar la clase ArrayList incluida en el espacio de nombre System.Collections. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxhe4GcC-3Ghdy8btZosg8J5uFtr_JyKCr4xyy8pbHAz2WN09aqjDL0hiRq3xTBKjCNMHlXvb0Pq2sINAVUhAJEYDn_HHoyut_LWMuleRHQZqvV1hnmmMp5Rc0rHuQpNgw-w_JrYWk_nw/s1600-h/clip_image001%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image001&quot; border=&quot;0&quot; height=&quot;23&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjlIc_2RUbbhig18rTtnJqOtXXMOSf2gZ6JjVrEQR0URLIoUtlPeNSXmPbO_84FVJ_PsV3TF9XiU0-0GD8V5L9Mntodlp2kxBifAxFDIT97HHNJyGE_iHFOIQtLZRQdK8Rix7KYlzza3E/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image001&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Agregando y removiendo Items&lt;/b&gt; &lt;br /&gt;
Para agregar un objeto se realiza mediante el método Add (inserta el nuevo elemento en la última posición), AddRange(pasándole un array de elementos), el método Insert (inserta en la posición indicada) o el InsertRange (se en lugar donde inserta los elementos y el array de elementos). &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO5GhJb1c388RYsjXM3kCN63BuiqMLpkhRZb8kiAlR26WZ7vwbRU-FKZxJvLj43oZAtyUCCF5eaAkX7YUaHVDUDGm-924Qsv_gTLB0dlT7ZEkzQElHYCBxbp9T8kwv6OU4EDFacoat0Q8/s1600-h/clip_image002%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image002&quot; border=&quot;0&quot; height=&quot;129&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOmL296mGHViJLhzmtnNauEAqJZ8ytF5rHFNl78bDPCGQ4Y_S6jRL6Ry95dkd68oeP3WPtdDntWs4ntlvDIwwNufa2BHYwxBuUnEmFZQFhbjJOkDTSZwcRV-4hS5hfHNo0zsvJa7I6C9A/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image002&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Agregando mediante AddRange: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6Lnld_U-d11hIyzxH3Y9QLCmBxnKl_AApW3xXyKRmX-3iekG1ZDRgTp9VbK5DjY8q8n9i0yaBMYnN6hn3MpPDUO4BnMd1Hruef5tPItSelIqdgPjR2krFRAVqJySM-WCdCoZI7_matyE/s1600-h/clip_image003%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image003&quot; border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhv4osIS16ZSxCGMDy4IvRirOt1b6PDrLUwPPuDGhfPVP3SZWG7zyGQHGXrHuP9mIdSUdtEp9MmwKBliv0qagIeYfcLYiHxkCP98nHNXLSjXFa2lDi5VVYDvEk7cDoYF_bkAch0yb8BrQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image003&quot; width=&quot;238&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Usando insert: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk1v8gg5OVZbHFpto4-yKo7NZDE8VcTOr8Ume5t490jAP-lhshFuOFUzcr_3J9FJ83_zdgmJwzSL6jBQRZBvO5F3cWLZzMYEpAueGrPThz6yMmUqsdbfNYTHIojUqro3Ql7-WVhqFaz9M/s1600-h/clip_image004%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image004&quot; border=&quot;0&quot; height=&quot;67&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3_cNjaCEOAWVGZNI831DQgcX91qSv7eErXwW_64F-H3XxipYA1JD3MwmXmYhNm9o9EQ5eM86Xer8tNmQCyCRO0Xe3xUqrnzQj1JfYzSznklII9zSxEZK8Os0APbCgDEeSmozXuKaHkIU/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image004&quot; width=&quot;390&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para quitar elementos de la colección, se debe usar el método remove (pasando el elemento), removeAt(una posicion) o RemoveRange (el índice de donde se debe comenzar y la cantidad de elementos a borrar). &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQl5ltbOvr3llmNrlCzbcyVsuL4as1rhVmOK_HyQRjjt5YdxEJzTTD9rmIAKf-AZrSA8uzcWJ1hhbxZqcEyugVC8zRuN7B_cP1RnCGMOs60MxPFIGzvRzKpIft-UKXUaIt2lfkQQpLFzI/s1600-h/clip_image005%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image005&quot; border=&quot;0&quot; height=&quot;46&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYrt_axVZCtQH15jiT_xJw076HwmMLWjdvAMbyL88TCheoq8j-Xm4pv5rU3kuMmtJ3-ldcVvAMfAGu-VCu-ntA3cc3VB4iron5Y_Uct8RRwjjw2MrdkSZpgfDnnd5Hkp6OAQy_Z_Dm9Vg/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image005&quot; width=&quot;376&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisZBs0GqU-AnkuHWTmHV3B9TLNX-CXLaxMkj2kOyMMdxNRkrNnCxccxNFus0FKBMKKltQTwtrxF5SCqERkbL-V1E6tfdKXhZ2GeFoZjBGjudRI5Bx0LD90fmB-om7kk0iiJGXSXFdReuk/s1600-h/clip_image006%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image006&quot; border=&quot;0&quot; height=&quot;42&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsfgo3_21IKOVOVfSNGS7QfVscEd4hMie3AGnDnNGuADdS6vQcJAeUec-jA678OMNlLlQ3RvUe1bHFjjJG42vRVp7W_W81hRIdC9qUwYVCIcnZryBkYnT5rmAkiXgjqpLkmEIIsRZIgoQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image006&quot; width=&quot;275&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Las propiedades más utilizadas son: Count (para conocer la cantidad actual de elementos que contiene la colección) y Capacity (segunda indica la capacidad máxima actual de la colección para almacenar elementos.  &lt;br /&gt;
La capacidad de la colección aumenta en caso de ser necesario cuando insertamos un elemento, se realiza un redimensionamiento automático. &lt;br /&gt;
Para copiar un ArrayList, se puede realizar mediante CopyTo() &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFFUQiPm7ErlZ-mWitByhyphenhyphenCzB-Z6VqLATa98o7Uq74i_AtRlQllA8bJVka17a1wUXODi7TsAyDCyF5ciEx_ywZwnU4GOqDOQzQTSZAaQbGvmMqUJCpiSP-rkwn3Elcnm_Ks9fwXJjuiW8/s1600-h/clip_image007%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image007&quot; border=&quot;0&quot; height=&quot;44&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTb1dxYOa9mJpV9Ho-7lLr29UaNSeLVPryDTTLPd8BPv7-IhrNXQIAxBl3INr-7chFPrXtiD21x8k4n1HxX7PmUFLFPr-51YA0qA4zcnDwLKCLRkkqDCaVkPfHGS38vVfB4mvJ7nOl2uM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image007&quot; width=&quot;205&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Ordenando elementos&lt;/b&gt; &lt;br /&gt;
El método Sort es un método usado para ordenar los ítems de una colección (implementa la interface Icomparer, que solo tiene el método llamado Compare y este realiza comparaciones de cadenas en las que no se distingue entre mayúsculas y minúsculas) &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLVHshRsTmL-eFXlU9FRTGbp2Hbwyxggjtq9dBSjFzRWBeL0fGWoD4TUBFW5_eNGnOHBXbz49U07ANL9QdFzU0CH_YC-bGZSlDj8R0JHe-nqdE0K4wNbEu-_c7BNVhExZvk_t5JMQfK6w/s1600-h/clip_image008%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image008&quot; border=&quot;0&quot; height=&quot;53&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd_6o61unPoteNYfL4nJoBBpdXjrua2LHQNy88FYIc56zQyt88dlPywEiuboq4mtbWvLyFWJ5p3kSggCp4ni04EIEVVjACehwG3wa6V6LXifNzr7VzeX6-H85N72DI-8gDb2MvGSYTmAo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image008&quot; width=&quot;350&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Iterando a través de los elementos&lt;/b&gt; &lt;br /&gt;
Tanto los arraylist como las otras colecciones de este capítulo, soportan varias formas de iterar por su contenido. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLpHvVXZ02_nBDUZsMqFasHzdzPTPm29lqBOIUfChE09u3GsUnoNXrGG0QHxAofPoemiOefB-IuXaNAgw06UPB-L0scz88fsYRNQcq_X23nXsSyJyaJ9D5nW02sYhv4jMGL2LvDWgJIKI/s1600-h/clip_image009%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image009&quot; border=&quot;0&quot; height=&quot;45&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKWtCQYkhnJZ5gfdFD3doDxXXny258Yknw5oCSgykgJRXlN_68MQFz3nkk0nRXsFEIzskbU14X6oGK7pXC5tFsExCEFgIRYy1aVKmzhfprSRnwtqls4pYg3d5tkKnMr9lXAGvgs8-q9RQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image009&quot; width=&quot;368&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Otra forma: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSVRTXMOUMWeFIk1ncUPmMzzRLAhh6BQStIXyZPAdv6rpi6xXjU8QOOTDQbG7gt0CWhOHOiJNJ-Ogdp23h6GNQmj11dV_a3DIVCXNN7zi_9D_Rqza8svGni0a_efPB_cy-PpTGS0tylwg/s1600-h/clip_image010%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image010&quot; border=&quot;0&quot; height=&quot;62&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiZzeOMoHRqUHT9xCOTtHlPBcd26oAUK4KdubsCcR2qodvvlmizs48yWDW4YMCCpSN8yrJKh8AXX_hEQG5UkfCs8dcCTWGAkNMsL6rbc2TBePbAT52GBn_J5WJX4BE3xgy7xwjB09VEAU/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image010&quot; width=&quot;315&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
La clase ArrayList implementa la interface &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.ienumerator%28VS.80%29.aspx&quot;&gt;IEnumerator&lt;/a&gt; e &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.ienumerable%28v=VS.80%29.aspx&quot;&gt;IEnumerable&lt;/a&gt;. Podemos crear un IEnumerator asignándole el arreglo.GetEnumerator y manejarnos por este con todos los métodos que brinda la interfase IEnumerator. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2LSfy24z5m_LH6owH7J9b6CF_yah6WV-6X3W6e-S_gbs4qHA-nlvR_ga1JB1K1vFeCRRgb0wDNqKnog6QievJ2ZqFkoUQcr3-uZWiHm2pa8iqct5SQH1djoWvwYHKvwVYbutBL3i-lwU/s1600-h/clip_image011%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image011&quot; border=&quot;0&quot; height=&quot;92&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasrdgsWKJEYdQfkY4iYfY4lwbna43P7GuC-2nwjDjdOrjAWIbvKnbHTRPMlpVcUGySaQ2v_ttN-U12ECrIt7BNTseCICPBcPWNU8FjmMP0MbdtyeDdVn3srH4rVfVWioj5f8P1yCQ6KM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image011&quot; width=&quot;351&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 2- trabajando con listas secuenciales&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Las listas secuenciales son colecciones que deben ser tratadas de una forma metódica y usadas cuando nos interesa tener control sobre el orden en que los elementos son obtenidos de las mismas.  &lt;br /&gt;
Las clases Cola (Queue) y Pila (stack) son usadas para almacenar datos de forma secuencial. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.queue%28VS.80%29.aspx&quot;&gt;Clase Cola&lt;/a&gt; &lt;/b&gt; &lt;br /&gt;
Es una clase FIFO (primero en entrar, primero en salir, en inglés First Input First Output). Este comportamiento se puede asociar la Queue con la fila que se debe hacer en un supermercado cuando tenemos que pagar nuestros productos. En ese caso, el cajero atiende en el orden en que llegan las personas a la cola. &lt;br /&gt;
Ejemplo de manejo de una cola: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzxPd-xNC_J5t7L-wDd1Yt1lJ9jEcHDC3qzl-tl4qOuLpHAxZ3jFWfM7kjPUnsdEGzJr1mlMvK13sNSd79ZPgoouTzo6w1E7-nG9-PVJGMHmc8T-xTrHOokqsJ3cCQLHjiW-Sb39HVEB8/s1600-h/clip_image012%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image012&quot; border=&quot;0&quot; height=&quot;224&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKw9xPr20mR9FK4FElTV537dbLjZzVT716gIByeqOXhBAbkbHYEa7CeEpqPk0IygD9u45qhGOmvvBgDrVwz-DD_vPaLucFL_y0aVfERhRuAdheTAFsnaQA8WFhl6g_9maOFR-wFqsN9so/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image012&quot; width=&quot;448&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.collections.stack%28VS.80%29.aspx&quot;&gt;Clase Pila&lt;/a&gt; &lt;/b&gt; &lt;br /&gt;
La pila (Stack), es una colección LIFO (Last Input Fisrt Output, el ultimo que entre es el primero que sale) . Es parecido a una “pila” de platos en donde cada plato esta encima del otro y en caso de querer ingresar un plato a la pila, lo que se debe hacer es ponerlo encima del ultimo plato. Luego cuando se quiere sacar un plato de la pila, solo podemos coger el último plato. &lt;br /&gt;
Ejemplo de manejo de una pila: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLjBgQ4FlV9ArWU2GfJjas5nM1GkTORCidjcrNi9RdCDGvgaH2r6aNbsVNLB8Cmb0Sm0IPnW2qOEx-dsRcVatvfyz1l_skOGF1RdVpCW4ss_cZtL-G1F-zcLDmy0Qo3VNKTVzUIntMwDM/s1600-h/clip_image013%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image013&quot; border=&quot;0&quot; height=&quot;202&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIbGJUfJ2X9t633mc-0l6737_x0ZTmDUcImHN80LhYySHTn-RKyv-iZS4vYUZKiNsBcT-S4bDKHxtn7viZ7_cFP2OBwmXGhSFu1HwoAovnh0iJ63PVaf-GAQ0lrk6l3HmQcbGUQPwBQ6I/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image013&quot; width=&quot;470&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 3- Trabajando con diccionarios&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Los diccionarios son una colección que permite almacenar pares de objetos, donde el primero es una llave (key) que debe ser único y el segundo es su valor (value). &lt;br /&gt;
&lt;b&gt;Usando un diccionario&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Para los casos básicos se usa un HashTable, que es un tipo específico de diccionario. &lt;br /&gt;
Los diccionarios sirven para colecciones pequeñas, en cambio los hashtable sirven para cuando la colección es grande. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMfW_XlhO230KZ4qLAZc5wwwx64H7kTGt5hqfO3EX9zDoF_bCEOcn_ZGCXRo3xsklY4ks_U_Yjr51OxyaBx5nmV8yQtBFqxYqZwjQ5X0uKusNaeq3KIQa-0gvueCI3AZqlP1el4jaIEeo/s1600-h/clip_image014%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image014&quot; border=&quot;0&quot; height=&quot;137&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil6nSUYT2GI5TUvaSf_uTGf3aKil_SNZ84hyphenhyphenJla3zdmKtydreOOSjU-du7W8FzujJ_rejGihMRpZ_s9ywoECgBQC0YQkHOtZd33R3AsTC2BJTBSvFnStifyEkiV3LHBBY4g5-ssVyXIu8/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image014&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Utilizando la sintaxis “[key]” (por ejemplo: tabla [&quot;llave&quot;]), es posible actualizar el valor contenido o si no existe en la tabla, se inserta este nuevo elemento. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTJYpkyVpa_uiJGr7tFznPMWe9KdY_bpRYM0cdhatanB30etHLadAEoDIAR0xcE6vHMq21cnvti36BEwqNGeSQrOivygNKcGm1pU6vCc9U3s7wREcMtmcpWYn1AM0PuY0unQTJF93zUEw/s1600-h/clip_image015%5B8%5D.png&quot;&gt;&lt;img alt=&quot;clip_image015&quot; border=&quot;0&quot; height=&quot;49&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTqUF3zXB4xW3OY9h_hq7CEF-9cuYA1ex0jVR59mhElWjMFa-pvCyeqrCkm4uO1hnip9xFnirxD_bMd-lj0sOjXWr_4VpJn71HV8bolKAmDJ1e2ceFDpOTVistyqx1WEyG-qg-juJPPw8/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image015&quot; width=&quot;379&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para iterar sobre un hashtable o dictionary, se puede hacer de la siguiente forma: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE4N4l_Q8CB6vvZ5j5cY9d3JFhtKp1CEsb3xwN9rir0rYQBD2o5hg41rQ_I1iVL2TIacBIaVpduAj21Ke_DkblosilfdTKpEqprd-ra9srzcL0_0xnE3qF-pwY5oHRGs2zQJcIiZRBaH4/s1600-h/clip_image016%5B6%5D.png&quot;&gt;&lt;img alt=&quot;clip_image016&quot; border=&quot;0&quot; height=&quot;75&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyojsIyQl9q1XNwBMh0YeWuPS5ize0NsnyhVQqRSlNXzRz_70FHWa4LGTbwBgc0WpJR8NRBf_a5zktvleHrRfVcfQ_BhYOFk2ZMk-DJt3pHl9Wyqhl3ALxmkhW4vChQEsRXy87dfbXb5o/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image016&quot; width=&quot;220&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
La clase Hashtable soporta un constructor que acepta un argumento de IEqualityComparer, este permite comparar clases usando el modo CaseInsensitiveComparer (no tiene en cuenta las mayúsculas y minúsculas). &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk63Vf7EOKS1CcgAIRAbv-PLLngBsxcfMBf_ehiP8g1jTKz4ze6ThUtvoRoeEl9vThxlsGx6UiTSaKIAMy8-yONC6gVpa2eYKG_XvxYKME0P6hjU41uQh25qw9dmfIEM2CYjltbz0caYk/s1600-h/clip_image017%5B9%5D.png&quot;&gt;&lt;img alt=&quot;clip_image017&quot; border=&quot;0&quot; height=&quot;61&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVWKrkN4p8sNk76sYiWSZiW5Ed9Wa0m2lCAGf90VkYdnzbN8UOALBrfsZPJCabHeuFtg_mAhLKOEEJMiHWh8GxDH_rY4XKFlXe1GJkdrHB4pnc6uxiOjouWVTNPaRWR0bccKcOzr4IRRQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image017&quot; width=&quot;560&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Por lo tanto si escribimos Tabla[&quot;Algo&quot;]= “Valor”; es lo mismo que Tabla[&quot;algo&quot;]= “Valor”; &lt;br /&gt;
&lt;b&gt;Métodos más utilizados:&lt;/b&gt; &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Add&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;permite agregar un nuevo par llave/valor a la colección.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Remove&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;permite quitar un par llave/valor de la colección&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;Clear&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;permite borrar todos los ítems de la tabla.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;ContainsKey&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;permite saber si la colección contiene un par cuya clave sea la que se le pasa como parámetro.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;121&quot;&gt;&lt;b&gt;ContainsValue&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;478&quot;&gt;permite saber si la colección contiene un par cuyo valor sea el que se le pasa como parámetro.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Usando la clase SortedList&lt;/b&gt; &lt;br /&gt;
La clase SortedList es un tipo de la clase diccionario que tiene pares de clave y valor ordenados por claves, su manejo es similar al de un diccionario. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLUJFo3yeyAsSUXr0wMObKcNAi3UjpLVTeADEOSOzxL3QFLM3plRxJxQcSRle4kW5LJfunuK_Vxh140EEp-qlv2iaHIjCdygn6z0hzCLLJ_eIm6KJj7R9YDywlyTdIaWHFeM7_gH0VeMg/s1600-h/clip_image018%5B8%5D.png&quot;&gt;&lt;img alt=&quot;clip_image018&quot; border=&quot;0&quot; height=&quot;183&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmxhEsltubt3ERoqEofYA-M0wGwZ61FIXg-D87ZIX-KdImx68rlzWAsmigxykIMCpH7SdpT4trrtII4qFlzWNrGA0AI6ek-jo9kKnTdaXd3KzjJKsKATvZrHdJOjaMvwJ_oD5wFbPgaNM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image018&quot; width=&quot;476&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Por lo tanto al mostrar por pantalla se va a obtener: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDgx_TrRSEsMOx-TfrFCpa4UOTV3tggMQBHMZmgYbBRu2-B5o5qJhKsvzFQQui_eqqp_5govQ58wLik9UKkjFy09159JoElw9nxuw_9sEJq5yBrriIucMQgp42sAd9sGceLJPdtmMXzrQ/s1600-h/clip_image019%5B6%5D.png&quot;&gt;&lt;img alt=&quot;clip_image019&quot; border=&quot;0&quot; height=&quot;65&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRKtpOpRwd08SF2R9Dj4rE5RZcyXgLYpmaE8rvbNksLWPDIJ_2D6zx8YP4ruQVTILudLiEzI6BJsosIGO0t0C5en5rtVCxX7kGJkGAoR-gYy6as5aw4rAncudEKx3KxnciRfeIIayJw8I/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image019&quot; width=&quot;136&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Diccionarios especializados:&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;ListDictionary: &lt;/b&gt;Funciona de la misma forma que un Hashtable, solamente que más eficiente para pocos datos, ya que Hashtable causa mucho overhead. &lt;br /&gt;
&lt;b&gt;HibrydDictionary:&lt;/b&gt; es para cuando uno no conoce el tamaño de su arreglo y desea hacerlo de forma eficiente. Para gran volumen de datos se comporta como un Hashtable y para pocos como un ListDictionary. &lt;br /&gt;
&lt;b&gt;OrderedDictionary&lt;/b&gt;: es como un HashTable pero ordenado, y de una forma particular que uno desee.  &lt;br /&gt;
&lt;blockquote&gt;Tiene como propiedades: Item, para acceder a cierto índice. &lt;br /&gt;
Y como métodos Insert, para insertar en cierto índice un key/value. RemoveAt, remover tal elemento en tal índice.&lt;/blockquote&gt;&lt;br /&gt;
&amp;nbsp;&lt;b&gt;&lt;i&gt;....................................................................................................................................................   &lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://vicrodg.blogspot.com/2010/10/capitulo-4-colecciones-y-genericosparte_28.html&quot;&gt;2da parte &amp;gt;&amp;gt;&lt;/a&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;.....................................................................................................................................................&lt;/i&gt;&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/5491422955144783444/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-4-colecciones-y-genericosparte.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/5491422955144783444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/5491422955144783444'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-4-colecciones-y-genericosparte.html' title='Capítulo 4 – Colecciones y Genéricos–Parte 1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjlIc_2RUbbhig18rTtnJqOtXXMOSf2gZ6JjVrEQR0URLIoUtlPeNSXmPbO_84FVJ_PsV3TF9XiU0-0GD8V5L9Mntodlp2kxBifAxFDIT97HHNJyGE_iHFOIQtLZRQdK8Rix7KYlzza3E/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-1424749967711199980</id><published>2010-10-26T12:27:00.003-03:00</published><updated>2011-03-17T12:44:22.646-03:00</updated><title type='text'>Capítulo 3 – Buscando, Modificando y codificando texto</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 1 – Formando Expresiones regulares&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
Una expresión regular es un conjunto de caracteres que pueden ser comparados con un string para determinar si este cumple con los requerimientos especificados en la expresión. &lt;br /&gt;
Soportan caracteres especiales y operadores, como por ejemplo: .  &lt;br /&gt;
* ? + [ ] ( ) { } ^ $ | \. &lt;br /&gt;
Los más usados comúnmente son “^” para indicar el comienzo de la cadena, “$” para indicar el final, “?” para indicar un carácter opcional, “.”para indicar cualquier carácter y “*” para indicar un carácter repetido.&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; style=&quot;width: 514px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;. &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;coincide con cualquier carácter individual &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;* &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;coincide con cero o más elementos anteriores &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;+ &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;coincide con uno o varios elementos anteriores &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;? &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;coincide con cero o uno de los elementos anteriores&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;() &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;recuerda el contenido del paréntesis como elemento &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;[] &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;coincide con un elemento de la lista &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;- &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;crea un intervalo en una lista &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;| &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;o &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;^ &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;coincide con el principio del campo &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;$ &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;coincide con el final del campo &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;17&quot;&gt;\ &lt;/td&gt; &lt;td width=&quot;495&quot;&gt;usa caracteres de escape con cualquiera de los elementos anteriores &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como usar expresiones regulares para el pattern matching?&lt;/b&gt; &lt;br /&gt;
Para usar las expresiones regulares, se debe referenciar System.Text.RegularExpressions . Usando el método estático &lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.text.regularexpressions.regex.ismatch%28VS.80%29.aspx&quot;&gt;Regex.IsMatch&lt;/a&gt; se puede comprobar si una cadena cumple un patrón dado. &lt;br /&gt;
Ejemplo de expresión regular: &lt;br /&gt;
&lt;b&gt;^\d{5}$&lt;/b&gt; &lt;br /&gt;
Significa &lt;br /&gt;
&lt;b&gt;^&lt;/b&gt; Comienzo del string, si es multilínea, va a matchear con cada línea &lt;br /&gt;
&lt;b&gt;$&lt;/b&gt; Fin del string, si es multilinea, va a matchear con cada línea &lt;br /&gt;
&lt;b&gt;\d&lt;/b&gt; significa dígitos numéricos &lt;br /&gt;
&lt;b&gt;{5}&lt;/b&gt; significa que debe haber cinco dígitos numéricos secuenciales. &lt;br /&gt;
A continuación un cuadro un poco más explicativo y con ejemplos…&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;border-collapse: collapse; border: medium none; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;   &lt;td style=&quot;border: 1.5pt double windowtext; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Carácter&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: windowtext windowtext windowtext -moz-use-text-color; border-style: double double double none; border-width: 1.5pt 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 51.24%;&quot; valign=&quot;top&quot; width=&quot;51%&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Significado&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: windowtext windowtext windowtext -moz-use-text-color; border-style: double double double none; border-width: 1.5pt 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 36.74%;&quot; valign=&quot;top&quot; width=&quot;36%&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Ejemplo&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;\&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 51.24%;&quot; valign=&quot;top&quot; width=&quot;51%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Indica que el siguiente carácter   normal debe ser considerado como especial. También se utiliza como carácter   de escape para los caracteres especiales.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 36.74%;&quot; valign=&quot;top&quot; width=&quot;36%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;/\n/&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt; encuentra un salto de línea. Si se desea buscar   el carácter &#39;\&#39;, habrá que utilizar &lt;b&gt;/\\/&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;^&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 51.24%;&quot; valign=&quot;top&quot; width=&quot;51%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Se utiliza para encontrar el   comienzo de una línea.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 36.74%;&quot; valign=&quot;top&quot; width=&quot;36%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;/a/&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt; encuentra una &#39;a&#39; en cualquier lugar, pero &lt;b&gt;/^a/&lt;/b&gt;   haya una coincidencia con el carácter &#39;a&#39; si se encuentra al comienzo de una   línea.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;$&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td colspan=&quot;2&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 87.98%;&quot; valign=&quot;top&quot; width=&quot;87%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Se utiliza para encontrar el   final de una línea.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;*&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 51.24%;&quot; valign=&quot;top&quot; width=&quot;51%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Encuentra coincidencia del   caracter que le precede cuando aparece 0 o más veces en la cadena.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 36.74%;&quot; valign=&quot;top&quot; width=&quot;36%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;/hola*/&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt; encuentra coincidencias en las cadena   &quot;hol&quot;, &quot;hola&quot; y &quot;holaaaa&quot;.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;+&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td colspan=&quot;2&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 87.98%;&quot; valign=&quot;top&quot; width=&quot;87%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Igual que el &#39;*&#39;, pero cuando   el caracter aparece 1 o más veces.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;?&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td colspan=&quot;2&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 87.98%;&quot; valign=&quot;top&quot; width=&quot;87%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Igual que el &#39;*&#39;, pero cuando   el caracter aparece 0 o 1 vez.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 51.24%;&quot; valign=&quot;top&quot; width=&quot;51%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Se utiliza para encontrar   cualquier caracter que no sea un caracter de nueva línea.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 36.74%;&quot; valign=&quot;top&quot; width=&quot;36%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;/.sa/&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt; encontrará coincidencias en las cadenas   &quot;casa&quot;, &quot;cosa&quot; y &quot;cesa&quot;, pero no en   &quot;asa&quot;.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;(x)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td colspan=&quot;2&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 87.98%;&quot; valign=&quot;top&quot; width=&quot;87%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Encuentra coincidencias con   &#39;x&#39;, y recuerda el patrón para su posterior utilización.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;x|y&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td colspan=&quot;2&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 87.98%;&quot; valign=&quot;top&quot; width=&quot;87%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Encuentra coincidencia si   aparece el caracter &#39;x&#39; o el caracter &#39;y&#39;.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;{n}&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 51.24%;&quot; valign=&quot;top&quot; width=&quot;51%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Encuentra coincidencia si hay   exactamente n apariciones del caracter que precede.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 36.74%;&quot; valign=&quot;top&quot; width=&quot;36%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Por ejemplo, &lt;b&gt;/a{3}/&lt;/b&gt;   encuentra coincidencia en &quot;holaaa&quot;, pero no en &quot;holaa&quot;.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;{n,}&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td colspan=&quot;2&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 87.98%;&quot; valign=&quot;top&quot; width=&quot;87%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Encuentra coincidencia si hay   al menos n apariciones del caracter que precede.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;{n,m}&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td colspan=&quot;2&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 87.98%;&quot; valign=&quot;top&quot; width=&quot;87%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Encuentra coincidencia si hay   como mínimo n y com máximo m apariciones del caracter que precede.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;[xyz]&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 51.24%;&quot; valign=&quot;top&quot; width=&quot;51%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Representa un conjunto de   caracteres individuales.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 36.74%;&quot; valign=&quot;top&quot; width=&quot;36%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;/[aeiou]/&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt; encuentra coincidencias con cualquier vocal. Si   se utiliza el caracter &#39;-&#39; se pueden definir rangos. Por ejemplo, &lt;b&gt;/[0-3]/&lt;/b&gt;   encuentra coincidencias si aparecen en la cadena los caracteres &#39;0&#39;, &#39;1&#39;, &#39;2&#39;   o &#39;3&#39;.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;[^xyz]&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td colspan=&quot;2&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 87.98%;&quot; valign=&quot;top&quot; width=&quot;87%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Representa un conjunto de   caracteres individuales complementario. Encunetra coincidencias con aquellos   caracteres que NO aparezcan en el conjunto. Al igual que en el caso anterior,   con el &#39;-&#39; se pueden definir rangos.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;[\b]&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td colspan=&quot;2&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 87.98%;&quot; valign=&quot;top&quot; width=&quot;87%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Encuentra coincidencia con el   caracter de retroceso.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none double double; border-width: medium 1.5pt 1.5pt; padding: 0cm 5.4pt; width: 12.02%;&quot; valign=&quot;top&quot; width=&quot;12%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;\b&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 51.24%;&quot; valign=&quot;top&quot; width=&quot;51%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Encuentra coincidencias con los   límites de las palabras.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none double double none; border-width: medium 1.5pt 1.5pt medium; padding: 0cm 5.4pt; width: 36.74%;&quot; valign=&quot;top&quot; width=&quot;36%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;&quot;&gt;Por ejemplo, &lt;b&gt;/\bola/&lt;/b&gt; encuentra   la cadena &quot;ola&quot; en &quot;Viene una ola&quot;, pero no en   &quot;Viene una cola&quot;.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Las expresiones regulares son muy útiles para filtrar el input del usuario. Pueden ser usadas para machear con patterns complejos.  &lt;br /&gt;
&lt;br /&gt;
Ejemplo de dirección de e-mail. &lt;br /&gt;
&lt;br /&gt;
Lo vamos a ir analizando de a poco…&lt;img alt=&quot;Guiño&quot; class=&quot;wlEmoticon wlEmoticon-winkingsmile&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbn2DHW6irJcxlukAXr2Ym7vSxOCjSq532OF6OCncAzL3XiYo-V9bAuwauWt2VNvSyeUma9IrmxcI_-J49CEU0Q_JHcIhtI8E5C7S7CiGeAV-kolite78oztw7MXsfCrS3VHKdv0IKe-g/?imgmax=800&quot; style=&quot;border-style: none;&quot; /&gt; &lt;br /&gt;
Primero, una expresión regular delimita su inicio con &lt;b&gt;/^&lt;/b&gt; y su fin con &lt;b&gt;$/&lt;/b&gt;. Por lo tanto tendría la forma: &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #9bbb59;&quot;&gt;/^ Expresión $/&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Un email se compone de tres partes: &lt;br /&gt;
Nombre usuario + @ + servidor + dominio &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Nombre de usuario y el servidor&lt;/b&gt; &lt;br /&gt;
Ambos deben empezar por una letra o número (&lt;b&gt;\w&lt;/b&gt;) y por lo menos debe aparecer una vez (&lt;b&gt;+&lt;/b&gt;), puede contener o no (&lt;b&gt;?&lt;/b&gt;) Puntos y guiones (&lt;b&gt;\ .-&lt;/b&gt;) y terminar con letras y números &lt;b&gt;\w+&lt;/b&gt;. Esto se puede repetir cero o varias veces (los puntos, guiones y letras), por lo tanto se coloca entre &lt;b&gt;()*&lt;/b&gt;, para ambos casos quedaría: &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #9bbb59;&quot;&gt;\w+ ([\.-]?\w+)*&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #9bbb59;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Dominio&lt;/b&gt; &lt;br /&gt;
Va al final, detrás de un punto y puede tener 2,3 o 4 letras ({2,3,4}) &lt;br /&gt;
Además se pueden tener varios dominios seguidos (.com.ar) por eso debemos poner (+). &lt;br /&gt;
Su expresión regular queda: &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #9bbb59;&quot;&gt;(\.\w{2,3,4})+&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Uniendo todo, la expresión regular final sería: &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #9bbb59;&quot;&gt;/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3,4})+$/&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #9bbb59;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;Aclaración: El tema es un poco más largo, pero creo que con el ejemplo anterior, la idea se entiende,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;igualmente les recomiendo entren &lt;/span&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.text.regularexpressions.regex.aspx&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ffc000;&quot;&gt;acá&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;span style=&quot;color: white;&quot;&gt; para ver que otros caracteres especiales se pueden usar, y otras opciones de configuración.&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 2 - Codificando y decodificando&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
Cada string y texto es codificado usando diferentes estándares de codificación. &lt;br /&gt;
Existen diferentes tipos de codificación: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;ASCII: asigna caracteres para 7-bit bytes usando los números desde el 0 al 127. Al inicio no incluía los caracteres que no estaban en el alfabeto inglés (solo tenía letras del alfabeto ingles en mayúscula y minúscula, números, puntuación, y algún otro carácter especial de control).&lt;/li&gt;
&lt;li&gt;ANSI: (de 8-bit byte) tuvo una solución para este problema y utilizo del 0 al 127 los códigos ASCII y los demás, desde el 128 al 255, para otros valores específicos del lenguaje elegido.&lt;/li&gt;
&lt;li&gt;Unicode: es una codificación de páginas masiva, con miles de caracteres que soportan muchos lenguajes y scripts. No es de un tipo específico de codificación, existen varios tipos. El framework de .Net utiliza Unicode UTF-16 para representar caracteres y a veces UTF-8 internamente.&lt;/li&gt;
&lt;/ul&gt;System.Text soporta las siguientes codificaciones: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;UTF-32.- Utiliza UTF32Encoding para convertir desde y hacia un UTF-32&lt;/li&gt;
&lt;li&gt;UTF-16.- Utiliza Unicode Encoding para convertir desde y hacia un UTF-16&lt;/li&gt;
&lt;li&gt;UTF-8.- UTF8 Encoding&lt;/li&gt;
&lt;li&gt;ASCII.- Codifica el alfabeto latino. Utiliza ASCII Encoding&lt;/li&gt;
&lt;li&gt;ANSI/ISO.- Encoding&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Usando Encoding Class (clases de codificacion)&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Se puede usar el método Encoding.GetEncoding para devolver un objeto encoding para una especificada codificación. &lt;br /&gt;
Encoding.GetBytes convierte un string unicode a su representación en bytes en una codificación especificada. &lt;br /&gt;
Encoding.GetEncodings obtiene un arreglo de EncodingInfo que soporta el framework. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyanFop_HEPqhNcZGzcKEqaGTvPlxSYINAj_Di3ALu3CXVfzWDmjJHrtBkTW0M1Dt77PxRamjCn65MHwsR7R7dRZkPZOyeCzC9zej6w4O3u_-gqXWOB1LS-zBKvNiUhmB6vh36BaveRFk/s1600-h/image%5B5%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;90&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAm72B9U4YXlcrJvsLiRa2vs4NsnimooTQdrv5wZzbhzn0BSTRbVKpZ3tU3xCmvCQkvISpXFX31dS4lE2KQjADLvni2DEx__5AaKBPByvXnhh9tQ1Lc-EEWSqJUZ8KmrJLxX8yNhExqks/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;530&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como especificar el tipo de codificación cuando escribimos un archivo?&lt;/b&gt; &lt;br /&gt;
Para especificar el tipo de codificación cuando se escribe un archivo, se usa una sobrecarga de su constructor que acepta el objeto Encoding. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht18Gm9tKN6Ewsz1j25m2D7dZXYFRdqLXU8r01GEv58JOFwo2jKTX-RjsV0aRGaS2Wk-KNZjczHJNxVZisRNoHZioI3_0YXJUxgxDTK36vxf8bfmAgZqFILwkf6nI7LN4crcIcfJ9VJok/s1600-h/image%5B15%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;23&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_jm38OyP_n8cmwxE8edW2jddMOvYM2CARbx5IIGOZQNyeRowyiotZ4Ky8QAWK9rLyqThN_2NPxuPdY1SCcU7aKCSYF9eCVTSEhS0ClSZk4XereXHkn9gQKnAlLJ639JK3cJDuH0uFdtA/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;556&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Encoding es una enumeración que contiene opciones como: Default, UTF32, UTF7, UTF8, ASCII, etc. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Como especificar el tipo de codificación cuando leemos una archivo?&lt;/b&gt; &lt;br /&gt;
Se realiza de la misma manera, suplantando streamWhiter por StreamReader, el constructor del StreamReader posee una sobrecarga en donde se le debe pasar: nombre del archivo, tipo de codificación, y un parámetro de tipo bool, detectEncodingFromByteOrderMarks&amp;nbsp; que detecta la codificación examinando los tres primeros bytes de la secuencia. &lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSRa97qquboAys_SULvltVeEPQXH8wwJr4QgF-5qYQphDTSlVtTvTjHJI1RYzA5iuza0tctNHRj6KQxBivULF6eCJ7nBIZuyBwe-FS1Va3S8TkZMaTUzeucHSNv3mEDiCjsxlO5vXgJRM/s1600-h/image%5B13%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;24&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilaFWdVvFczMDVIs-moRpmvdCB8y6Jn32byojxhaUaOj7abPrieZXgLI5hyyM1EsQa72EpCE0UNjyAZ6TfbwJxbnoVuBAoedZFWcmo0muXgZ5zJuXDbYlSWhJF1qL8GJ6v-V5sirYtHFc/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;539&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.ziddu.com/download/14224319/Resumen70536-cap-03.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF&lt;/a&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;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; &lt;a href=&quot;http://www.4shared.com/file/m04wiS87/Cap_03.html&quot;&gt;Codigo Ejemplo&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/1424749967711199980/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-3-buscando-modificando-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/1424749967711199980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/1424749967711199980'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-3-buscando-modificando-y.html' title='Capítulo 3 – Buscando, Modificando y codificando texto'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbn2DHW6irJcxlukAXr2Ym7vSxOCjSq532OF6OCncAzL3XiYo-V9bAuwauWt2VNvSyeUma9IrmxcI_-J49CEU0Q_JHcIhtI8E5C7S7CiGeAV-kolite78oztw7MXsfCrS3VHKdv0IKe-g/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-4255776165994536394</id><published>2010-10-25T16:12:00.004-03:00</published><updated>2011-04-15T09:04:34.516-03:00</updated><title type='text'>Capitulo 2 – Input/output (I/O) - Parte 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 3 - Streams de compresión.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
.Net dispone de dos algoritmos de compresión, &lt;a href=&quot;http://es.wikipedia.org/wiki/Gzip&quot;&gt;Gzip&lt;/a&gt; y &lt;a href=&quot;http://es.wikipedia.org/wiki/Deflate&quot;&gt;Deflate&lt;/a&gt;, ambos libres de patentes y estándares de la industria. Ambos están limitados a un máximo de 4GB de datos sin compresión. &lt;br /&gt;
La clase &lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.compression.gzipstream%28VS.80%29.aspx&quot;&gt;GzipStream&lt;/a&gt; permite comprimir datos a través de otro Stream usando el método de compresión GZIP. &lt;br /&gt;
La clase &lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.compression.deflatestream%28VS.80%29.aspx&quot;&gt;DeflateStream&lt;/a&gt; permite comprimir datos a través de otro Stream usando el método de compresión DEFLATE. &lt;br /&gt;
La diferencia entre estos dos es que Gzip almacena más información de los datos comprimidos para poder usarse con herramientas como gzip. Deflate tiene menos información y por ello es más efectivo.  &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como comprimir datos con un compresión stream?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Se debe abrir el archivo que se va a comprimir y crear un archivo nuevo en el que se va a escribir.  &lt;br /&gt;
Crear un GZipStream donde le paso el stream de destino, y el modo de compresión (en este caso Compress) &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0pweq2auil6sDZpGq-FBHxxq-b9VeS3cqxPX8h6TejscfbKJkhPRkztGDFfY4CUjupm8qaV5mE2wS_yP1ckuHdHLfJ-1JqA2T4NR15ap6x2m6WNPY7UzjV-YPx-Yfnp-ph3r17piR74g/s1600-h/clip_image002%5B5%5D.jpg&quot;&gt;&lt;img alt=&quot;clip_image002&quot; border=&quot;0&quot; height=&quot;95&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigk-ze76F6BjEc232TMjhkEYTgyfcXmW0dXVnx3y_xTbi0QsnzaLXbgrR3BSrpKL_s4Kh8KBlKIA9iJ_jZlk5ohWTFic23h7pDdapSqDXKjJCeN1NTRWIgcs1c9c71zyXtkkEvkox8Pyw/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image002&quot; width=&quot;568&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para comprimir los datos con un DeflateStream solo se debe cambiar la parte donde se crea el GZipSteam por DeflateStream &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgphZiqF-KWByBPuhCQTtVr3LoopuweiiXv17PwTnuRXdsMqekl_1V1yQdWM1Kd4cr4FajcXCLO6DVu4VLHQ9kq7m4mDYiTABdI9l2BT65M9QA5vPoBRfwI9yqg588pA7584CFlqjU_7SE/s1600-h/clip_image004%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;clip_image004&quot; border=&quot;0&quot; height=&quot;42&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzKNHvIOg_3MBa1mLWYUaA3B0-Ai8vR8xtu22TS2DjDHtXmV5eSe_QrbKRe5qEyFWNv_7d81BUhFLL8sgHCwAlZMyuth07fUWNiwgTAnhMwOnc63ApnWfQ8VeoI7M3xKlqERbulkN6GVQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image004&quot; width=&quot;577&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como descomprimir datos con un compresión stream?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6VOjnfZFPrv2O3MQVJRF6A7Vvwq5JjiEfxr3BS0j_LjqDYEUPvnQRgDlQeVeg3p96exERLW_Dh9eyYSlseqKHLbeLc2uRvX1DFdDfhMw_C1TbYAc-u1FcKxiA4UL_LKz7nza6hjupKHw/s1600-h/clip_image006%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;clip_image006&quot; border=&quot;0&quot; height=&quot;99&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqOuKCDKIazF0ZX8UZNGVpThLkpJoQsqUkSZK5eog9VWeJSdwpwLOcc6mukmhTN8HD5aLE5y_qEUe2iL5mKN1gPzqYxf9zWbKtwL2lQMS4UqI-msoeCAWOgiKDr9IS2mwWOlza2BZE6bs/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image006&quot; width=&quot;576&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para descomprimir los datos con un DeflateStream solo se debe cambiar la parte donde se crea el GZipSteam por DeflateStream &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibQnPlzNkPrzhsI9iV8jGw3bPmhq5z5EmoY7j53fcMRK_jDrgGWKIp3MvgUlKqNMOwCG7JMNEpB-cq2VEF9A5ihbGSLfDbBdk-jLBwQ3LN0imhT2MhZPt4WOfgV-p8hUWaupNd9ZlFOZY/s1600-h/clip_image008%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;clip_image008&quot; border=&quot;0&quot; height=&quot;37&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-C0GhVcpEbbwoIM7jFKu46Mq3k94F-PWbJQ2GbMjOq-QuYeU5rghOreXr9QESTfaU04sRPxZeVjHA4GdoiSDMe2KWLpEkauOQ9fanfkMKLRoBOOP27aZjlYUM8rYrCh06XEfe7X09nzM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image008&quot; width=&quot;578&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 4 -Trabajando con almacenamiento aislado (Isolated storage)&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
En la actualidad hay una gran cantidad de malware (virus, spyware, adware, gusanos, troyanos, etc.).  &lt;br /&gt;
La utilización de un almacenamiento aislado permite que las aplicaciones que no son de plena confianza almacenen datos de una forma controlada por la directiva de seguridad del equipo. Crea un área exclusiva de almacenamiento para una aplicación o un componente, al que sólo esta puede obtener acceso. Por lo tanto, cada aplicación tiene su propia área de archivos asignada automáticamente , completamente aislada de otras aplicaciones. &lt;br /&gt;
La clase &lt;b&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.io.isolatedstorage.isolatedstoragefile_members%28v=VS.80%29.aspx&quot;&gt;IsaolatedStorageFile&lt;/a&gt;&lt;/b&gt;: permite crear archivos y directorios en el isolated storage. Se encuentra en el NameSpace System.IO.IsolatedStorage. &lt;br /&gt;
&lt;b&gt;IsolatedStorageScope &lt;/b&gt;es un enumerador que describe el scope (ambito) del almacenamiento aislado. &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.io.isolatedstorage.isolatedstoragefilestream%28v=VS.95%29.aspx&quot;&gt;IsolatedStorageFileStream&lt;/a&gt;:&lt;/i&gt;&lt;/b&gt; es un stream utilizado para crear archivos en el isolated storage. Deriva de la clase filestream, por lo tanto tiene casi las mismas propiedades y manejos. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como crear un almacenamiento?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Antes de grabar información en tu Isolated storage, se debe de determinar el ámbito donde se quiere guardar la información. Se puede elegir entre 2 métodos: &lt;br /&gt;
- Assembly/Machine.- Crea un almacenamiento para mantener la informacion que es específica para la llamada del assembly y de la máquina local. Ideal para crear datos a nivel de aplicación: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqSE11S5xAOuq7VYsVi1qwi12WKelq_zO9M5mkztKdvYR-2K6y-aEdvzcsab8rIkax7LQjFTZbeiZzGOJoqoP-EY4_BFugJXTyU-O0KB_otJYTAMP1kw2PBfb7tAgcA-iOhudsfJq9q4U/s1600-h/clip_image009%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image009&quot; border=&quot;0&quot; height=&quot;25&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFm7333msOhomd_U8cfSGUCRXqzoTdajChoUXNyPo-S8HMTnVG5eLb1aKwk63xpgB9dVO7u-eZvFYB1jgdN40hdzpmyrEiKoxXBLUAoLsK7Q4DWzNVli2nzX97D41Nvk9XBlewYhB5OVA/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image009&quot; width=&quot;574&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
- Assembly/User.- Este método crea un almacenamiento que guarda información que es específica para la llamada del assembly y el usuario actual. Es útil para crear datos a nivel de usuario: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXLKj1Gdi2QYfezYuDlyYSCdIVrYV4IrBRX23Y_m4-5g8OM_VgxzkiBGMUQ836drEfRmsl8V6fp7IazhPXeX594Gp667lezYrRHWJJ3WMddJHVOhE4Ndis5Zegpr4IvJQhBm36VZIP2eA/s1600-h/clip_image010%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image010&quot; border=&quot;0&quot; height=&quot;23&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW0F_lD3bcXlldZz8GjTfjtmQExuo7kOrWVbPVJubXWnQdHBG8AjerdSX1v_1keFRTfj8NGGBSmWVcgXKf1EsNL5JIo-j-O4l_UEhZ_glg9C0pSe8N3q03HhnW-pIDeowSKfbrmDqcP1Q/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image010&quot; width=&quot;580&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Leyendo y escribiendo información en un almacenamiento aislado&lt;/b&gt; &lt;br /&gt;
Se crea un objeto IsolatedStorageFileStream creando una instancia de la clase, especificando cual el nombre del archivo IsolatedStorageFile que se va a incluir dentro. &lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoJon-kWSFgQN1Vy3nHQTIfpMUUcKyG0B7U6GbMC-UvyU6_IxsFB1nDGty2yglnobCPVEN89EqNEXvqEp07wDP3s44D0LKpiYjzAk8645ftNclmWEmNEAH60Aq1dgUCN4L5PO9m4rCFFc/s1600-h/clip_image011%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image011&quot; border=&quot;0&quot; height=&quot;59&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHkL-P7l60XotBgHAqVyTh61NJwx8FtCzDTTmE29lorVkpcyi4Enpuu8G1GhfQxN1kb1aA0D40uCW_RJhjJ_o-f36A3YpsG6vWFoW9IGfsGo5cxSV5IJj-9AMcq5rMfd3WPl6UhZD_Wk8/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image011&quot; width=&quot;574&quot; /&gt;&lt;/a&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
Después de crear el almacenamiento se puede manejar de la misma manera que un fileStream. Por ejemplo para &lt;b&gt;escribirlo&lt;/b&gt;: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIdsU_Ur9sm2CD9tnQ42zhGYGYycMz28mq3sx5mIRF6vRfVjsyjlC0ZXcLK77xV1hbgOOJwLPd_uAU98Hqf8VpWyNTN4Twyou9hn2O2k2KOQ5bRattmNhkr5TmApFNb3XMsXgPOWobbsg/s1600-h/clip_image012%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image012&quot; border=&quot;0&quot; height=&quot;56&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBKN1QP2rL5w3ntqsSjSsVC0UBN21_I7TPAmPQs7Wk9Y1tlljIs_m-pompu91hIVbZZLSxDMqw0i-crvf6-Uk6kHEsawDG5Bm_HHncERCe6NaFdCVjl12pTXHwmOl1uDg1MfJ2k5r3eHk/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image012&quot; width=&quot;372&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Cuando usamos IsolatedStorage no se puede verificar si un archivo existe ahí, esto se debe realizar, por ejemplo preguntando si un arreglo que contiene los nombres de los archivos del IsolatedStorage es mayor a 0: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidu_9_Dya_il92-wiCY1YPe1C7lfPEbFl8VgPx-vl9ZVWslJMFZIREnNCll-l5Fhv73MvPJlU8G4-0J-S9_BXYiBA2gaQExeskQ4yITJ8JTbEcc90KZzdIwLFLA0TwA7yzvOGVfPPv1mg/s1600-h/clip_image013%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image013&quot; border=&quot;0&quot; height=&quot;86&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF4-G8IEo7Nm4NNojPIrAlTao7p9SxEKrkIDkg0THr9IQGioCsXWX498UYDxmQxB53MDtP0FDagkO-Tjefgu4AVF-XLiKcpRrNl-ROcYe_i3ksi8KnxJIKO8-maGmTLcPna30I0IKWAVo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image013&quot; width=&quot;442&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;Como usar directorios en un almacenamiento aislado?&lt;/b&gt; &lt;br /&gt;
En un isolated storage también tenemos permitido crear directorios, esto es mediante CreateDirectory y después de crear el directorio se pueden crear archivos, especificando el nombre, el FileMode a usar y el objeto de almacenamiento creado: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeur3yaBsZuCDWTtujClvBhpX73e_YL0LkVRvcNdAqs38SAPlFvrIHVUJxgkse7GVr-gy0cGKFTYf0jo5qbvlAbc2SRi-cm2RwFicKbGAzEDe1loFYkp4e-lI0GLiuDAjyxlt3nuwNIiw/s1600-h/clip_image014%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image014&quot; border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOWEvbHbiGgddbjW1n98XuGCeaCR1A2OedHkZ99HDQ5lRxCF3nHDd3u3NiYJ4iYzBfAPQKSrdTCIb0iQB89IYIGAwNV0DW-DPNPuvxioUAiP5VgS5kev4AyFZ2nObmYcIIOZq1bbd6YIk/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image014&quot; width=&quot;466&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Para obtener los archivos que tiene ese directorio se realiza de la siguiente forma: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiryU1PKvbhvvclYYYLslaSk4EbJiCir_Mea4ZDST8dx4JUF8thMnWvTNnj4KHQcH9zLtxdZJilZFQXOUatZMDuZ9SJwI_cnLc796jhj5GEPewt8EQskblVxmeh7IX3ElJ8wcxbe_rzmjA/s1600-h/clip_image015%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image015&quot; border=&quot;0&quot; height=&quot;85&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWWEi8QgOeuQ6mNQ0wHyF24cpXXDF7ADJkYuVDEjfy44i6CjUvNKb-L930afM5lZYIPPiS4NMfEmN22lZMC15VTSuV5m_pMz0o93pNDxUzQjOC1wTuqlEnKtzggsDiWxFtokPN02ZaOe4/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image015&quot; width=&quot;466&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;IsolatedStrorageFilePermission&lt;/i&gt;&lt;/b&gt; es una clase que encapsula los permisos que especifican el acceso al isolated storage. &lt;br /&gt;
Propiedades: &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;107&quot;&gt;&lt;b&gt;UsageAllowed &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;487&quot;&gt;Obtiene o establece los tipos de permisos a los usuarios.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;107&quot;&gt;&lt;b&gt;UserQuota &lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;487&quot;&gt;Obtiene o establece el tamaño de almacenamiento máximo por usuario.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Permitiendo el almacenamiento aislado&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Para otorgar suficientes permisos, uno necesita demandar o pedir permisos. Para hacer que el framework se encargue de esto, se hace lo siguiente:&lt;br /&gt;
&lt;pre&gt;Se usa System.Security.Permissions.&lt;/pre&gt;&lt;br /&gt;
Antes de la clase a la que se desea otorgar permisos, se debe colocar el atributo&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTYL2BEvg5xCze_MI6HoIGs76BSid6vF2BwsWkkAxdpAqLeQ_ihyVK3_c5PmMG8zlBzgZjGC0KzHhlR7_t-UheU5tPmoaIoDMPfZxU0oz-KPYM9_hyphenhyphen8CfY2tvgjrs0BgNTBiR2XtU64QA/s1600-h/clip_image016%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image016&quot; border=&quot;0&quot; height=&quot;50&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu7NQLF0KttlAc9BEVxW99ofz3OfstNYxtANmGYzsMRofZCG4KWZZczyesza3DMK4wpmjgs1B32qNxFeDKEaTN80_pWJK4WiMnN7ZvgJmvxMo5xA7jqswfWvHb3lnVTse5cvd7VJ-qwzg/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image016&quot; width=&quot;460&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Esto permite seleccionar qué assemblies requieren permisos, y si no los tiene, con este atributo, se hace el pedido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.4shared.com/file/sXiRhWH7/Cap_02.html&quot;&gt;Bajar este capítulo en formato PDF&lt;/a&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;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;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;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; &lt;a href=&quot;http://www.4shared.com/file/sXiRhWH7/Cap_02.html&quot;&gt;Codigo Ejemplo&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/4255776165994536394/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-2-inputoutput-io-parte-2.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4255776165994536394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4255776165994536394'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-2-inputoutput-io-parte-2.html' title='Capitulo 2 – Input/output (I/O) - Parte 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigk-ze76F6BjEc232TMjhkEYTgyfcXmW0dXVnx3y_xTbi0QsnzaLXbgrR3BSrpKL_s4Kh8KBlKIA9iJ_jZlk5ohWTFic23h7pDdapSqDXKjJCeN1NTRWIgcs1c9c71zyXtkkEvkox8Pyw/s72-c?imgmax=800" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-4225070628744893715</id><published>2010-10-25T12:26:00.001-03:00</published><updated>2010-10-25T17:42:45.837-03:00</updated><title type='text'>Capitulo 2 – Input/output (I/O)–Parte 1</title><content type='html'>Las bases del sistema I/O incluyen acceder a archivos y carpetas del sistema, trabajar con streams de lectura y escritura, usar streams compresores y el almacenamiento aislado.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 1 – Navegando con los archivos del sistema&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Que son las clases del sistema de archivos?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Dentro de &lt;b&gt;System.IO,&lt;/b&gt; hay un conjunto de clases que son usadas para navegar y manipular archivos, directorios y drivers.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #9bbb59;&quot;&gt;Aclaración: cada clase y/o enumeración contiene miembros y métodos interesantes, recomiendo que si pueden hagan clic en los links para conocerlos.&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #9bbb59;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.filesysteminfo%28VS.80%29.aspx&quot;&gt;FileSystemInfo&lt;/a&gt;&lt;/b&gt; es la clase base de todas las clases informadoras del sistema de archivos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.fileinfo%28VS.80%29.aspx&quot;&gt;FileInfo&lt;/a&gt;&lt;/b&gt; provee la funcionalidad básica para manipular un archivo. &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como obtener información de un archivo?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Para obtener información de un archivo especifico, se puede realizar de esta manera: &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDXnfwYng14locusj0qT0cxUNeZawdocOK-Vw4fvXTicVdXReKt28L_og71VhVpysJXIHzRYf79rVDxhMAe8UDGbCb1Jt-SvX4ChzmXQxdweq4kJLLAcaU-0RRRsZ5Ld-QfknByUBc_k/s1600-h/clip_image001%5B6%5D%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image001[6]&quot; border=&quot;0&quot; height=&quot;206&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizGrrT6lX7IsRJt23neIvtKxTFNm5r-9QCj7ysD9w7UuVUr16uSzdGeLNWPM5B5oONRoi1ROuqHaRTbnKuJW_fONB_kL0qLBols0vr-dn0X1kFgtCsTvqtM_gVRiBCUsFy9H8I0d6zgNY/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image001[6]&quot; width=&quot;490&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como copiar un archivo?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Una vez que tenemos el objeto fileInfo, este permite copiarlo usando CopyTo(). &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu499vaTqpN8K65OYr_TPbDIvNY4hfm4IhsQ3l_UIIUzfM7aDMMYOLUpo_kcGlw4OqYsfUvsT62cV1SvGCFAuHDXyYUDnZuFaqXxOdaoKkqeRRT_zPdu240PGybVj-kUz6QPNhYPdXfVA/s1600-h/clip_image002%5B5%5D%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image002[5]&quot; border=&quot;0&quot; height=&quot;193&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixuRb12rDs5SHQqZxdXLGTxdNc9W-RiePe1Ur84FH-ZckUSXLm6IR8yThbjZXF3d9cZkQ9kMWl_oz4_5qKX9nhXMaTYEzrOYvTanN6vVKX5gegqfXg9r2bQnMn5be573IqHOVDd2lPveQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image002[5]&quot; width=&quot;441&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.directoryinfo%28VS.80%29.aspx&quot;&gt;DirectoryInfo&lt;/a&gt;&lt;/b&gt; provee la funcionalidad básica para manipular un directorio. &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como enumerar archivos de un directorio?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Crear un objeto de tipo &lt;i&gt;DirectoryInfo&lt;/i&gt; y llamar al método &lt;i&gt;GetFiles&lt;/i&gt;(). &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxu1Kk4DalvjI0wnZVoUEo3KArwb4hpO8ZTt12HgXbdxzFMANPBb0hJv1wseoVrWSTkdo3S_-6RloyYOt_PWLLQnRMPxW-ul3QmbCEMhNnr_K0C8Mbsgn7RvoO5rUY_Q2d4tw1OFFieTQ/s1600-h/clip_image003%5B5%5D%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image003[5]&quot; border=&quot;0&quot; height=&quot;144&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDphzvmY_DLikUm6IzEYS_Gi_xgX-iUIcrjZqM4rFDoUhFR6gowbg5bjnWmp5rF5vPA_-6igHOkfarClBC4P7_RP7i-cXw5zDQkkLhNOK8ov3PCI1J7eeOO2GyJKwoLXakmrbmx1So-OQ/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image003[5]&quot; width=&quot;408&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.driveinfo%28VS.80%29.aspx&quot;&gt;DriveInfo&lt;/a&gt;&lt;/b&gt; provee la funcionalidad básica para obtener información acerca de una unidad. &lt;br /&gt;
La enumeración &lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.drivetype%28VS.80%29.aspx&quot;&gt;DriveType&lt;/a&gt; representa los distintos tipos de unidad que puede ser la clase DriveInfo. &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como enumerar drivers?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Crear un objeto DriverInfo e iniciarlo llamando al método estático DriverInfo.GetDrives(); &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRtlO9rSqO-KspBDkgJupvQmiOccNZzczmcaiQof9z9XGyMiJ3h3csrrdCpBKCc0XUpUbcqeE9Rh5slQBCko5-ffoT-6b-DjjfaIuBCeOSZKP9BvPSKozOOBvTGjjp9Mi1m0-wr8s6kDM/s1600-h/clip_image004%5B5%5D%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image004[5]&quot; border=&quot;0&quot; height=&quot;134&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOR9_zUYr4g8POybIbhw09HSCEqa4dxDX4UtK-VQwUBLAVA82mpLRBskIBUfu_KBvhSJqly2udlnPmreJXn1j3WiJg-LKqK5TY4LfcLPvdDHfG_wEZKFclZ5dHRAD5pihZ6hbdo5kZ3-g/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image004[5]&quot; width=&quot;450&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.path%28VS.80%29.aspx&quot;&gt;Path&lt;/a&gt;&lt;/b&gt; sirve para manipular &lt;a href=&quot;http://es.wikipedia.org/wiki/Path&quot;&gt;paths&lt;/a&gt; y debería usarse en lugar de intentar manipular un string manualmente. &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como cambiar la extensión de un archivo?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Usando Path.ChangeExtentension( path, extensión) cambia la forma en que se muestra la extensión de una cadena de ruta de acceso del archivo.  &lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-_SahHfpDOGixCQagD-fYJtd6YeO2GUohOGlMsdFiFUOjWBiebHWXigLfHqZAW1Ds04XJ_zfWfQMLYgUb8ELdwJnp3X-vQMDvN0tzStTQDbyxV-cX00HPrvj6nZ_Jpa2tziNf9qyw4FU/s1600-h/clip_image005%5B7%5D%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image005[7]&quot; border=&quot;0&quot; height=&quot;82&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisEG_NLHqWPciYBzP8BSwd0buBLRCIUm1xT2zY4W8GyPKpU6YX8sPr5s6RIkJ5d1rWmpgKDPWlloq-T_4oFK2r8KJUUt_YGLNV9DezPhdCmazsWufyUrLBvvkTXTYAJXLTAUvUNcSdTkU/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image005[7]&quot; width=&quot;555&quot; /&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.filesystemwatcher%28VS.80%29.aspx&quot;&gt;FileSystemWatcher&lt;/a&gt;&lt;/b&gt; puede usarse para monitorizar cambios en un directorio. &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como monitorear cambios en el directorio?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Se crea un objeto de tipo FileSystemWatcher, se registra a los eventos que se desean utilizar ej: created, y se cocola en true la propiedad EnableRaisingEvents (para poder levantar eventos) &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoY4PILmMtB5xKx_9CI_sVnAX_bCo5HUKmtUGhGODmDm0cAEJP0eVMS0_hRtoVTFG3zMfoiUcDKmnEA3Jv7XbF5oBjix56k8w4JdbgHXd3B8zilezaL7qUOIjCl2Vj-NFja5ABXtrKzZw/s1600-h/clip_image007%5B6%5D%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;clip_image007[6]&quot; border=&quot;0&quot; height=&quot;219&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXyqRonxBVc-N9oWIpMaxy0Jn0jlvwW-kGH405oskhlFsu461bv9HnxyuaDh5WoVxlDWkGqp3c3nUeHNlWOERqvfWlsd_WxaAjEkzhmpo1mCLo0GKsXous72PDe6CsWumjBzVNj9QXG8A/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image007[6]&quot; width=&quot;559&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;&lt;b&gt;Lección 2: leyendo y escribiendo archivos&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;
&lt;b&gt;Streams&lt;/b&gt; &lt;br /&gt;
Provee la funcionalidad básica para manipular flujos de datos de forma sequencial y aleatoria. Es la clase abstracta de todos los flujos de datos (streams). Un stream es una abstracción de una secuencia de bytes, como un archivo, una entrada/salida a un dispositivo o un socket TCP/IP.&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Clases de streams:&lt;/b&gt; &lt;br /&gt;
&lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.filestream%28VS.80%29.aspx&quot;&gt;FileStream&lt;/a&gt;: Provee la funcionalidad básica para abrir archivos tanto en lectura como en escritura. Ejemplo &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB8-DY9HfOifSxFuRGyn451nbNrmN4sh0xxpAqx7ExJ_LIB9IFN4k9Y4UvKBfJDKnZ-IMUSIMWA42Uu6-sv88YSgHUWWKgEooDndZO1-qV4ZUE5FgLXfMYPbt9wFgMlNWSKV8GjRPz0vY/s1600-h/clip_image009%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;clip_image009&quot; border=&quot;0&quot; height=&quot;39&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2A2MlU24LhezG8SR-xkSV30RbenJf0TgbGdTRtOn428N6O4j0Una1XXqyS9Z4XLt-sEjqT0cjhyHgHdaIADoIpAYqLqNbjIOZexFoSR_FtMt8GJffz7bmJ5nWYWS0qeCKn6tl4AJm67s/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image009&quot; width=&quot;558&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.io.memorystream%28VS.80%29.aspx&quot;&gt;MemoryStream&lt;/a&gt; provee la funcionalidad básica para crear flujos en memoria, como podría ser un archivo que aún no hemos guardado a disco. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_9ucysWE_DHBuAeTNzoP_6EE7Elji54pKar4rQ5dNNpZNBEq-5wJNukbWOM_U5nkgXgw8XThs3ELCV19Id7GJT9pFC4MPwq9cXz6ZMkJvklgLzYPKb8K-cVccD4XuiHG4y2BEjYAlOw0/s1600-h/clip_image010%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image010&quot; border=&quot;0&quot; height=&quot;116&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ6Gi9FVB97Ih3HNXQecu2ktMBAC-Y5-MktFoVR8aHXCs0duLtsQ5SYG709G46bjbdCTeifJlgh0IHAgnQV2KZFzbxpBsu75A3LXFJZhUXd0ZzH6ABScot5yWo2nDyIch9qUhVEN52wYE/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image010&quot; width=&quot;406&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.security.cryptography.cryptostream%28v=VS.90%29.aspx&quot;&gt;CryptoStream &lt;/a&gt;Define una secuencia que vincula los flujos de datos a las transformaciones criptográficas. Es un stream donde se escribe el resultado de la encriptación de otro. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA1nWWY7tGf9PUPGyFCt87_aVQ1hQhHTqgT7jq4ylyzFvi8h04oWzE3csZOY1vz__01n_RzSM5-Ob8MMm9EtBiT29vGQRE7K6JgcogKwSRuJXABNXqhkNzh7aGlanZ7qhk_lPqkJ-bsts/s1600-h/clip_image011%5B4%5D.png&quot;&gt;&lt;img alt=&quot;clip_image011&quot; border=&quot;0&quot; height=&quot;397&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkgqGRuNcSJ-MitUB4bKQQMx7NdBMsFF7TmyZXz1gXelQ5gRlO5KXbaK0Pd1yz6rib38dfvcdmJEYUNWeWzDNgqubXpYRhtrSVPM7AXZvzn0W2rcVd1gpPfZo_NyxMZ6O4ciIeSvierUM/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image011&quot; width=&quot;511&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.net.sockets.networkstream%28VS.80%29.aspx&quot;&gt;NetworkStream&lt;/a&gt;: proporciona métodos para enviar y recibir datos a través de sockets de &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.net.sockets.sockettype.stream%28v=VS.80%29.aspx&quot;&gt;Stream&lt;/a&gt; en modo de bloqueo.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.io.compression.gzipstream.aspx&quot;&gt;GZipStream&lt;/a&gt; Proporciona los métodos y propiedades que permiten comprimir y descomprimir archivos sin perdidas. &lt;br /&gt;
Ejemplos: &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como comprimir un archivo?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUrzllM-SYgHB8Wv9JA0ZPN6tnGHC8ysbJS2ARm-V11KKhAw5P9pU2CxfCxp3zxRA_HvRvKN-68Gxplec3M70f3_MxiDhuYMBa2rtg4WwTpujGGZ-OEJDlEKMGGExx75DSOXT6yQeQrns/s1600-h/clip_image001%5B8%5D%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image001[8]&quot; border=&quot;0&quot; height=&quot;235&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwbCXFoTaGxKPPb06UDWBY4GwEhldnIRbQ-kUeiba-c-JXvX0q0pbjB6e2FSPD9-UqbIl1U8vxdqVgd-vVTUy0gHpkLVDckgr0BgQ1-6pih-R8u-6XRJvVJQpuSE6FrfiQ3xMrSlB4C0k/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image001[8]&quot; width=&quot;564&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como descomprimir un archivo?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRLlxbItezZIX0FKzB2TzctrQBWk0EyKa440hLdpLndaUdRycCXObozEk4Na8RtGaTAAujOa2AGN8yyqphSQp0zYoYrZDIjlQpXgFmLv9IDQXKuwf1WJJJobvtlV8DUX3ERAQ81Y6XS4w/s1600-h/clip_image002%5B7%5D%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image002[7]&quot; border=&quot;0&quot; height=&quot;319&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBP0gfyVLUa7IX_-uQPsXkbDb1HFGKzmvxZRzborSZHMHZLxKA2Zbyku40rJDfCB14apjQNe7RD5W4Nx5cHousu6Zgv_fnmAwbRTRWhdLFh5BTdV2ex7c_pedxm9ZNxBfSomWA3bqG4SY/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image002[7]&quot; width=&quot;491&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Que clases facilitan la lectura y escritura de datos?&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
Clase &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.io.file%28v=VS.80%29.aspx&quot;&gt;File&lt;/a&gt;: brinda la funcionalidad básica para abrir archivos streams de lectura y escritura. &lt;br /&gt;
Clase &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.io.directory%28v=VS.80%29.aspx&quot;&gt;Directory&lt;/a&gt;: interface para manipular y crear directorios en los archivos del sistema. &lt;br /&gt;
Clases &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.io.streamreader%28VS.80%29.aspx&quot;&gt;StreamReader&lt;/a&gt; y &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/system.io.streamwriter%28v=VS.80%29.aspx&quot;&gt;StreamWriter&lt;/a&gt;: proveen las funcionalidades básicas para leer y escribir información de una clase derivada de un stream. Estas clases se asumen como de un nivel más alto que &lt;b&gt;FileStream&lt;/b&gt;. &lt;br /&gt;
Ejemplos &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_T9VkBhG5sQ7MaOJ48bX2ojSs0BQp1w14OkwMbKh0sVL_kw3qrSu6leflKJnxAsCEaS9Gmf6PgdM-6BwRwQDS_ug2tkgR0iikVoxWxCFwnp6xu4NsHmcnPE7zpuj0phri6ViaXSAfNKw/s1600-h/clip_image013%5B5%5D.png&quot;&gt;&lt;img alt=&quot;clip_image013&quot; border=&quot;0&quot; height=&quot;230&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEickmMeKAFjqDa6RQXYSAwgwI6iQPbRkm7Nkp_ql-tVESNkK5oSv7H-WlpK1ir4AAfuwv4DuLg37cHPx_KZVWijGUow0btQnOzo5OdJbLoyDteEVjtj1W67PJa5hwz8jsnpbcIHNeS3Jxg/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image013&quot; width=&quot;568&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;.....................................................................................................................................................  &lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://vicrodg.blogspot.com/2010/10/capitulo-2-inputoutput-io-parte-2.html&quot;&gt;2da parte &amp;gt;&amp;gt;&lt;/a&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;.....................................................................................................................................................&amp;nbsp;   &lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;
&amp;nbsp; &lt;/i&gt;&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/4225070628744893715/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-2-inputoutput-ioparte-1.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4225070628744893715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4225070628744893715'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-2-inputoutput-ioparte-1.html' title='Capitulo 2 – Input/output (I/O)–Parte 1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizGrrT6lX7IsRJt23neIvtKxTFNm5r-9QCj7ysD9w7UuVUr16uSzdGeLNWPM5B5oONRoi1ROuqHaRTbnKuJW_fONB_kL0qLBols0vr-dn0X1kFgtCsTvqtM_gVRiBCUsFy9H8I0d6zgNY/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-6005805704414668511</id><published>2010-10-24T22:35:00.003-03:00</published><updated>2011-03-17T12:38:26.009-03:00</updated><title type='text'>Capítulo 1 (Fundamentos del Framework)–Parte 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 3 – Construyendo clases&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
Una clase es un tipo de datos muy eficaz. Como las estructuras, las clases definen métodos y propiedades. Se pueden crear objetos que son instancias de una clase. A diferencia de las estructuras, las clases admiten herencia, que es una parte fundamental de la programación orientada a objetos.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Que es la herencia?&lt;/b&gt;  &lt;br /&gt;
La herencia nos permite heredar de la clase padre, muchas propiedades y métodos útiles, los cuales también podemos sobrescribir, por ejemplo, si mi clase hereda ToString(), se puede sobrescribir este método, para que en el momento en que se imprima mi clase, imprima lo que nosotros definamos.  &lt;br /&gt;
Ejemplo de clase Jefe que hereda de Empleado  &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt6BFRWJifir1tEDLnOHw_SNVBrREqvATRHp2oA6TerWmnm8DV3IIycGE49b8MR1rvGad2v1JnEqPRrLHpfN8u-rJpbcVmeojMLcVmls4PfOJ1XSCQb3bsYWCfKmqGUiY8BUtWm8T8Gw0/s1600-h/clip_image0013_thumb22.png&quot;&gt;&lt;img alt=&quot;clip_image001[3]_thumb[2]&quot; border=&quot;0&quot; height=&quot;86&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiikYKCq7rFGOyAcFnOmVTF4aXBVro_JWD7tNUMgvce2nKPAcr-YEkfcXu4kDYArt8dub-3CCEgtxmjhtG2I_nnP5XiWxCfgpnwda126iexQkcB1UCasaXi8KuP6t-AyROVO6u7JnYwGOU/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image001[3]_thumb[2]&quot; width=&quot;453&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Que es una Interface?&lt;/b&gt;  &lt;br /&gt;
Las interfaces son un contrato, es similar a una clase base abstracta. define un conjunto de métodos (sin su implementación) y propiedades, que todos aquellos que hereden de ésta deberían de implementar. Una interfaz puede llegar a heredar de otra interfaz.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtP20xDVG6giNa2UlhuYkD6EwsXPZ5YXHRxGUK9zeanmZFHXLp1vlOZ3XLzvUdHYZ2DdU4XGyh5iTQPKINYGlF3YjnCNpvLzR3rm_NjC4KEoYFHWDJBJLYy4lrA7CbL_UDKXsCOU711YQ/s1600-h/clip_image0024_thumb22.png&quot;&gt;&lt;img alt=&quot;clip_image002[4]_thumb[2]&quot; border=&quot;0&quot; height=&quot;241&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUw3F0fb11NW4A-vmi0qFllV3l_7-rJ5wFoT-tko-YLCt_QKFtQ4Y4m4evuojVX2__P9JXgiC-jVGcTtSqk3UjNvi9OU0T9B_jOlc_Oz8UOVa3VeJiETgyLjhVquIfuZuzgJoPAVGfmMA/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image002[4]_thumb[2]&quot; width=&quot;388&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Interfaces más comunes&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&lt;/i&gt;  &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;665&quot;&gt;&lt;b&gt;IComparable: &lt;/b&gt;define un método llamado CompareTo que permite comparar instancias de la clase que implementa esta interface. Es fundamental para poder ordenar instancias ya que para poder ordenar un conjunto de objetos es necesario poder compararlos entre sí.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;665&quot;&gt;&lt;b&gt;IDisposable: &lt;/b&gt;define un método Dispose() que se utiliza para liberar recursos. Las clases que sean muy grandes o que trabajen con recursos que requieran ser liberados (unmanaged resources) deben implementar esta interface para asegurar la liberación de los recursos utilizados.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;665&quot;&gt;&lt;b&gt;IConvertible: &lt;/b&gt;define métodos para convertir una clase en int, decimal, DateTime, boolean, etc. Para implementar esta interface es común utilizar la clase Convert que permite realizar conversiones estándar de un tipo a otro.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;665&quot;&gt;&lt;b&gt;ICloneable: &lt;/b&gt;define el método Clone() que retorna una copia del objeto actual.  &lt;br /&gt;
Hay dos formas de clonar:  &lt;br /&gt;
• Shallow copy: realiza una copia superficial; si&amp;nbsp; un objeto tiene referencias a otros objetos entonces realiza una copia de las referencias (no genera nuevos objetos). Se realiza utilizando el método MemberwiseClone() que recorre todas las variables de estado y las copia.  &lt;br /&gt;
• Deep copy: realiza una copia completa del objeto, clonando las variables de estado de tipo Reference. Para ello requiere que todas las variables de estados sean ICloneable.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;665&quot;&gt;&lt;br /&gt;
&lt;b&gt;IEquatable&lt;/b&gt;: define el método Equals(T) donde T es el tipo de la clase que implementa dicha interface. A diferencia del método Equals(object) que todas las clases heredan de object, este método utiliza Generics por lo que no requiere un casting para hacer la comparación ya que la comparación se realiza únicamente en objetos del mismo tipo. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;665&quot;&gt;&lt;br /&gt;
&lt;b&gt;IFormattable&lt;/b&gt;: define el método ToString(string, IFormatProvider) para convertir un objeto en un string. Da muchísima más flexibilidad que el método ToString() definido en la clase object ya que formatea el string utilizando el objeto de tipo IFormatProvider que podría indicar el formato para establecer la cantidad de decimales y en la cultura podría indicar si se trabaja con la cultura actual o con otra. Ejemplo:&lt;br /&gt;
obj.ToString(“0.00”, CultureInfo.CurrentCulture); &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;b&gt;Que son las clases parciales?&lt;/b&gt;  &lt;br /&gt;
Especificando una clase como parcial permite dividir su definición en dos o más archivos de código fuente. Cada archivo de código fuente contiene una parte de la definición de clase y todas las partes se combinan cuando se compila la aplicación.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9xfeHinEx-KLo1rWyyeixdCjjpI3jTiOynzRvzicEhdCwf8FaWJ3F4p3d5sIFM9WIfxIlgx9IrwZYpwiOm1nDxQA9n1dA6fOebfrxwrOhPaiaynwUHaD0Q3ISv_imbr5mJRypYJSD70o/s1600-h/clip_image0034_thumb22.png&quot;&gt;&lt;img alt=&quot;clip_image003[4]_thumb[2]&quot; border=&quot;0&quot; height=&quot;226&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9CyzY5kKf_JunieosxW3bsQW4SWxoSAzfeHLdtGWKMV0QU5bS88XPyEnbvXei5qXFQSdifbNLeyQY-EHT-Mpdy5l0Qwx4oKU2VJvz3VgbKMSGxg-qd0Dd8GRz4u5rm3r7kN21lMG5IDM/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image003[4]_thumb[2]&quot; width=&quot;251&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Genericos&lt;/b&gt;  &lt;br /&gt;
Permiten definir un tipo sin especificar detalles. Cuando se trabaja con colecciones (Collections), es más óptimo que trabajar con lista de Objects, reduce la cantidad de errores en tiempo de ejecución por problemas de casteo (evita el casteo).  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Uso de constraints (Restricciones)&lt;/b&gt;  &lt;br /&gt;
Se usan para limitar los tipos que se pueden usar en los generics, para especificar que requerimientos debe cumplir.  &lt;br /&gt;
&lt;br /&gt;
Soportan 4 tipos:  &lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;170&quot;&gt;&lt;b&gt;Interface.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;406&quot;&gt;Permite solo tipos que implementen interfaces específicas para usar tus generics.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;170&quot;&gt;&lt;b&gt;Base class.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;406&quot;&gt;Permite solo tipos que concuerden o hereden de una clase base específica.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;170&quot;&gt;&lt;b&gt;Constructor.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;406&quot;&gt;Requiere que los tipos que usen tu generics implementen un constructor menos parametrizado.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;170&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;Reference or value type.&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;406&quot;&gt;Requiere que los tipos que usen tu generics sean una referencia o un tipo de valor.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Ejemplo:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUPPG1n-fahkkyzlKZXsQLCrvUzSeYoAr2TrCCDPgbjl_F56kHhufYMU3snuRRbIYtZnfubMhz_bor1UisjebRIwRMAW4-mky0SPNq5ARRTHqRaMaSptNszQvIV0s7AeHuO12m35wnS3s/s1600-h/clip_image004_thumb22.png&quot;&gt;&lt;img alt=&quot;clip_image004_thumb[2]&quot; border=&quot;0&quot; height=&quot;229&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7PJ1v-gcR2U5v2uiYMFh_4hIVcMdcOIk-y7JZQlegAPl8byu7vBqBq5p8AOwTlK9GEjExsaF05Ms3UCMsMUVpjbYXivRoAZO4rEBXZVsomDXo7dLALyUjr4uviQC8vFyp5lpQpzB2GsE/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image004_thumb[2]&quot; width=&quot;350&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Esto quiere decir que el parámetro solo pueden ser aquellos tipos que implementen Ifantasma.  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Que son los Eventos?&lt;/b&gt;  &lt;br /&gt;
Es un mensaje enviado por un objeto en señal de que a ocurrido una acción, la cual pudo ser causada por una interacción, un clic de mouse, o puede ser hecha por otro programa. El object que levanta el evento es llamado el Event sender, mientras que el objeto que captura el evento, es llamado receptor de evento (event receiver).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Que son los Delegados?&lt;/b&gt;  &lt;br /&gt;
Es una clase que almacena una referencia a un método. Es equivalente a un puntero a una función de tipo seguro (type-safe).Muchas veces es utilizado para señalar un evento a un objeto. Para utilizarlo, se debe de asociar el evento con el manejador del evento.  &lt;br /&gt;
Un ejemplo de cómo definir un delegado de nombre Deleg cuyos objetos puedan almacenar métodos que devuelvan un &lt;b&gt;string&lt;/b&gt; y tomen como parámetro un &lt;b&gt;int&lt;/b&gt; es:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPt-Jv-ffqKMd9rAdvlm6aw5LiESBYcJgmH6pOoiNK0etTavW4SIDPL-6_Ztp-iNyRMJvwIF0ParqkD8f4R9M476LHUJJYbKLuaFHSku-0SyMGK2r6xnW0FAjpD0UZHbanbG6mk5A3eUc/s1600-h/clip_image005_thumb2.png&quot;&gt;&lt;img alt=&quot;clip_image005_thumb&quot; border=&quot;0&quot; height=&quot;26&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinyP18jv23_w8knncjP8PrzxnVvUsg9OBcQVD_8sicnDbK4EyP4vsAqJfX8NLD6Xufl5o9vk5KcTI610g_axowV2Qv59a-lbzw-uZhSy3FeimKfLRgKJsDyWUQSq6q65S1YPWd_p8hxfE/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image005_thumb&quot; width=&quot;228&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como responder a un evento&lt;/i&gt;&lt;/b&gt;  &lt;br /&gt;
Se crea un método que responda al evento, debe coincidir con la firma del delegado.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzIx3z2BpD7eGjp3MZvU1UK5T1Q0CSeaaEGzf2Tkt_1FpiQkb4dacnQ8phFtgRruRk_ubILoV4m_MzYYO4g86C_aKZ3wmhhCmEfi18MQFi-Lr3rTl9Hze6q21TnCrs3bskxlKmrxbHzPc/s1600-h/clip_image006_thumb32.png&quot;&gt;&lt;img alt=&quot;clip_image006_thumb[3]&quot; border=&quot;0&quot; height=&quot;63&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh331Ndl00ZjMHAcVGBq8jk1WZevIr44jZm5RExRzGzyLMJO7rhi9dsRE3AwI0-wnizDECIA0TcY8rwNGW6guP-fx5nnJtkQ7jW7xKhMkb_uQhoh_06mNbL5h1BrokY0qNUqAbzZBfPIE/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image006_thumb[3]&quot; width=&quot;405&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Y un manejador de eventos (event handler) que indique cual método recibirá el evento.  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7rb08Trhw5K9VNGBTwAN0Lir-qW10cbwhMOMOAft8VxcZNvYusTx3spM0FoaotOa6k33ztbzkr4nvdI0f5wjmkbimRkXM5nQSWpxsNrwrcbIac-ozNe4qlXMD0-MD7F0XNLNsMIfjWQA/s1600-h/clip_image007_thumb12.png&quot;&gt;&lt;img alt=&quot;clip_image007_thumb[1]&quot; border=&quot;0&quot; height=&quot;100&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd6J8FPhtb0wPhAocUDzOEJLyJzlKTaZaxowVRJO2JWYgyBJBmssrCf5AhBKdQcqmsqGOMyocvg8NWmxYYZSUDjzcGtRCp4J3xKzfrccD5ZB14YTNXNm7fVFMvdrHmIat7pT11anX9KSo/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image007_thumb[1]&quot; width=&quot;383&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Que son los Atributos?&lt;/b&gt;  &lt;br /&gt;
Describen tipos, métodos o propiedades que pueden ser consultadas programáticamente usando una técnica llamada Reflexion. Derivan de System.Attribute y son especificados usando [].  &lt;br /&gt;
Sus usos comunes:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Especificar qué privilegios de seguridad requiere una clase&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Especificar privilegios de seguridad que permitan reducir el riesgo de seguridad.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Declarar capacidades, ej. soporta serializacion.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Describir el assembly con un título, descripción o notificación de copyright.&lt;/li&gt;
&lt;/ul&gt;Ejemplo:  &lt;br /&gt;
Para que una clase sea serializable se le debe añadir [Serializable],&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidCy9jnVHxjmOwX2zjocUKVDbnHAAlQd6ajFpeWvkMkrodYIUZA3Ty8JSPnXr9l8BE1-bC2lSijX7AWWfQgTOui1lIQrQBaxJF4KOCDihcH54Z04aE2RIiSUKCpSpxCNwx3dr4aTOgyIw/s1600-h/clip_image008_thumb2.png&quot;&gt;&lt;img alt=&quot;clip_image008_thumb&quot; border=&quot;0&quot; height=&quot;96&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRs5SIBKvukAzLgaTcdRgCRRh-c-2owesUNKFGHGGdJYSWH0vj7KCzY-5rL6xcpBi8j16SEA4BpRmgrEtOqK9ZZtDB1Y-MDijSCiF9qWrcKfdP7JaqcbZkXmi-QTkiUZ_8_1r0_td8CNg/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image008_thumb&quot; width=&quot;197&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Que es el Type Forwarding?&lt;/b&gt;  &lt;br /&gt;
Type Forwarding es un atributo que permite mover un tipo a de un assembly, a otro assembly, de tal forma que no se deba recompilar los clientes que consuman el primer assembly.  &lt;br /&gt;
Solo funciona con componentes referenciados por aplicaciones existentes  &lt;br /&gt;
Ejemplo:  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQb5ub-OgQglJCePFa0QdSVaj8aJFcAmX6q6dAdR7NHalIN0UjQVyKGZKhgowDZW4JPKqkQ6HqUwGGyHnE5MvBNVMZr7XArzXrwDcjBOLQP9hNlEVJDnc7N5-LKdrK0qC_f6FfbJSVydk/s1600-h/clip_image009_thumb12.png&quot;&gt;&lt;img alt=&quot;clip_image009_thumb[1]&quot; border=&quot;0&quot; height=&quot;31&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZHMK5pZWLj3AJneKYDPJc9MxYUSkyirQCxdD5rdmnUxpg3FBSIOmxyyoexz3YwwP3IK95YdPS2m7Khb8aSRwjjM9nqzbTvWSGicsflgMYunSugolqQ3Vokqcayz3mAsHV0ROnfyorOfg/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image009_thumb[1]&quot; width=&quot;387&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 4- conversión entre tipos&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
Las conversiones de tipo nos permiten que una expresión de un tipo sea tratada como una expresión de otro, las conversiones pueden ser implícitas (widening) o explícitas (narrowing), estas últimas pueden fallar si el valor que se va a convertir excede el tamaño del tipo al que se va a cambiar.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo la conversión de un tipo int a long es implícita, sin embargo la conversión de un tipo long a un tipo int es explícita, esto debido a que un int puede ser expresado en formato long sin que haya perdida de datos, pero si intentamos convertir un numero long a int puede haber perdida de precisión y se necesita una conversión explícita, es como una forma de obligarnos a demostrar que estamos conscientes de que existe esa perdida.&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_DY6EHvPvygqfxyrC71ZK0fCsariWJjLCDv8Tzz3eCRl9kTqMgeoD0NLdrwR7FE6SaFLli8E1Enbs06uoWO5Oeg-ZiG0U-hBtG-GcE62PWJpncc1GHM3SIvO2PzVVhXpIakxp27g6xQ8/s1600-h/clip_image001%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image001&quot; border=&quot;0&quot; height=&quot;124&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAnHm4CbuvzbCeOYhqW2W_zi_vI9mBGPSs3eWcqM7IkydS44bZtvZl2R7wu_pp-AQBweIWk_QXwhcrXuAAPVvjvz5nUyd-rKFD9fmFDjtfF-rgfgihFdwMpw9DSwdiLeIfagr9mpfrp7s/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image001&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
Formas de realizar conversiones: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt; System.Convert, entre tipos que implementan IConvertible&lt;/li&gt;
&lt;li&gt; tipo.ToString&lt;/li&gt;
&lt;li&gt; tipo.Parse&lt;/li&gt;
&lt;li&gt; tipo.TryParse y type.TryParseExact, convierte de string a un tipo base, retorna false si no es posible.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Que es boxing y unboxing?&lt;/b&gt; &lt;br /&gt;
&lt;i&gt;&lt;b&gt;Boxing&lt;/b&gt;&lt;/i&gt;: es transformar un tipo por valor a un tipo por referencia. Por ejemplo: de Point (un punto con coordenadas x e y ) a object. &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXsG3fO-ag0C_kwGmvQzw_9HZhSBZfmMacyjpXE89B2_XeZ_8fURSNOtmip2ZZTet00E2It1JhTILMkUbVR-ppx71SKhHyrg7NB7m7B6oPX-S2v56R_mb6tuze0sDcvkoQLinUgHTHymw/s1600-h/clip_image002%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image002&quot; border=&quot;0&quot; height=&quot;57&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVN7jmUpQwlgFsP4oIdqzmEelH8RbKUQ7tGIJ-UtduMvsTocpmuI1bxV-dMb1NXw8OGV0hC8Dh1bctf0m5cbAG6PNtFxI12xGnUJneC8sZxUM9xkKc1HK2dCJPoGNEopPhQKGj2qLtkAg/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image002&quot; width=&quot;211&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Unboxing&lt;/i&gt;&lt;/b&gt;: se transforma tipo por referencia a un tipo por valor. Ejemplo: object a Point. &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOqrZcMZiZBYEQVKm89BrLy13B1xQm6KHDkJ1t1FAEAuh_JmvsR3VwQYnUjuHOnWRNK40KwQ750xJeFQ56LkSAc5xJolLkukc-CTAlBJpkZt0nwP8VnKOaPkigJ0mrPYOLOylFD9bwLWs/s1600-h/clip_image003%5B3%5D.png&quot;&gt;&lt;img alt=&quot;clip_image003&quot; border=&quot;0&quot; height=&quot;46&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOEubXpBP6MhHISb-joEHS2n1WohmPZZaCc3lnzU6VMKsVyuqPxgeF8ACILNRKil6PWMyWy77KdNmzIn9KS4F1lNNJ6D51e_ssbJ04cqprmkP4ieLGlOWqCL6oVlBQhkxC5-dxqX7jcoo/?imgmax=800&quot; style=&quot;background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image003&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
....................................................................................................................................................&lt;br /&gt;
&lt;a href=&quot;http://www.ziddu.com/download/14224317/Resumen70536-cap-01.pdf.html&quot;&gt;Bajar esta capítulo en formato PDF&lt;/a&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;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; &lt;a href=&quot;http://www.4shared.com/file/BVcuMcCJ/Cap_01.html&quot;&gt;Codigo Ejemplo&lt;/a&gt;&lt;br /&gt;
....................................................................................................................................................&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/6005805704414668511/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-1-fundamentos-del.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/6005805704414668511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/6005805704414668511'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-1-fundamentos-del.html' title='Capítulo 1 (Fundamentos del Framework)–Parte 2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiikYKCq7rFGOyAcFnOmVTF4aXBVro_JWD7tNUMgvce2nKPAcr-YEkfcXu4kDYArt8dub-3CCEgtxmjhtG2I_nnP5XiWxCfgpnwda126iexQkcB1UCasaXi8KuP6t-AyROVO6u7JnYwGOU/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-940199252170910604</id><published>2010-10-24T21:42:00.000-03:00</published><updated>2010-10-25T17:39:03.663-03:00</updated><title type='text'>Capítulo 1 (Fundamentos del Framework) - Parte 1</title><content type='html'>&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;b&gt;Que es .Net Framework? &lt;/b&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;El Microsoft .NET Framework, es un componente de software incluido en los sistemas operativos Microsoft Windows. Provee soluciones pre-codificadas para requerimientos comunes de los programas y gestiona la ejecución de programas escritos específicamente para este Framework.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Su objetivo es crear un marco de desarrollo de software sencillo, reduciendo las vulnerabilidades y aumentando la seguridad de los programas desarrollados.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: yellow;&quot;&gt;Lección 1- usando tipos por valor&lt;/span&gt;&lt;/b&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Son los más comunes de .Net Framework. Hay 3 tipos de valor generales: pre-construidos, definidos por el usuario y enumeraciones (Todos se encuentran en System.Value y se almacenan en el Stack).  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;Tipos pre-construidos&lt;/i&gt;&lt;/b&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Otorgados por .net Framework, son: los tipos numéricos (sByte, byte, int32, int64, single, double, decimal), carácter (char), lógicos (bool), etc.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyoPWZi8frJVqzGNOiNXMWjObjncD0yOSGHj9Zg_S3lFCaen9U5IMTRKGaIvM8-MOzNmNY3DgJuI9IozuBxi1MAOmWXjQpYKEllZLHACy-MUYGlLTk8GCypWJtSIaqGTYKo3j_SZYG5PM/s1600-h/clip_image0016.png&quot;&gt;&lt;img alt=&quot;clip_image001&quot; border=&quot;0&quot; height=&quot;246&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtWDZ1hXpGqy2kPDG2dx-uvfy6g8h0LzQP1nWQ-B7rIvU8U5ooAS2Z-PD70-gDL7Zr-JAeCmeydKlW5P27BjsMR1ff2bvuZIwSzJhyjSoq6hiKHepiuZMLmEVogEZbYuqcmUdNfrZD5AQ/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image001&quot; width=&quot;448&quot; /&gt;&lt;/a&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Los tipos por valor tienen un constructor implícito (no es necesario usar new) .  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsXebgboBV51wPFai9-5qznHuMBTUUT-i9zD9Xuh8vpqaezkm43HCL6WFWGad8OWqTDR04vA4ET0-JFWI-JfHVJxjogh0W_KpngalhqKAxTygLMJZtV3HwLmRfVD4cMgmHrrwTIqg7Fls/s1600-h/image10.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;48&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggmcV3KTMBEdA4Rd2912UTWLYBzGaQNe3SJMCDs83UDHd_lf1BSXOUcSZF7Tg8o73DT87PokKaO1UyvIrZq0h4zv0h5VmbMoZd4PML73Lhhyphenhyphen-S5ExRH0rF8amN0i3Yzsy-K05m40zQWEA/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;136&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Para declarar variables nulas (sin un valor asignado) se utiliza nullable:&lt;/div&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeopv0UlcZl5p7C5j3vbbbbhVvv64mXr3fKP8zg9CCr_70KQP9Godc54WePKPlf2cedj8lvhjtZWEiX9w1HBMJTs4ymdQEZyw5MZxv-duZSfqZNFxyofXbHvpevFTTcFgcJzLYzGRow6E/s1600-h/image13%5B1%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;37&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4kB0jtrxybIO7oG-_I-kMHpu24noTKttq9oJSKhQVICZ-Gg2ZkH8WlnpLZFm1Pg4VaHQZf8c_7r6w0De2fHSpm5lFePNyY5pUgdsmNTMc7M1CMP4MFpveVxtzKgiImqA6pGGnNtMTnt4/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;201&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;O usando un signo de interrogación después del tipo de dato.&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuAzfL0mNydh2PJyYQJuYh6vccDrFHpPU3vtBJN8CLdQ2OX1AF2cEANkcoCRNNgbDzQruZdF0GHLiSsplaOXgH0Uzw0VR51AQWlCy7T6sUB4W8llBIyPBQsz0-S647SBg8j740w3LS_uc/s1600-h/image24%5B1%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;37&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL5n_CzR7zBObB3HOHi2oqUVnMU5KmcOt-U9u_a3yYcVDu7Dum6ynZ5QT9ckdKUO_u_D-PdU23L1z0Occ-RosTILpAFscDxVNR7ErKNnGxYlsv8cGKNOpFDPaNZQj_tYhV28lnqEeUdOY/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;151&quot; /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Si se declara una variable como nullable se puede usar &lt;i&gt;HasValue&lt;/i&gt; y &lt;i&gt;Value&lt;/i&gt;:&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: #4bacc6;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5BrQB-VR4cZEIuNpNZhyphenhyphenEGxW9U5xLwTlFs5My63S3bx7AYsHluHVDc1O4z_b8tqS3RxsjTJvtXhI0dUTB15y7h_ZPS6ysa4buSFYaJHkzRrWS8BBZjJMTmiFINIn44BMqDaTNOKCLMmQ/s1600-h/image17.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;85&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnRA4VBiljp8k63mycmq04jDQ_Yr2Hg2ihiayePLBuD8jdgn308QoaPhUqHSqffL2sRJc6KpAjOshSutK6_7EdDRqEPMY73oppNaSFXKP-y1wfsEtcBLTmd7X0xmv5DjgxjG0zSqFenKI/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;401&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;&lt;i&gt;Tipos Definidos por el usuario&lt;/i&gt;&lt;/b&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Son también llamados &lt;b&gt;estructuras&lt;/b&gt;, son una composición de varios tipos&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;por valor relacionados. Por ejemplo: &lt;i&gt;System.Drawing.Point.&lt;/i&gt;&lt;/pre&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Pueden contener constructores, constantes, métodos, campos, propiedades, índices, operadores, eventos, implementar una &lt;b&gt;interface&lt;/b&gt; pero no pueden derivar de otra estructura o clase. &lt;/div&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Su sintaxis es muy parecida a las clases.&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Se debe usar una estructura cuando:&lt;/pre&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;li&gt;Nuestra instancia es menor a 16 bytes. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Representan un valor simple &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;No se va a modificar luego de su creación &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;No va a castear a un tipo por referencia&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;Enumeraciones&lt;/i&gt;&lt;/b&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Deriva de &lt;i&gt;System.Enum.&lt;/i&gt; Son campos literalmente estáticos, cada uno representa una constante, pueden ser de tipo byte, int32 o int64.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;El propósito&amp;nbsp; de las enumeraciones es simplificar el código y mejorarlo habilitando para el uso de símbolos en lugar de valores numéricos. &lt;/div&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg31rlLbm5vPxqEP82LmAr7L2BKwtRjQTFWY9pJnZyGu4rcju1ebmbRIfOhZtbO4rygCuSE3pBJTHNrLYJOtIvPIUIHPbaZ59ObS-mOMM2DzC2meGwBSlEVgop7XmYJT6ichqjgYOgG6ho/s1600-h/image21%5B1%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;90&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWMvLP4ped4iO7tOwV2zNxhmb-SNpwbF_PA6G_zK3XAnXvTOpIg7POlcgOx9TJNkdLX2oWldHdmLrWqrKyzRf68IY6i8xPq0IovvDUyN77gGpG9EjcoRY14_72sNeauP77Wv6omGZqihU/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;186&quot; /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;span style=&quot;color: yellow;&quot;&gt;&lt;b&gt;Lección&lt;/b&gt;&lt;b&gt; 2 – &lt;/b&gt;&lt;b&gt;Tipos&lt;/b&gt;&lt;b&gt; de &lt;/b&gt;&lt;b&gt;referencia&lt;/b&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Los tipos referencia almacenan la dirección donde se encuentra su información (conocidos como punteros). Están almacenados en el stack mientras que su información se encuentra en el heap.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;El heap es manejado por un proceso llamado garbage collector, que recupera la memoria eliminando los ítems que ya no están referenciados. Se ejecuta de forma indeterminada, pero se puede invocar con el método &lt;a href=&quot;http://msdn2.microsoft.com/es-es/library/system.gc.collect%28VS.80%29.aspx&quot;&gt;GC.Collect()&lt;/a&gt;.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Los tipos por referencia más comunes son:  &lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;li&gt;Object &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;String &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;StringBuilder &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Array &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Stream &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Exception&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;String&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Un string es una cadena de caracteres (texto). La clase String, nos provee métodos para manipular texto, por ejemplo: usando el método &lt;b&gt;Replace()&lt;/b&gt; para reemplazar texto.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Los tipo System.String son inmutables, es decir, no se pueden modificar, cada vez que se le cambia el valor, abandona su antiguo valor y crea un nuevo System.String.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Para evitar esto, se puede utilizar los métodos de System.String como Concat, Join o Format. O también se puede utilizar StringBuilder que permite crear cadenas dinámicas.&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;String Builders (constructor de cadenas)&lt;/b&gt;&lt;/i&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Es muy común el tener que trabajar con largas cadenas de texto. Habitualmente se trabajaba concatenando diferentes strings o reescribiendo el mismo string una y otra vez.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Con &lt;b&gt;StringBuilder &lt;/b&gt;se mejora el rendimiento considerablemente, ya que cada vez que &lt;b&gt;concatenamos&lt;/b&gt; a una &lt;b&gt;String&lt;/b&gt; se crea un nuevo &lt;b&gt;objecto&lt;/b&gt; &lt;b&gt;string&lt;/b&gt; en memoria con el valor antiguo más el valor a concatenar. &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;El método &lt;b&gt;Append&lt;/b&gt;&amp;nbsp; de &lt;b&gt;StringBuilder&lt;/b&gt; puede ser &lt;b&gt;300 &lt;/b&gt;veces &lt;b&gt;más rápido &lt;/b&gt;que la concatenación de Strings, disminuyendo el uso del procesador (&lt;b&gt;CPU&lt;/b&gt;) y evitando trabajo innecesario del &lt;b&gt;servidor&lt;/b&gt;. &lt;img alt=&quot;Caluroso&quot; class=&quot;wlEmoticon wlEmoticon-hotsmile&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL186iQHg4aTRvC4eoeKxSYcB5GadUKEb4YYn0fe3Ey2w9lC_ljzOa3D6Vndyr4B91wTVT8duSXs9F0n0dOZXSgVGpgW0MW2Np1qByrB9Vn6dpqL0GfoMhFYM5kgnaTehWEfaFLzEw1wo/?imgmax=800&quot; style=&quot;border-style: none;&quot; /&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Ejemplo entre string y Stringbuilder:  &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaF1tylcOeinq7R-ej9RsbKB562rk4tCMKazdaxPw4YKR0EYOeo9p26FEISpKrNsYKx0ojoKL40hc2Ta2MjmYbYmarzP7qaXbQNHJ2nhMenRPXo8n5duk9poXyWR_bXDa5SzfJKD6QuII/s1600-h/image11%5B1%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;115&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijA8q3WC7MtPzPeHJAsAsrHtqh2Xvs2s-vyN_FA7wU7qwDjDKPFjMmrMPCqf61fVaA9fbhKJRu7pwJrnBWHz2pm_eSMrwPyuGetR-ZEw9Z1O3dIvVQr-AGbySA9EmyLnrPIFVKdZHOON8/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;442&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;El modo de hacerlo con un StringBuilder sería el siguiente:&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrDVr6rgFosMwmdPoCTsiFIQSFOnz19rhHbtcZ181P2p4ki-bK5nh8XWSK_9nSnQcRQAGwLalhElPhncMuXzelmMRbSUrQGePa2yrzbo_IOndZBzRKwYry-_FoCG72eFcR2cGJW2R8DcU/s1600-h/image12.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;130&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzja0lGDLk6t-QEhumgkXcAo133llpYI_FZXcsHh6ixQebIiHqXJErd1CDx0nbax17UmB4nH0WK53vf-LPsnQt1sPzlFSo9liQTcX7SoMeGtHXopw-Kz44sfpp1DiDBdIJ_B8hWmMgQu4/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;442&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;Array (crear y ordenar arreglos)&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Un arreglo es una estructura de datos que contiene un numero de variables llamados elementos del arreglo. Podemos acceder a dichos elementos a través de índices. &lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;li&gt;Los índices de arreglos en C# empiezan con Cero 0. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Todos los elementos del arreglo deben ser del mismo tipo. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Los arreglos pueden ser de cualquier tipo. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Derivan de la clase System.Array&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Ejemplo de un arreglo de 5 enteros:&lt;/div&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif; line-height: normal;&quot;&gt;&lt;span style=&quot;color: #4bacc6; font-size: 12pt;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmuUIWHeznX2SQd3TivPW2huFWtSrkq1-QjsvHuBO8HeiZaQNvt7xwUmPPVScUKs-fLig7a2XCsyAIcJEY05jOARkL-sbGwcMlSoHX9aNN9oKcmc52VN8YuHwdYSH3t0n6ePmhYBSnal0/s1600-h/image7.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;39&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR0EZTmuWKCoCuCsHFcrLqmvk92EYY3s6765Ui76zarjQFxtxt1VeaN8NOHvjtKcZlU6_xgDLiEcObr_los2vqdwTMQeFdo_K0mBbZ6c7rGe7Ua7-Hf4kBgpOZ1CpqjnE008xWxVgqaxg/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;446&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif; line-height: normal;&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style=&quot;font-family: Arial,Helvetica,sans-serif; line-height: normal;&quot;&gt;&lt;i&gt;&lt;b&gt;Ordenación de valores en un arreglo unidimensional. &lt;/b&gt;&lt;/i&gt;&lt;/pre&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Para ordenar los arreglos de &lt;i&gt;tipos comunes&lt;/i&gt; se puede usar pasándole como parámetro nuestro arreglo (en este caso miArreglo).&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh2rzZm9sFwW_v7AZRrxLLn6HEceHUa0tsXdUSXn5-kbl3NAinotBu3rn2mNgsqh0aUsJVuABEHwsUNnAGd4a9RcTDMexJeaG9Hvwt4zXfbNXt4qbAVzkhtAykzoUSPzSkwhhKkyIcO8o/s1600-h/image15.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;33&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5uFdmuWTBrxlkw8oWfYJNP2OlheYM32H0BLnPQ8nmXtugI974UjP_WFUKOfHmPHpfbAK3OktpBhJPsnz1LD5zj12-dr_ghiMLCaCxfZYw9GIabwxZrtlUNCm7bQ6JlhLtLB2ZV8uI0VU/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;183&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;b&gt;Streams&lt;/b&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Un Stream es utilizado para la lectura y escritura desde disco o alguna parte de la red, para manejarlos debemos usar System.IO.Stream.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Tipos :  &lt;/div&gt;&lt;ul style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;li&gt;FileStream: se utiliza para la lectura y escritura de archivos. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;MemoryStream: para leer y escribir desde memoria. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;StreamReader: lee información desde un stream &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;StreamWriter: te permite escribir en un stream&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Ejemplo para escribir con un StreamWriter &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBh_lSYX12EoTdwpxcd_lUgkaoX0JoMJclsxNfD83EIyZKyn87-kouIHErUSEJoH5F7kGFtJeM-DT7lP20asso_jVz3Pmw-psGAmbKhNI68aqg2D1lkfZla65ey30t_TPhl2lYPmAfUxc/s1600-h/image3.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;139&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho8g6tsNt6tIEpuJ2l9kWypTNtrvcj9SkKq8n2CbMDb3jDhGZVS7tbAwZtLybW6aQN4vZpn5SyO45K-4qFLz3cB9rAnvfrzn68IguxYfuKlmAeV_11SI_MQ79RKJsl0uEyRnGrcwfDmX8/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;436&quot; /&gt;&lt;/a&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Ejemplo para leer con StreamReader&amp;nbsp;&amp;nbsp; &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoW6Du8mIzhQehnKtEFSSFOHOZNMwXifAnDtxMzOWgN_jRyArgAROU8HgUWXJILpxMFgIOdRyOjwwgqns2jB99WTijHaRK-Ae5fjuramRQ8qqga2sNoS8xskDf17mOYA12VYgc9T_ZSg0/s1600-h/image20.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;86&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2SDk0KVA6Cl_fsYPYgHEH_3jr47wYudQ_4dV1g2EsipEOQwLBcv3yIinAA4oYppmcMjAlpWkU8MNV9Mgb9UYHYMCz8Qw4BFC9vhQAsZgn1jT8GrIy_2s1Y93f1iDglRPzwR1dXtB50bM/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;425&quot; /&gt;&lt;/a&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Siempre se debe cerrar cualquiera de nuestro Streams al terminar de usarlo, con el método Close(); para que puedan otros ocupar dicho archivo.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Ejemplo para saber si una ruta existe&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Dc9YsGNr2JtiujHnV2NJ7koBrZsVHYU-oY5xFQ5rbbYA9ec1I_079-WeEKItHBW5PPYtTQHqiBmEsJ5LORMmu4P5faXpWroWzlYaPAuo5kE3-2J3N1CSXenq1ciEwyyd09ZwEXZmqro/s1600-h/image23.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;86&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbJ6R_Zl3xCj8js_jfNYIuek04v1q9tbDtsHMBPCywQ_TOFqitQ73mOx84f2QqCEDGPjUMrRNr6gjWkdFRQq3eUd3uZpqMMRRIxoPZwKECBsEVouWuJdFytAFhTozKNja3T5Ix3KQj1d0/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;242&quot; /&gt;&lt;/a&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;Como manejar excepciones &lt;/i&gt;&lt;/b&gt; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Las &lt;b&gt;excepciones&lt;/b&gt; son eventos inesperados que interrumpen la ejecución normal de un ensamblado o un proceso (programa).Derivan de la clase &lt;b&gt;&lt;i&gt;Exception&lt;/i&gt;&lt;/b&gt; del namespace &lt;b&gt;&lt;i&gt;System&lt;/i&gt;&lt;/b&gt;. .NET Framework nos provee un modelo en el manejo en bloques &lt;b&gt;try&lt;/b&gt; y &lt;b&gt;catch&lt;/b&gt;, y (opcional) &lt;b&gt;finally&lt;/b&gt;, que es para limpiar valores, o realizar algún método al final del proceso.  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;b&gt;Ejemplo&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMeNRGCr5UrJAVSsqiDDyqWks-Xh5QHcFR6qK8Q4ZElrFW_dDiL0HxlXqGJFmCCM1dKrtTqn9tCIzCa0009yyKcOG0ZAA2TnLk1Dnt5AWtC-6KemSTpJVSNlp6zZ7_Ihr2e3EYu5BC_Nk/s1600-h/image27.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;357&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSsgpQBdrBTc-hAIB2pJyVgdc7DdnBDyd4d_VQPw1uHnX0FGdavCLRsX_529XYz7IxGBPUfc9Ikf03SHc9gsHXARi5cmm_cbpdzVIMMkIkzT-c5XAPp7xczo1_4JwF3MU3QrFQbT4ZcLw/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;472&quot; /&gt;&lt;/a&gt;  &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;Se pueden colocar varios catch para atrapar los errores luego de un try, pero &lt;b&gt;&lt;i&gt;siempre en orden desde el más específico al más general.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;..................................................................................................................................................... &lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://vicrodg.blogspot.com/2010/10/capitulo-1-fundamentos-del.html&quot;&gt;2da parte &amp;gt;&amp;gt;&amp;nbsp;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;.....................................................................................................................................................&amp;nbsp;  &lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif; text-align: left;&quot;&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/940199252170910604/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-1-fundamentos-del-framework.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/940199252170910604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/940199252170910604'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/10/capitulo-1-fundamentos-del-framework.html' title='Capítulo 1 (Fundamentos del Framework) - Parte 1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtWDZ1hXpGqy2kPDG2dx-uvfy6g8h0LzQP1nWQ-B7rIvU8U5ooAS2Z-PD70-gDL7Zr-JAeCmeydKlW5P27BjsMR1ff2bvuZIwSzJhyjSoq6hiKHepiuZMLmEVogEZbYuqcmUdNfrZD5AQ/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-142613817781134327.post-4015193551964130433</id><published>2010-10-22T12:49:00.002-03:00</published><updated>2010-11-11T14:21:48.723-03:00</updated><title type='text'>Comenzando con 70- 536! (en español)</title><content type='html'>&amp;nbsp; &lt;br /&gt;
Hola a todos! Hoy voy a comenzar a leer y resumir las unidades que hay que aprender para pasar el examen &lt;b&gt;70-536 (Microsoft .NET Framework 2.0 Application Development Foundation&lt;/b&gt;).  &lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQI9X_ZpmWQIg1Xh5EVrUiw-2QB8RTg3LZF5UO28UZT-LDE6vit5BrGOozEdTiEWSYh0OmgblOylxqZEh-xO5Zz0CGkAqKJXedZO2oX8GDzJQjY6sR2UK-4IqgdM4rwMojAVgYI0TJCOU/s1600-h/image%5B13%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;265&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbaFZrwaouoFJlUY4CS3gBdANgwW0ey8znpasYG7i-TD7K0qEpxmHCeahQNV66LdM52SysrNdeUIsFeZQJiZGMQ4nKqhGZyDE60n-ugmwanrc8hWWXEHKsf4-howBPNiUmpiGoS90gIo0/?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: block; float: none; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;228&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Me propuse ir colocando todos los días el resumen de cada unidad , así en el transcurso de tres semanas y un poco más (fin de semanas no toco nada…&lt;img alt=&quot;Sonrisa&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNbR5xbWRLASrqMQ3rr6Wd_BLKyHthuzPTcHr1MLUxyV0sBj5AraRbKpkRS940G56qMVIJu5df8vMjak1oa9zIv6CZVGErFMB6o7HcNR8t4WDDAd2nmwZAOdLabChuirzqhj0JLej9yoU/?imgmax=800&quot; style=&quot;border-style: none;&quot; /&gt;), se termina con el contenido del libro (son 16 capítulos) y solo quedaría practicar un poco más.&lt;br /&gt;
Pienso que de esta forma se puede mantener un ritmo buen de lectura y además comprometerse un poco, ya que el libro es la base del examen y está sólo en inglés… vamos a tener que ir haciendo un esfuercito…  &lt;br /&gt;
El examen tiene 40 preguntas y dan alrededor de 240 minutos para rendirlo, además, por si tenemos algún problema al rendir, Microsoft está dando una segunda oportunidad de rendirlo.  &lt;br /&gt;
Acá les dejo unos &lt;b&gt;&lt;a href=&quot;http://www.4shared.com/file/umCfYDQw/pdfs_.html&quot;&gt;pdf’s&lt;/a&gt;&lt;/b&gt; y una &lt;b&gt;&lt;a href=&quot;http://www.4shared.com/file/ZPmTgAKB/MCTS_70-536_training_kit.html&quot;&gt;Iso&lt;/a&gt;&lt;/b&gt; que les pueden ser útiles para estudiar… igualmente siempre es recomendable tener el &lt;b&gt;&lt;a href=&quot;http://www.amazon.com/MCTS-Self-Paced-Training-Exam-70-536/dp/0735622779/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1213065465&amp;amp;sr=8-1&quot;&gt;libro oficial&lt;/a&gt;&lt;/b&gt; de&amp;nbsp; manera impresa que sugiere Microsoft , que además incluye in Training kit para familiarizarnos con las preguntas que nos pueden llagar a tomar.  &lt;br /&gt;
Bueno… a empezar con lo prometido! Espero nos sirva a todos.&lt;img alt=&quot;Lengua fuera&quot; class=&quot;wlEmoticon wlEmoticon-smilewithtongueout&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3QOIJnuv98jFcLvQq0rJ9QZKXQpvkbZtbwVVizBjTtT0m3d4kG6OSPAcrr7Z_b3_W8COrKOjfbg7XM0vw8nHak43tokDlxkFeD3utvPl2nReEpFGaq1cBH0iFFEN9JW0C_DJdBb4dEu4/?imgmax=800&quot; style=&quot;border-style: none;&quot; /&gt;</content><link rel='replies' type='application/atom+xml' href='http://vicrodg.blogspot.com/feeds/4015193551964130433/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://vicrodg.blogspot.com/2010/10/comenzando-con-70-536-en-espanol.html#comment-form' title='18 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4015193551964130433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/142613817781134327/posts/default/4015193551964130433'/><link rel='alternate' type='text/html' href='http://vicrodg.blogspot.com/2010/10/comenzando-con-70-536-en-espanol.html' title='Comenzando con 70- 536! (en español)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbaFZrwaouoFJlUY4CS3gBdANgwW0ey8znpasYG7i-TD7K0qEpxmHCeahQNV66LdM52SysrNdeUIsFeZQJiZGMQ4nKqhGZyDE60n-ugmwanrc8hWWXEHKsf4-howBPNiUmpiGoS90gIo0/s72-c?imgmax=800" height="72" width="72"/><thr:total>18</thr:total></entry></feed>