<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.windowstecnico.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Windows Técnico : .Net, C#</title><link>http://www.windowstecnico.com/archive/tags/.Net/C_2300_/default.aspx</link><description>Etiquetas: .Net, C#</description><dc:language /><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Camino a la cuarta generación del desarrollo software: Desarrollo Dirigido por Modelos y su aplicación con la tecnología Domain Specific Language de Microsoft (Parte III)</title><link>http://www.windowstecnico.com/archive/2010/05/11/camino-a-la-cuarta-generaci-243-n-del-desarrollo-software-desarrollo-dirigido-por-modelos-y-su-aplicaci-243-n-con-la-tecnolog-237-a-domain-specific-language-de-microsoft-parte-iii.aspx</link><pubDate>Tue, 11 May 2010 16:57:56 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:2627</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=2627</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2010/05/11/camino-a-la-cuarta-generaci-243-n-del-desarrollo-software-desarrollo-dirigido-por-modelos-y-su-aplicaci-243-n-con-la-tecnolog-237-a-domain-specific-language-de-microsoft-parte-iii.aspx#comments</comments><description>&lt;p align="justify"&gt;Buenas a todos, en el post de hoy continuaremos la cadena de post sobre desarrollo con DSL Tools y diseñaremos el resto del DSL que comenzamos la semana pasada. Después, contaremos como se diseña la interface gráfica de nuestro DSL.&lt;/p&gt;  &lt;p align="justify"&gt;Para el ejemplo que hemos utilizado y en el que vamos a desarrollar un dsl que nos permita automatizar la generación de ficheros XML, requeriremos una serie de elementos que nos permitan generar un árbol abstracto que simule las etiquetas del árbol XML. Estos elementos serán representados por nodos y atributos. Cada nodo puede tener cero o más atributos. Además, los nodos pueden ser de tres tipos, nodo raíz, nodo hoja, o nodo normal. El nodo raíz podrá tener 0 o más hijos. El nodo hoja no podrá tener hijos. Y los nodos normales tendrán padre y cero o más hijos. Este efecto lo conseguiremos jugando con las cardinalidades.&lt;/p&gt;  &lt;p align="justify"&gt;Ahora aprovecharemos el esqueleto del modelo proporcionado y modificaremos los nombres y atributos de las clases hasta dejarlos como en la captura de pantalla que se verá a continuación.&lt;/p&gt;  &lt;p align="justify"&gt;Cambios a realizar:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Cambiar el nombre del modelo (en la clase “domain class”) de &lt;i&gt;ExampleModel&lt;/i&gt; a &lt;i&gt;ModeloDocXml&lt;/i&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Cambiar el nombre de la clase &lt;i&gt;ExampleElement&lt;/i&gt; a &lt;i&gt;Nodo&lt;/i&gt;. Cambiar el nombre de su atributo &lt;i&gt;Name&lt;/i&gt; a &lt;i&gt;Nombre&lt;/i&gt;. Y añadirle los atributos &lt;i&gt;Campo&lt;/i&gt; (string), &lt;i&gt;Raiz&lt;/i&gt; (boolean), &lt;i&gt;Hoja&lt;/i&gt; (boolean), con los que identificaremos el tipo de nodo del que se trata.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Modificaremos el nombre &lt;i&gt;Elements&lt;/i&gt; a &lt;i&gt;Nodos&lt;/i&gt; de la &lt;i&gt;Reference Relationship&lt;/i&gt; que une &lt;i&gt;ModeloDocXml &lt;/i&gt;con &lt;i&gt;Nodo&lt;/i&gt;. Y que utilizaremos posteriormente para identificar el número de nodos que contiene nuestro modelo. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Además añadiremos una clase nueva a la que le daremos de nombre &lt;i&gt;Atributo&lt;/i&gt; y le añadiremos los atributos &lt;i&gt;Nombre&lt;/i&gt; e &lt;i&gt;Identificador&lt;/i&gt;. Que uniremos a la clase nodo con un &lt;i&gt;Embbeding Relationship&lt;/i&gt;. Modificaremos finalmente la cardinalidad de manera que un nodo pueda tener cero o mas atributos.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Tras realizar estos cambios deberíamos tener nuestro modelo terminado:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_1941CD20.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_03E9391A.png" width="618" height="386" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Ahora llega la hora de diseñar la interface que tendrá nuestro modelo. En la parte derecha veréis que hay un diagrama paralelo llamado &lt;i&gt;Diagram Elements&lt;/i&gt;, en él se diseñará la interface de nuestro modelo.&lt;/p&gt;  &lt;p align="justify"&gt;Para aclararnos renombraremos la forma &lt;i&gt;ExampleShape&lt;/i&gt; a &lt;i&gt;NodoShape&lt;/i&gt;. El &lt;i&gt;ExampleConnector&lt;/i&gt; a &lt;i&gt;NodoConnector&lt;/i&gt; y el &lt;i&gt;LanguageDiagram&lt;/i&gt; a &lt;i&gt;XmlGeneratorDiagram&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Como partimos nuestro modelo de un esqueleto, ya está diseñada la interface de la clase nodo, y de la flecha que se utiliza para unir los nodos. Ahora queda diseñar la interface de los atributos que puede tener un nodo. Para ello arrastraremos desde la toolbox un &lt;i&gt;Geometry Shape&lt;/i&gt; y un &lt;i&gt;Connector&lt;/i&gt; a los que renombraremos como &lt;i&gt;AtributoShape&lt;/i&gt; y &lt;i&gt;AtributoConnector&lt;/i&gt;. Ahora pulsaremos botón derecho sobre &lt;i&gt;Decorator&lt;/i&gt; en la clase &lt;i&gt;AtributoShape&lt;/i&gt; y añadiremos un atributo &lt;i&gt;NameDecorator&lt;/i&gt;, lo que nos permitirá poner un nombre en el atributo, durante el diseño de nuestro modelo. Tras realizar estos cambios deberíais tener lo siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_11E02A6A.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_182991A9.png" width="234" height="652" /&gt;&lt;/a&gt;Y el resultado final sería el siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_01F897B9.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_626E6945.png" width="629" height="490" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora debemos asociar la clase Atributo y el conector que le une con la clase Nodo, con sus correspondientes shape. Para ello utilizaremos la herramienta de la toolbox &lt;i&gt;Diagram Element Map&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Una vez hecho esto pincharemos en la flecha que une la clase &lt;i&gt;Atributo&lt;/i&gt; con &lt;i&gt;AtributoShape&lt;/i&gt; y accederemos a la pestaña &lt;i&gt;Decorator Maps,&lt;/i&gt; donde marcaremos la casilla &lt;i&gt;NameDecorator&lt;/i&gt; como muestra la siguiente imagen y seleccionaremos en &lt;i&gt;Display Property&lt;/i&gt; el atributo &lt;i&gt;Nombre&lt;/i&gt;. De esta manera conseguiremos que dentro del nodo en el modelo muestre el atributo Nombre:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_398B064F.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_68DC7BD9.png" width="626" height="388" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora iremos a la pestaña &lt;i&gt;General&lt;/i&gt; y comprobaremos que el &lt;i&gt;Parent Element Map&lt;/i&gt; está apuntando al &lt;i&gt;ModelDocXml&lt;/i&gt; desde donde hereda, para que posteriormente desde el código del programa podamos acceder a sus atributos:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_62BA50A0.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_091EC49D.png" width="627" height="415" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Finalmente, y como función únicamente estética podremos modificar el aspecto de los nodos y atributos del modelo jugando con las distintas posibilidades que ofrecen desde su correspondiente menú propiedades, colores, formas de los nodos, etc:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_4089F72D.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_5A19366D.png" width="638" height="497" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_3DC61144.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_64B8D2D9.png" width="636" height="495" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Esto es todo por hoy, en el próximo post generaremos la toolbox que contendrá todos los elementos de nuestro DSL y la probaremos.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Hasta el próximo post, saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=2627" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category><category domain="http://www.windowstecnico.com/archive/tags/OSLO/default.aspx">OSLO</category></item><item><title>Camino a la cuarta generación del desarrollo software: Desarrollo Dirigido por Modelos y su aplicación con la tecnología Domain Specific Language de Microsoft (Parte II)</title><link>http://www.windowstecnico.com/archive/2010/05/03/camino-a-la-cuarta-generaci-243-n-del-desarrollo-software-desarrollo-dirigido-por-modelos-y-su-aplicaci-243-n-con-la-tecnolog-237-a-domain-specific-language-de-microsoft-parte-ii.aspx</link><pubDate>Mon, 03 May 2010 20:13:48 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:2612</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=2612</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2010/05/03/camino-a-la-cuarta-generaci-243-n-del-desarrollo-software-desarrollo-dirigido-por-modelos-y-su-aplicaci-243-n-con-la-tecnolog-237-a-domain-specific-language-de-microsoft-parte-ii.aspx#comments</comments><description>&lt;p align="justify"&gt;Buenas a todos, continuando con la cadena de posts sobre Desarrollo Basado en Modelos y su aplicación con DSL hoy vamos a hablar sobre el ejemplo que utilizaremos para explicar el desarrollo de aplicaciones con esta tecnología.&lt;/p&gt;  &lt;p align="justify"&gt;De las alternativas mostradas en el post anterior abordaremos la basada en Domain-Specific Language. Con ella se implementará un Dsl que automatice la escritura de documentos Xml. Para ello en primer lugar se identifican las partes del problema de la generación de documentos Xml que pueden ser modeladas. &lt;/p&gt;  &lt;p align="justify"&gt;Un documento Xml está formado por una iniciación común y por una serie de etiquetas en forma de árbol. Por ejemplo:&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;/p&gt;            &lt;p&gt;&amp;lt;ficha&amp;gt; &lt;/p&gt;            &lt;p&gt;&amp;lt;nombre&amp;gt;&lt;/p&gt;            &lt;p&gt;Juan Antonio&lt;/p&gt;            &lt;p&gt;&amp;lt;/nombre&amp;gt; &lt;/p&gt;            &lt;p&gt;&amp;lt;apellido&amp;gt;&lt;/p&gt;            &lt;p&gt;Calles&lt;/p&gt;            &lt;p&gt;&amp;lt;/apellido&amp;gt; &lt;/p&gt;            &lt;p&gt;&amp;lt;direccion&amp;gt;&lt;/p&gt;            &lt;p&gt;c/elblogdecalles, 4, 1ºK&lt;/p&gt;            &lt;p&gt;&amp;lt;/direccion&amp;gt; &lt;/p&gt;            &lt;p&gt;&amp;lt;/ficha&amp;gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Estas etiquetas podrían ser representadas en un modelo, a través de nodos. Será necesario tener en cuenta que un nodo puede no tener hijos, en este caso se tratará de un nodo hoja, es decir, de una etiqueta que no contiene más etiquetas hijas. Podremos tener también nodos con hijos, entonces podrá tratarse del nodo raíz, que solo habrá uno, o de un nodo intermedio.&lt;/p&gt;  &lt;p align="justify"&gt;Además hay que tener en cuenta que un nodo puede contener ninguno o varios atributos. &lt;/p&gt;  &lt;p align="justify"&gt;Por tanto para representar un documento Xml en un modelo en formato de árbol habrá que desarrollar un modelo que soporte la inclusión de:&lt;/p&gt;  &lt;ol&gt;   &lt;ol&gt;     &lt;li&gt;       &lt;div align="justify"&gt;Iniciación común.&lt;/div&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;div align="justify"&gt;Nodos:&lt;/div&gt;        &lt;ul&gt;         &lt;li&gt;           &lt;div align="justify"&gt;Hoja&lt;/div&gt;         &lt;/li&gt;          &lt;li&gt;           &lt;div align="justify"&gt;Intermedio&lt;/div&gt;         &lt;/li&gt;          &lt;li&gt;           &lt;div align="justify"&gt;Raíz&lt;/div&gt;         &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;div align="justify"&gt;Atributos.&lt;/div&gt;        &lt;ul&gt;         &lt;li&gt;           &lt;div align="justify"&gt;cero o más&lt;/div&gt;         &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;La iniciación común puede sacarse del diseño del modelo, y será codificada directamente en la parte de escritura del código.&lt;/p&gt;  &lt;p align="justify"&gt;Se generarán clases independientes para los nodos y los atributos. Y se tomarán las características: hoja, intermedio y raíz del Nodo, como atributos modificables por el desarrollador durante el diseño del modelo.&lt;/p&gt;  &lt;p align="justify"&gt;Finalmente la posibilidad de que haya cero o más atributos en un nodo se representará con cardinalidades en las uniones de la clase nodo y atributo.&lt;/p&gt;  &lt;p align="justify"&gt;Tras haber planteado el problema y representado el modelo se generará el DSL. Una vez desarrollado, se utilizará para diseñar un documento Xml de manera gráfica, y se codificará el código necesario para ser convertido a la sintaxis de Xml. Estas partes se verán en el próximo punto, Implementación.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc260310312"&gt;Implementación&lt;/a&gt;&lt;/h3&gt;  &lt;h4&gt;&lt;a name="_Toc260310313"&gt;Generación del Proyecto&lt;/a&gt;&lt;/h4&gt;  &lt;p align="justify"&gt;Para el desarrollo de nuestro DSL con Dsl Tools necesitaremos tener instalado Visual Studio 2005/2008 con un SDK actualizado. Para este ejemplo, hemos utilizado Visual Studio 2008, con el SDK 1.0.&lt;/p&gt;  &lt;p align="justify"&gt;En primer lugar se debe abrir Visual Studio, e ir al menú de creación de nuevo proyecto:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_14A6FE35.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_5473756B.png" width="621" height="483" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Después se generará el proyecto, para ello accedemos a Nuevo proyecto -&amp;gt; Otros tipos de proyectos -&amp;gt; Extensibilidad y seleccionamos “Domain-Specific Language Designer”. Le damos un nombre al proyecto y aceptamos:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_65E666F4.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_6989A333.png" width="628" height="430" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Ahora elegiremos Minimal Language, para no tener que empezar a diseñar nuestro DSL desde cero y tengamos ya un pequeño esqueleto generado:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_15CB4B7A.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_62256FCC.png" width="630" height="404" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Ahora nos inventamos un nombre para la extensión que tendrá el fichero donde se guardará nuestro modelo:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_6C0F8299.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_0AEB17DA.png" width="631" height="407" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Indicamos un nombre de compañía:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_372CC020.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_418305E2.png" width="632" height="405" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Y le indicamos que cree una clave ya que no vamos a utilizar una existente:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_0B36FF35.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_40D1DBFE.png" width="630" height="404" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Tras pulsar Finalizar veremos el esqueleto de nuestro DSL:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_0A1C330D.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_39040653.png" width="631" height="491" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Esto es todo por hoy, en el próximo post diseñaremos el resto del DSL y contaremos como se diseña la interface gráfica del mismo.&lt;/p&gt;  &lt;p&gt;saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=2612" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category><category domain="http://www.windowstecnico.com/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.windowstecnico.com/archive/tags/Software/default.aspx">Software</category><category domain="http://www.windowstecnico.com/archive/tags/OSLO/default.aspx">OSLO</category></item><item><title>Camino a la cuarta generación del desarrollo software: Desarrollo Dirigido por Modelos y su aplicación con la tecnología Domain Specific Language de Microsoft (Parte I)</title><link>http://www.windowstecnico.com/archive/2010/04/27/camino-a-la-cuarta-generaci-243-n-del-desarrollo-software-desarrollo-dirigido-por-modelos-y-su-aplicaci-243-n-con-la-tecnolog-237-a-domain-specific-language-de-microsoft-parte-i.aspx</link><pubDate>Tue, 27 Apr 2010 14:20:00 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:2600</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=2600</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2010/04/27/camino-a-la-cuarta-generaci-243-n-del-desarrollo-software-desarrollo-dirigido-por-modelos-y-su-aplicaci-243-n-con-la-tecnolog-237-a-domain-specific-language-de-microsoft-parte-i.aspx#comments</comments><description>&lt;p align="justify"&gt;El desarrollo de software es uno de los procesos que m&amp;aacute;s ha evolucionado en los &amp;uacute;ltimos 30 a&amp;ntilde;os. En la d&amp;eacute;cada de los 80 se introdujo la orientaci&amp;oacute;n a objetos, base de la mayor parte de la tecnolog&amp;iacute;a que se posee en la actualidad. En los a&amp;ntilde;os 90 las numerosas variantes de notaci&amp;oacute;n del an&amp;aacute;lisis y dise&amp;ntilde;o orientado a objetos que comenzaron en la d&amp;eacute;cada anterior derivaron hacia la utilizaci&amp;oacute;n de una notaci&amp;oacute;n com&amp;uacute;n, Unified Modeling Language, UML. &lt;/p&gt;
&lt;p align="justify"&gt;En los &amp;uacute;ltimos a&amp;ntilde;os, UML ha sido un lenguaje bastante criticado, que ha derivado en dos corrientes, sus seguidores y sus no seguidores. A d&amp;iacute;a de hoy han surgido nuevas alternativas de desarrollo de software como Agile y Extreme Programming, que dan menos importancia al modelo inicial y producen un acercamiento m&amp;aacute;s libre a los m&amp;eacute;todos de dise&amp;ntilde;o y administraci&amp;oacute;n de los proyectos.&lt;/p&gt;
&lt;p align="justify"&gt;Hoy UML ha dado un salto muy importante proponiendo una nueva alternativa en el dise&amp;ntilde;o de software, que consiste en la generaci&amp;oacute;n de c&amp;oacute;digo de manera autom&amp;aacute;tica a trav&amp;eacute;s de un modelo. Este sue&amp;ntilde;o id&amp;iacute;lico de todo desarrollador es conocido en la actualidad como el futuro de los lenguajes de cuarta generaci&amp;oacute;n.&lt;/p&gt;
&lt;p align="justify"&gt;Para conseguir esto se deben hacer mejoras en el propio UML, el cual no es capaz de expresar a&amp;uacute;n toda la l&amp;oacute;gica de un problema, y por tanto incapaz de representar completamente como deber&amp;iacute;a de ser un software, como por ejemplo en el tema de las interfaces.&lt;/p&gt;
&lt;p align="justify"&gt;Los dos mayores impulsores de esta tecnolog&amp;iacute;a son Microsoft y la OMG. Esta &amp;uacute;ltima ha sido impulsora de esta tecnolog&amp;iacute;a con su popular Model Driven Architecture, MDA. Microsoft por su parte est&amp;aacute; siendo impulsora de una alternativa a la que ha denominado Software Factory y que est&amp;aacute;&amp;nbsp;teniendo un gran &amp;eacute;xito en los &amp;uacute;ltimos a&amp;ntilde;os. Adem&amp;aacute;s, la creciente aparici&amp;oacute;n de Lenguajes de Dominio, tambi&amp;eacute;n conocidos como DSL, representan nuevos caminos en la construcci&amp;oacute;n de software. Especialmente en los casos en que la orientaci&amp;oacute;n a objetos y el dise&amp;ntilde;o dirigido por modelos est&amp;eacute;n integrados.&lt;/p&gt;
&lt;p align="justify"&gt;Las herramientas de cuarta generaci&amp;oacute;n de las que se hablaba antes no pueden ser consideradas como un lenguaje como tal ya que el desarrollo completo de un proyecto solo puede ser encarado por una arquitectura de trabajo que debe abarcar el ciclo de desarrollo del software casi en su totalidad.&lt;/p&gt;
&lt;p align="justify"&gt;Finalmente, se pueden destacan en esta nueva alternativa de desarrollo la siguientes tendencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;MDA, Model Driven Architecture de la OMG.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;SF, Software Factories de Microsoft.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Oslo.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;SPL, Software Product Lines, SPL&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;a name="_Toc260147196"&gt;Dsl Tools&lt;/a&gt;&lt;/h3&gt;
&lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/22292050804261_5F00_437C8FED.jpg"&gt;&lt;img height="240" width="240" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/22292050804261_5F00_thumb_5F00_54EF8176.jpg" align="left" alt="2229205080426[1]" border="0" title="2229205080426[1]" style="border-right-width:0px;margin:0px 0px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; En la cadena de posts que hoy doy comienzo veremos una implementaci&amp;oacute;n de la tendencia Domain Specific Languages que est&amp;aacute; imponiendo Microsoft con su proyecto OSLO. &lt;/p&gt;
&lt;p align="justify"&gt;Seg&amp;uacute;n la definici&amp;oacute;n propia de Microsoft, DSL (Domain Specific Language), est&amp;aacute; dise&amp;ntilde;ado para ser &amp;uacute;til para una tarea espec&amp;iacute;fica en un dominio de problema fijo. Con un lenguaje grafico o textual, puede definir un nuevo lenguaje de modelado y ponerlo en marcha de manera muy sencilla. Al crear un lenguaje espec&amp;iacute;fico del dominio propio y el dise&amp;ntilde;o del modelo personalizado, se puede especificar exactamente qu&amp;eacute; conceptos se necesitan en la herramienta a desarrollar.&lt;/p&gt;
&lt;p align="justify"&gt;Cuando en el desarrollo se utiliza un DSL, se comienza identificando las partes de las aplicaciones que son susceptibles de ser modeladas usando un DSL. Despu&amp;eacute;s, se define y se implementa este lenguaje. Los usuarios del lenguaje crean modelos que usan para generar el c&amp;oacute;digo y adaptan el c&amp;oacute;digo generado en sus aplicaciones finales.&lt;/p&gt;
&lt;p align="justify"&gt;El Domain-Specific Language Tools&amp;nbsp; permite crear un lenguaje espec&amp;iacute;fico del dominio que tiene su propio dise&amp;ntilde;o gr&amp;aacute;fico y su notaci&amp;oacute;n de diagrama propio, para a continuaci&amp;oacute;n, utilizar el lenguaje para generar el c&amp;oacute;digo fuente adecuadamente para cada proyecto.&lt;/p&gt;
&lt;p align="justify"&gt;El Domain-Specific Development es el proceso de identificar las partes de las aplicaciones que se pueden modelar mediante el uso de un lenguaje espec&amp;iacute;fico del dominio y, a continuaci&amp;oacute;n la construcci&amp;oacute;n del lenguaje y su despliegue a los desarrolladores de aplicaciones. Los desarrolladores utilizan el lenguaje espec&amp;iacute;fico del dominio para construir modelos que son espec&amp;iacute;ficos para sus aplicaciones, utilizar los modelos para generar el c&amp;oacute;digo fuente, y luego usar el c&amp;oacute;digo fuente para desarrollar las aplicaciones.&lt;/p&gt;
&lt;p align="justify"&gt;A continuaci&amp;oacute;n os dejo un link muy importante en el que Microsoft resume en que consiste su proyecto fara&amp;oacute;nico OSLO, en el ver&amp;eacute;is que habla de numerosas tecnolog&amp;iacute;as de las que ya os he ido hablando &amp;uacute;ltimamente como Azure: &lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/dd367845.aspx" title="http://msdn.microsoft.com/es-es/library/dd367845.aspx"&gt;http://msdn.microsoft.com/es-es/library/dd367845.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;En el pr&amp;oacute;ximo post continuaremos hablando sobre Domain-Specific Language Tools de Microsoft y comenzaremos la implementaci&amp;oacute;n de un proyecto software con Visual Studio donde espero poder aclararos un poco las profundas dudas que hay en este tema tan novedoso que es el desarrollo dirigido por modelos.&lt;/p&gt;
&lt;p align="justify"&gt;saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=2600" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Nube/default.aspx">Nube</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category><category domain="http://www.windowstecnico.com/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.windowstecnico.com/archive/tags/OSLO/default.aspx">OSLO</category></item><item><title>Programando para Windows Phone 7 Series</title><link>http://www.windowstecnico.com/archive/2010/03/24/programando-para-windows-phone-7-series.aspx</link><pubDate>Wed, 24 Mar 2010 16:30:40 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:2100</guid><dc:creator>Manuel Fernandez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=2100</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2010/03/24/programando-para-windows-phone-7-series.aspx#comments</comments><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_28616DFF.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_7AEFB261.png" width="305" height="369" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Esta entrada en el blog es de carácter informativo y va destinada a aquellos desarrolladores que haciendo uso del entorno .NET desean programar aplicaciones para telefonía móvil basada en “Windows 7 Phone”.&lt;/p&gt;  &lt;p&gt;(&lt;a href="http://www.windowsphone7series.com/"&gt;http://www.windowsphone7series.com/&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Para ellos Microsoft ha publicado el libro ‘&lt;i&gt;Programming Windows Phone 7 Series&lt;/i&gt;’ descargable desde &lt;a href="http://download.microsoft.com/download/7/C/8/7C820C6F-C205-4ECF-B9F3-1505DD13F9BF/ProgWinPhonePreview.pdf"&gt;http://download.microsoft.com/download/7/C/8/7C820C6F-C205-4ECF-B9F3-1505DD13F9BF/ProgWinPhonePreview.pdf&lt;/a&gt; en el cual se tratan diversos aspectos de la programación sobre este tipo de dispositivos, proporcionando a su vez código fuente a modo de ejemplo.&lt;/p&gt;  &lt;p&gt;Los capítulos contenidos en el libro son los siguientes:&lt;/p&gt;  &lt;p&gt;· Capitulo 1: Phone Hardware + Your Software&lt;/p&gt;  &lt;p&gt;· Capitulo 2: Hello, Windows Phone&lt;/p&gt;  &lt;p&gt;· Capitulo 3: Code and XAML&lt;/p&gt;  &lt;p&gt;· Capitulo 4: Presentation and Layout&lt;/p&gt;  &lt;p&gt;· Capitulo 5: Principles of Movement&lt;/p&gt;  &lt;p&gt;· Capitulo 6: Textures and Sprites&lt;/p&gt;  &lt;p&gt;El manual plantea todos los ejemplos y desarrollos haciendo uso del lenguaje C# .NET. Por ello es necesario disponer de conocimientos de programación en este lenguaje. Para aquellos que ya tengáis dichos conocimientos y deseéis programar sobre ‘Windows 7 Phone’, este libro es ideal para tomarlo como guía de referencia.&lt;/p&gt;  &lt;p&gt;Un saludo y espero que esta información os sea de utilidad ¡¡¡¡¡&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=2100" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category><category domain="http://www.windowstecnico.com/archive/tags/Windows+Mobile/default.aspx">Windows Mobile</category><category domain="http://www.windowstecnico.com/archive/tags/M_F300_viles/default.aspx">Móviles</category></item><item><title>Modificación e inyección de código en ensamblados .NET</title><link>http://www.windowstecnico.com/archive/2010/02/09/modificaci-243-n-e-inyecci-243-n-de-c-243-digo-en-ensamblados-net.aspx</link><pubDate>Tue, 09 Feb 2010 19:02:52 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:1718</guid><dc:creator>Manuel Fernandez</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=1718</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2010/02/09/modificaci-243-n-e-inyecci-243-n-de-c-243-digo-en-ensamblados-net.aspx#comments</comments><description>&lt;p&gt;Durante éste articulo se verá cómo es posible modificar los ensamblados en .NET, de modo que podamos inyectar nuestro propio código .NET o código no manejado en éstas aplicaciones, pudiendo dotarlas de nuevas características como plugins sin que la aplicación original disponga de soporte para ello.&lt;/p&gt;  &lt;p&gt;· &lt;a href="http://www.red-gate.com/products/reflector/"&gt;Reflector&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· &lt;a href="http://sebastien.lebreton.free.fr/reflexil/"&gt;Reflexil&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para realizar esto se hará uso de un decompilador de .NET (Reflector), un plugin con el que inyectar código IL (Reflexil) y un mínimo de conocimientos del lenguaje .NET y IL.&lt;/p&gt;  &lt;p&gt;Antes de comenzar, debemos instalar el plugin ‘Reflexil’ para ‘Reflector’. Para agregarlo, basta con ir a ‘View -&amp;gt; Add-ins -&amp;gt; Add’ y cargar la librería ‘reflexil.dll’ . Una vez cargado, es posible acceder a su menú haciendo clic en ‘Tools -&amp;gt; Reflexil’.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image002_5F00_2573352B.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="clip_image002" border="0" alt="clip_image002" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image002_5F00_thumb_5F00_63F882D1.jpg" width="335" height="489" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Cargando plugin Reflexil&lt;/p&gt;  &lt;p&gt;Ahora, crearemos una pequeña librería en .NET que será la que la aplicación cargará, consiguiendo así la ejecución de código y accesibilidad a sus componentes internos a través de reflexión.&lt;/p&gt;  &lt;p&gt;La Liberia será muy sencilla, únicamente cargará un formulario con una imagen y mostrará un mensaje.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image004_5F00_1E074FB1.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="clip_image004" border="0" alt="clip_image004" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image004_5F00_thumb_5F00_00B1F7E7.jpg" width="513" height="309" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Código que cargaremos en la aplicación como DLL.&lt;/p&gt;  &lt;p&gt;Una vez tenemos nuestra librería, es necesaria la decompilación de la aplicación sobre la cual queremos realizar la inyección de código, basta con arrastrar el ejecutable sobre el panel de ‘&lt;i&gt;Reflector&lt;/i&gt;’, y se nos mostrará un árbol con todas sus métodos, propiedades, etc.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image006_5F00_3AC0C4C6.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="clip_image006" border="0" alt="clip_image006" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image006_5F00_thumb_5F00_1D6B6CFC.jpg" width="499" height="313" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para saber donde realizar la inclusión de nuestro código se debe localizar el punto de entrada de la aplicación, o el método en el que se desea que se ejecute el código. En mi caso lo realizaré sobre la entrada a la aplicación, en &lt;b&gt;Main(String[])&lt;/b&gt; .&lt;/p&gt;  &lt;p&gt;Una vez llegamos a éste punto, es hora de usar ‘&lt;i&gt;Reflexil&lt;/i&gt;’ para la inclusión de código IL. Unicamente deberemos inyectar las instrucciones necesarias para que realice la carga de forma dinámica de la librería que hemos creado anteriormente.&lt;/p&gt;  &lt;p&gt;No os asustéis, únicamente son cinco instrucciones, y una vez la aplicación esté parcheada no será necesaria volver a modificarla. Basta con hacer clic derecho sobre el panel de ‘&lt;i&gt;Instructions&lt;/i&gt;’ del plugin y clic sobre ‘&lt;i&gt;Create new&lt;/i&gt;’ para agregar las siguientes instrucciones:&lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;LDSTR&lt;/strong&gt; ‘c:\ruta\libreria.dll’&lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;CALL&lt;/strong&gt; System.Reflection.Assembly::LoadFile(System.String)&lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;LDSTR&lt;/strong&gt; ‘namespace.class’&lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;CALLVIRT&lt;/strong&gt; System.Reflection.Assembly::CreateInstance(System.String)&lt;/p&gt;  &lt;p&gt;· &lt;strong&gt;POP&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image008_5F00_577A39DB.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="clip_image008" border="0" alt="clip_image008" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image008_5F00_thumb_5F00_00A1D21A.jpg" width="532" height="178" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;LDSTR ‘c:\ruta\libreria.dll’&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image010_5F00_0CC34C41.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="clip_image010" border="0" alt="clip_image010" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image010_5F00_thumb_5F00_045F76EA.jpg" width="520" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;CALL System.Reflection.Assembly::LoadFile(System.String)&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image012_5F00_29E8F44B.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="clip_image012" border="0" alt="clip_image012" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image012_5F00_thumb_5F00_4F7271AC.jpg" width="517" height="173" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;LDSTR ‘namespace.class’&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image014_5F00_470E9C55.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="clip_image014" border="0" alt="clip_image014" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image014_5F00_thumb_5F00_70363493.jpg" width="509" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;CALLVIRT System.Reflection.Assembly::CreateInstance(System.String)&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image016_5F00_43AD04AD.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="clip_image016" border="0" alt="clip_image016" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image016_5F00_thumb_5F00_6936820E.jpg" width="514" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;POP&lt;/p&gt;  &lt;p&gt;Cuando se busque el método CreateInstance() o LoadFile() en las instrucciones CALL y CALLVIRT, se encontrarán dentro del nodo ‘&lt;i&gt;mscorlib -&amp;gt; CommonLanguajeRuntimeLibrary -&amp;gt; System.Reflection -&amp;gt; Assembly&lt;/i&gt;’.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image018_5F00_79CE7CFC.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="clip_image018" border="0" alt="clip_image018" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image018_5F00_thumb_5F00_37E797AE.jpg" width="489" height="372" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Una vez finalizado, el método modificado debería quedar de forma similar a la siguiente captura de pantalla (En azul está el código inyectado que realiza la carga de la librería):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image020_5F00_23EE0518.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="clip_image020" border="0" alt="clip_image020" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image020_5F00_thumb_5F00_1B8A2FC1.jpg" width="659" height="274" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Una vez finalizado podemos guardar el ensamblado modificado haciendo clic en el nodo del ensamblado en Reflector, y a continuación en ‘&lt;i&gt;Save As&lt;/i&gt;’.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image022_5F00_07909D2B.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="clip_image022" border="0" alt="clip_image022" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image022_5F00_thumb_5F00_5F11BB16.jpg" width="535" height="469" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Guardando el ensamblado modificado&lt;/p&gt;  &lt;p&gt;Si todo se ha realizado correctamente, al ejecutar la aplicación se cargará y ejecutará nuestra librería, consiguiendo así nuestro objetivo, como se puede ver en la siguiente captura de pantalla, donde junto con la ejecución de la aplicación también se ha ejecutado el formulario que desarrollamos en la librería.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image024_5F00_3692D902.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="clip_image024" border="0" alt="clip_image024" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image024_5F00_thumb_5F00_23057961.jpg" width="539" height="405" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;También aprovecho para hacer uso de ProcessExplorer, mediante el cual se puede ver como la aplicación tiene cargada en memoria la librería ‘&lt;i&gt;dll.dll&lt;/i&gt;’.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image026_5F00_3331415A.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="clip_image026" border="0" alt="clip_image026" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image026_5F00_thumb_5F00_42F0D65E.jpg" width="573" height="300" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Éste ha sido un sencillo ejemplo de los pasos necesarios para la posibilidad de ejecución de código por una aplicación. Esto, junto con conocimientos de reflexión en .NET abre un gran número de posibilidades, donde se puede obtener un gran control sobre la aplicación, ofreciendo la posibilidad de crear o agregar nuevas características a las mismas.&lt;/p&gt;  &lt;p&gt;¡Hasta otra!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=1718" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Trucos/default.aspx">Trucos</category><category domain="http://www.windowstecnico.com/archive/tags/Mejoras/default.aspx">Mejoras</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Obtener IP publica desde consola</title><link>http://www.windowstecnico.com/archive/2009/12/10/obtener-ip-publica-desde-consola.aspx</link><pubDate>Thu, 10 Dec 2009 10:13:48 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:1375</guid><dc:creator>Manuel Fernandez</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=1375</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/12/10/obtener-ip-publica-desde-consola.aspx#comments</comments><description>&lt;p&gt;Para aquellos amantes de la consola de comandos, nuestro compañero Francisco Oca (&lt;a href="http://el-blog-de-thor.blogspot.com"&gt;http://el-blog-de-thor.blogspot.com&lt;/a&gt;) ha realizado una pequeña aplicación portable en C#, muy útil para obtener la dirección IP pública de la máquina.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image002_5F00_63CF5F69.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="clip_image002" border="0" alt="clip_image002" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image002_5F00_thumb_5F00_0F338064.jpg" width="525" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El funcionamiento es muy simple, la ejecución de la aplicación muestra por consola la dirección IP, y si se le aplica el parámetro –c (‘getip –c’) copiará la dirección IP en el portapapeles.&lt;/p&gt;  &lt;p&gt;La aplicación y el código fuente puede ser descargado desde el adjunto al final del documento.&lt;/p&gt;  &lt;p&gt;Adjunto con código fuente y binario: &lt;a href="http://www.windowstecnico.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/GetIP.rar"&gt;GetIP.rar&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=1375" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Internet/default.aspx">Internet</category><category domain="http://www.windowstecnico.com/archive/tags/Usabilidad/default.aspx">Usabilidad</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Matar procesos desde código C# en .NET</title><link>http://www.windowstecnico.com/archive/2009/12/02/matar-procesos-desde-c-243-digo-c-en-net.aspx</link><pubDate>Wed, 02 Dec 2009 09:37:33 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:1311</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=1311</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/12/02/matar-procesos-desde-c-243-digo-c-en-net.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_2BEAAF89.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_2B12499F.png" width="400" height="347" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;A menudo, en nuestros desarrollos nos encontramos con la necesidad de querer parar algún tipo de proceso, normalmente porque son procesos largos y que ya nos han proporcionado la información que creíamos necesaria, para ello no necesitamos ir al TaskManager y matar el proceso cada vez que lo ejecutemos, desde el propio código C# podremos crearnos un botón y hacer que cuando le pulsemos mate todos los procesos que haya con un determinado nombre.&lt;/p&gt;  &lt;p align="justify"&gt;En el siguiente ejemplo os muestro como mataríamos todos los procesos del programa &lt;i&gt;nslooup&lt;/i&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;private void button1_Click(object sender, EventArgs e)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (Process proceso in Process.GetProcesses())&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (proceso.ProcessName == “nslookup&amp;quot;)&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proceso.Kill();&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;El código como veis es muy sencillo. Se trata de recorrer con un foreach todos los procesos que existen en la máquina, que obtendremos con la función “GetProcesses()”, y verificar que si el proceso obtenido se llama igual que el que queremos matar, llamamos a la función Kill() para matarlo.&lt;/p&gt;  &lt;p align="justify"&gt;En próximos post me gustaría seguir contando algunos pequeños trucos de .NET para facilitaros las tareas de desarrollo. Hasta el próximo post.&lt;/p&gt;  &lt;p align="justify"&gt;Saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=1311" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Creación e instalación de módulos para Internet Information Services 7 (parte III)</title><link>http://www.windowstecnico.com/archive/2009/11/02/creaci-243-n-e-instalaci-243-n-de-m-243-dulos-para-internet-information-services-7-parte-iii.aspx</link><pubDate>Mon, 02 Nov 2009 14:21:15 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:1165</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=1165</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/11/02/creaci-243-n-e-instalaci-243-n-de-m-243-dulos-para-internet-information-services-7-parte-iii.aspx#comments</comments><description>&lt;p align="justify"&gt;Hoy vamos a finalizar la cadena de post sobre programación de módulos para IIS7. En este post voy a explicaros cómo programar vuestro propio módulo con interfaz gráfica configurable y cómo instalarlo en el IIS.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;&lt;u&gt;¿Para que sirve un módulo gráfico?&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Muchos, por no decir la mayoría de los programas requieren de algunos parámetros que necesitan ser configurables para adaptarse a las diferentes situaciones para las que es aplicable el programa que se ha desarrollado. Los módulos del IIS no son menos, y estos no son ni más ni menos que un programa normal, pero embebido dentro de la interfaz del IIS. La programación gráfica de estos programas será exactamente igual a la de otro programa realizado en .NET, con la diferencia de que tendremos que añadirle algunos elementos para que pueda ser reconocido por el IIS. ¡Vamos a ello!&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;&lt;u&gt;Instalaciones necesarias:&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;1. Microsoft Server 2008&lt;/p&gt;  &lt;p align="justify"&gt;2. Visual Studio 2005-2008&lt;/p&gt;  &lt;p align="justify"&gt;3. IIS 7&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;&lt;u&gt;Construcción del módulo:&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Una vez tengamos IIS instalado, abrimos el Visual Studio, el primer paso para la construcción de nuestro módulo será crear un nuevo proyecto, seleccionamos &lt;i&gt;crear una nueva Biblioteca de clases&lt;/i&gt;, le damos un nombre, por ejemplo: &lt;i&gt;proyecto_i64&lt;/i&gt; y aceptamos:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_c6EYhkUKGik/SkKrMurtUUI/AAAAAAAACCM/S3zw7_pvr34/s1600-h/clip_image002%5B4%5D.jpg"&gt;&lt;img title="clip_image001" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="456" alt="clip_image001" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image001_5F00_4EEF7D6F.jpg" width="587" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Eliminamos la clase que nos crea por defecto: Class1.cs, que no la vamos a utilizar. &lt;/p&gt;  &lt;p align="justify"&gt;Ahora tenemos que añadir dos referencias, para ello hacemos clic con el botón derecho del ratón en “References” y pulsamos en “Agregar Referencia”. &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_c6EYhkUKGik/SkKrN84hMSI/AAAAAAAACCU/AAY_7z6w-u4/s1600-h/clip_image004%5B5%5D.jpg"&gt;&lt;img title="clip_image002" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="509" alt="clip_image002" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image002_5F00_6B2256FE.jpg" width="589" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Tenemos que incluir las siguientes referencias: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Microsoft.Web.Administration.dll.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Microsoft.Web.Management.dll. &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Las encontraremos en la pestaña examinar, en la ruta: c:\windows\system32\inetsrv.&lt;/p&gt;  &lt;p align="justify"&gt;Una vez agregadas las referencias procedemos a firmar nuestra librería, para que el IIS pueda reconocerla como .dll:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;1. Para firmar nuestra librería .dll hacemos doble clic en el explorador de soluciones en la etiqueta “properties” y nos vamos a la pestaña “firma”, marcamos la casilla “firmar el ensamblado” y en seleccionar un archivo de clave de nombre seguro le damos a &amp;lt;Nueva..&amp;gt;:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_c6EYhkUKGik/SkKrPIYmSkI/AAAAAAAACCc/RfW1uY-eEg8/s1600-h/clip_image006%5B4%5D.jpg"&gt;&lt;img title="clip_image003" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="550" alt="clip_image003" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image003_5F00_0348520B.jpg" width="564" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;2. Le asignamos un nombre, por ejemplo, key.snk y desmarcamos la casilla de proteger con contraseña. Con esto ya tenemos nuestra .dll firmada:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_c6EYhkUKGik/SkKrQf5CCzI/AAAAAAAACCk/fUq5zHSjEZs/s1600-h/clip_image007%5B4%5D.jpg"&gt;&lt;img title="clip_image004" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="358" alt="clip_image004" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image004_5F00_673CB481.jpg" width="563" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;3. Tenemos que añadir un pequeño script, que nos enviará nuestra .dll firmada a la carpeta de ensamblados que se encuentra en la ruta C:\Windows\assembly, desde donde el IIS la recogerá para poder agregarla finalmente cómo modulo. Para ello, sin salirnos de la ventana “properties” nos vamos a la pestaña “Eventos de generación”, y en el cuadro “línea de comandos del evento posterior a la generación” incluimos el siguiente script si estáis usando Visual Studio 2005:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;CALL &amp;quot;%VS80COMNTOOLS%\vsvars32.bat&amp;quot; &amp;gt; NULL&lt;/p&gt;            &lt;p&gt;gacutil.exe /if &amp;quot;$(TargetPath)&amp;quot;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;ó el siguiente si estáis usando Visual Studio 2008:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;CALL &amp;quot;%VS90COMNTOOLS%\vsvars32.bat&amp;quot; &amp;gt; NULL&lt;/p&gt;            &lt;p&gt;gacutil.exe /if &amp;quot;$(TargetPath)&amp;quot;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Quedando finalmente algo cómo lo siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_c6EYhkUKGik/SkKrRq7aJ6I/AAAAAAAACCs/7DntcEV43nM/s1600-h/clip_image009%5B4%5D.jpg"&gt;&lt;img title="clip_image005" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="449" alt="clip_image005" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image005_5F00_1F7DBC4B.jpg" width="622" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Una vez hecho esto vamos a proceder a preparar el módulo. Se va a componer de tres partes, las dos primeras son comunes a cualquier tipo de modulo que queramos crear, la tercera tendrá una parte también común y otra que variará dependiendo del módulo que queramos realizar, que será la parte de la interfaz:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;1. &lt;b&gt;&lt;u&gt;Module:&lt;/u&gt;&lt;/b&gt; Inicializa el módulo en nuestro servidor, y lo añade a la consola del IIS para poder seleccionarlo.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;2. &lt;u&gt;Module Provider:&lt;/u&gt; Donde indicaremos el alcance de nuestro módulo, para todo el servidor, o local a ciertas partes, el tipo de módulo, etc.&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;3. &lt;b&gt;&lt;u&gt;Module Page:&lt;/u&gt;&lt;/b&gt; Esta es la parte más importante de nuestro módulo, aquí es donde programaremos la interface gráfica y las acciones del mismo.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Ya que está claro de qué partes se compondrá nuestro módulo, ahora procedemos a montarlo.&lt;/p&gt;  &lt;p align="justify"&gt;Primero crearemos el Module, para ello agregamos un nuevo elemento al proyecto, le damos un nombre, por ejemplo, i64Module, y añadimos el siguiente código, en caso de utilizar otros nombres deberéis cambiar las diferentes llamadas que haya en el código a otras partes del módulo por el nombre que hayáis elegido:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;using System;&lt;/p&gt;            &lt;p&gt;using Microsoft.Web.Management.Client;&lt;/p&gt;            &lt;p&gt;using System.Windows.Forms;&lt;/p&gt;            &lt;p&gt;using Microsoft.Web.Management.Server;&lt;/p&gt;            &lt;p&gt;namespace proyecto_i64&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;internal class i64Module : Module&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;protected override void Initialize(IServiceProvider serviceProvider, Microsoft.Web.Management.Server.ModuleInfo moduleInfo)&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;base.Initialize(serviceProvider, moduleInfo);&lt;/p&gt;            &lt;p&gt;IControlPanel controlPanel = (IControlPanel)GetService(typeof(IControlPanel));&lt;/p&gt;            &lt;p&gt;ModulePageInfo modulePageInfo = new ModulePageInfo(this, typeof(i64Page), &amp;quot;Respuestas&amp;quot;, &amp;quot;Muestra proc&amp;quot;);&lt;/p&gt;            &lt;p&gt;controlPanel.RegisterPage(modulePageInfo);&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;En Segundo lugar tenemos que montar el Module Provider, volvemos a agregar un nuevo elemento al proyecto, le damos un nombre, por ejemplo: i64Provider, y añadimos el código siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;using System;&lt;/p&gt;            &lt;p&gt;using Microsoft.Web.Management.Server;&lt;/p&gt;            &lt;p&gt;namespace proyecto_i64&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;class i64Provider : ModuleProvider&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;//devuelve el tipo de módulo de servicios que está asociado con el proveedor de módulo&lt;/p&gt;            &lt;p&gt;public override Type ServiceType&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;get { return null; }&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;            &lt;p&gt;//metodo que devuelve informacion sobre nuestro modulo&lt;/p&gt;            &lt;p&gt;public override ModuleDefinition GetModuleDefinition(IManagementContext context)&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;return new ModuleDefinition(Name, typeof(i64Module).AssemblyQualifiedName);&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;            &lt;p&gt;//decide el alcance del modulo, en nuestro caso, TODO el servidor&lt;/p&gt;            &lt;p&gt;public override bool SupportsScope(ManagementScope scope)&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;return true;&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;En tercer lugar tenemos que montar el Module Page, volvemos a agregar un Nuevo elemento al proyecto y le damos un nombre, por ejemplo: i64Page. Esta parte es la más compleja, así que vamos a ir por partes, en primer lugar debemos crear el esqueleto, por lo que agregaremos el siguiente código:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;using System;&lt;/p&gt;            &lt;p&gt;using System.Windows.Forms;&lt;/p&gt;            &lt;p&gt;using Microsoft.Web.Administration;&lt;/p&gt;            &lt;p&gt;using Microsoft.Web.Management.Client.Win32;&lt;/p&gt;            &lt;p&gt;namespace proyecto_i64&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;internal class i64Page : ModulePage&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;Microsoft.Web.Administration.ServerManager manager = new ServerManager();&lt;/p&gt;            &lt;p&gt;public i64Page()&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;InitializeComponent();&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;            &lt;p&gt;private void InitializeComponent()&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Una vez agregado, vamos a estudiarlo. Nada más empezar tenemos la siguiente línea de código: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;Microsoft.Web.Administration.ServerManager manager = new ServerManager();&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Esta línea crea una nueva ServiceManager que podemos utilizar para recuperar las solicitudes de nuestro servidor, en caso de que lo necesitemos. Después ya podemos ver la función que inicializará nuestro módulo. Ahora queremos programar una interface gráfica para nuestro módulo. Para ellos vamos a aprovechar la característica Forms que nos brinda .NET, desde la que podemos agregar todo tipo de elementos gráficos pinchándolos con el botón del ratón y arrastrando desde una toolbar. Para poder utilizar Forms, debemos hacer un pequeño truco, tenemos que cambiar el tipo de clase actual:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;internal class i64Page : ModulePage&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;por el siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;internal class i64Page : Form&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora si hacemos doble clic en el explorador de soluciones sobre nuestra clase i64Page, se nos abrirá una ventana con un fondo blanco, este será el aspecto de nuestro módulo, si abrimos el cuadro de herramientas, veremos todos los posibles elementos que le podemos agregar, por ejemplo, podéis agregar un button y un campo label, cambiar fondos de la pantalla, tipos de letra,... Si queremos que alguno de estos elementos interactúe con nuestro módulo haremos doble clic sobre él una vez que lo hayamos agregado, de esta manera se nos añade el sólo al código de nuestra clase i64Page. &lt;/p&gt;  &lt;p align="justify"&gt;Una vez agregados los elementos volvemos a dejar el tipo de la clase como estaba antes, si no, nos dará fallo de compilación:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;internal class i64Page : ModulePage&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora veremos que se nos han añadido varias partes nuevas a nuestro código. Primero veremos que nada más empezar la clase se nos han incluido la declaración del button y el label, y de los demás elementos que agregasemos antes. Después en la función InitializeComponent(), se nos ha añadido todo el apartado gráfico de los elementos que hemos agregado, esto lo hace internamente el Visual Studio, por lo que directamente procedemos a ignorarlo. Por otro lado vemos que se nos ha añadido una función nueva por cada elemento insertado en el que hicimos doble clic. En estas funciones es donde debemos programar lo que queremos que haga nuestro módulo, por ejemplo en la función button, podemos decirle que muestre un determinado texto en el label.&lt;/p&gt;  &lt;p align="justify"&gt;Ya tenemos nuestro módulo terminado, si lo guardamos y compilamos, el gacutil firmará el ensamblado y podremos acceder a él en la ruta: C:\Windows\assembly. Le buscamos en dicha carpeta y deberemos copiar el key que le ha sido asignado, para ello (pulsamos botón derecho sobre el, propiedades y lo copiamos:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_c6EYhkUKGik/SkKrS8PucBI/AAAAAAAACC0/K3kPkWPPe7o/s1600-h/clip_image011%5B4%5D.jpg"&gt;&lt;img title="clip_image006" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="526" alt="clip_image006" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image006_5F00_0BF2ED5B.jpg" width="509" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora debemos irnos al fichero Administration.config, en la ruta:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;c:\windows\system32\inetsrv\config\Administration.config&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Y modificaremos 2 líneas. Para abrirlo veréis que posiblemente no tengáis derechos de administrador, por lo que hay que subir los derechos del fichero o bien abrirlo desde el WordPad por ejemplo ejecutándolo como administrador: &lt;/p&gt;  &lt;p align="justify"&gt;Buscamos la línea &amp;lt;ModuleProviders&amp;gt; dentro del fichero y añadimos después la siguiente línea, sustituyendo la palabra KEY por el key que antes copiamos:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&amp;#160;&lt;/td&gt;          &lt;td&gt;&amp;#160;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;&amp;lt;add name=&amp;quot;CurrentRequestsUI&amp;quot; type=&amp;quot;CurrentRequestsUI.RequestModuleProvider, CurrentRequestsUI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=269f1cc1a4bf892b&amp;quot; /&amp;gt; &amp;lt;add name=&amp;quot;proyecto_i64&amp;quot; type=&amp;quot;proyecto_i64. i64Provider, proyecto_i64, Version=1.0.0.0, Culture=neutral, PublicKeyToken=KEY&amp;quot; /&amp;gt; &lt;/p&gt;         &lt;/td&gt;          &lt;td&gt;&amp;#160;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora buscamos la línea &amp;lt;modules&amp;gt; y añadimos la siguiente línea: &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;&amp;lt;add name=&amp;quot;CurrentRequestsUI&amp;quot; /&amp;gt; &amp;lt;add name=&amp;quot;proyecto_i64&amp;quot; /&amp;gt; &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Si habéis dado otros nombres al proyecto y al provider deberéis modificarlos por los correspondientes.&lt;/p&gt;  &lt;p align="justify"&gt;Una vez hecho todo, reiniciamos el servidor, para ello abrimos una consola en modo administrador y escribimos: &lt;b&gt;&lt;i&gt;iisreset&lt;/i&gt;&lt;/b&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;Con esto ya deberíamos tener el módulo funcionando y con un icono seleccionable en nuestro servidor:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_c6EYhkUKGik/SkKrUAj5zAI/AAAAAAAACC8/q17oatMDWI0/s1600-h/clip_image013%5B4%5D.jpg"&gt;&lt;img title="clip_image007" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="555" alt="clip_image007" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image007_5F00_71B7A598.jpg" width="503" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Si lo abrimos podremos ver la interface de nuestro módulo. Para restar complejidad al post he decidido no comentar aspectos sobre la interfaz, que son comunes a cualquier otro desarrollo realizado en .NET por lo que para ello podréis acceder a numerosos manuales oficiales donde os explicarán en profundidad esta tarea. &lt;/p&gt;  &lt;p align="justify"&gt;Saludos! Y hasta el próximo post&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=1165" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Interfaz/default.aspx">Interfaz</category><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/IIS/default.aspx">IIS</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Creación e instalación de módulos para Internet Information Services 7 (parte II)</title><link>http://www.windowstecnico.com/archive/2009/10/30/creaci-243-n-e-instalaci-243-n-de-m-243-dulos-para-internet-information-services-7-parte-ii.aspx</link><pubDate>Fri, 30 Oct 2009 12:24:00 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:1158</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=1158</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/10/30/creaci-243-n-e-instalaci-243-n-de-m-243-dulos-para-internet-information-services-7-parte-ii.aspx#comments</comments><description>&lt;p align="justify"&gt;En el post de hoy vamos a continuar con la cadena de post en los que voy a explicaros los aspectos b&amp;aacute;sicos sobre la programaci&amp;oacute;n de m&amp;oacute;dulos para IIS7, que comenzamos el pasado d&amp;iacute;a explicando que era IIS7 y comentando el lenguaje y el entorno de programaci&amp;oacute;n necesarios para el desarrollo:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.windowstecnico.com/archive/2009/10/27/creaci-243-n-e-instalaci-243-n-de-m-243-dulos-para-internet-information-services-7-parte-i.aspx"&gt;http://www.windowstecnico.com/archive/2009/10/27/creaci-243-n-e-instalaci-243-n-de-m-243-dulos-para-internet-information-services-7-parte-i.aspx&lt;/a&gt;&lt;a href="http://elblogdecalles.blogspot.com/2009/06/programacion-de-modulos-para-iis7-i-de.html"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Tras conocer un poco mas sobre el entorno, el siguiente paso ser&amp;aacute; plantearnos: &amp;iquest;Qu&amp;eacute; queremos hacer con un m&amp;oacute;dulo en el IIS?. Para aclararos un poco mas esta pregunta os voy a describir los dos tipos de m&amp;oacute;dulos que podemos programar en IIS7:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;M&amp;oacute;dulos de IIS7&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;En IIS7 podremos instalar 2 tipos de m&amp;oacute;dulos programados por nosotros, en primer lugar podremos crear m&amp;oacute;dulos gr&amp;aacute;ficos, que cuentan con una interfaz gr&amp;aacute;fica para realizar configuraciones en el IIS y en segundo lugar podremos programar m&amp;oacute;dulos manejadores, que crean un manejador que se encuentra en todo momento escuchando todas las peticiones que llegan al servidor y cuando interceptan una nos permiten acceder a dicha petici&amp;oacute;n y modificarla. &lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Creaci&amp;oacute;n e instalaci&amp;oacute;n de un m&amp;oacute;dulo filtrador de peticiones para IIS7&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Hoy os voy ha ense&amp;ntilde;ar a programar el 2&amp;ordm; de los m&amp;oacute;dulos que antes comentamos, el m&amp;oacute;dulo manejador, y crearemos el ejemplo mas sencillo de m&amp;oacute;dulo, que simplemente interceptar&amp;aacute; una petici&amp;oacute;n web, y le devolver&amp;aacute; al cliente que la realiz&amp;oacute; la p&amp;aacute;gina solicitada pero con una cadena de texto al final.&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;Instalaciones necesarias:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Para la implementaci&amp;oacute;n necesitaremos los siguientes elementos:&lt;/p&gt;
&lt;p align="justify"&gt;1. Microsoft Server 2008, Microsoft Server 2008 R2, Windows Vista o Windows 7&lt;/p&gt;
&lt;p align="justify"&gt;2. Visual Studio 2005-2008&lt;/p&gt;
&lt;p align="justify"&gt;3. IIS 7&lt;/p&gt;
&lt;p align="justify"&gt;4. Asistente para creaci&amp;oacute;n de m&amp;oacute;dulos: IIS7 Managed Module Starter Kit que ha producido el &lt;a href="http://www.iis.net/downloads/IISTeam/FindProfile.ashx"&gt;IISTeam&lt;/a&gt;, y que proporcionar&amp;aacute; el esqueleto del m&amp;oacute;dulo para el IIS, se puede descargar desde:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;i=1302&amp;amp;g=6"&gt;http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;i=1302&amp;amp;g=6&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;Construcci&amp;oacute;n del m&amp;oacute;dulo:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Tras haber instalado el IIS7 Managed Module Starter Kit, cuando se crea un nuevo proyecto se puede ver como se ha a&amp;ntilde;adido una nueva opci&amp;oacute;n:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_c6EYhkUKGik/SiwoBuQoK0I/AAAAAAAAB-s/FzbpviDgBKU/s1600-h/image%5B4%5D.png"&gt;&lt;img border="0" width="599" src="http://lh6.ggpht.com/_c6EYhkUKGik/SiwoC7VCtCI/AAAAAAAAB-w/nlfvl-FNRII/image_thumb%5B2%5D.png?imgmax=800" alt="image" height="433" style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;La seleccionamos, le damos un nombre, una ubicaci&amp;oacute;n y aceptamos. Inmediatamente despu&amp;eacute;s se nos abrir&amp;aacute; una ventana donde nos resumen el contenido del asistente. Hacemos doble clic en el explorador de soluciones en el fichero MyModule.cs, que modificaremos dependiendo de las necesidades que tengamos en nuestro m&amp;oacute;dulo. Se nos abrir&amp;aacute; la ventana con el c&amp;oacute;digo del fichero, si expandimos las partes de c&amp;oacute;digo minimizadas, nos aparecer&amp;aacute; lo siguiente:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align="justify"&gt;using System;&lt;/p&gt;
&lt;p align="justify"&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p align="justify"&gt;using System.Text;&lt;/p&gt;
&lt;p align="justify"&gt;using System.Web;&lt;/p&gt;
&lt;p align="justify"&gt;namespace MyIIS7Modules&lt;/p&gt;
&lt;p align="justify"&gt;{&lt;/p&gt;
&lt;p align="justify"&gt;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;/// The module class.&lt;/p&gt;
&lt;p align="justify"&gt;/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;public class MyModule : IHttpModule&lt;/p&gt;
&lt;p align="justify"&gt;{&lt;/p&gt;
&lt;p align="justify"&gt;#region IHttpModule Members&lt;/p&gt;
&lt;p align="justify"&gt;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;/// Initializes the module, and registers for application events.&lt;/p&gt;
&lt;p align="justify"&gt;/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;/// &amp;lt;param name=&amp;quot;application&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;/// The System.Web.HttpApplication instance exposing application events.&lt;/p&gt;
&lt;p align="justify"&gt;/// &amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;public void Init(HttpApplication application)&lt;/p&gt;
&lt;p align="justify"&gt;{&lt;/p&gt;
&lt;p align="justify"&gt;// register for the PreRequestHandlerExecute event:&lt;/p&gt;
&lt;p align="justify"&gt;application.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);&lt;/p&gt;
&lt;p align="justify"&gt;// TODO: add additional application event handlers here&lt;/p&gt;
&lt;p align="justify"&gt;}&lt;/p&gt;
&lt;p align="justify"&gt;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;/// Disposes of the resources (other than memory) used by the module.&lt;/p&gt;
&lt;p align="justify"&gt;/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;public void Dispose()&lt;/p&gt;
&lt;p align="justify"&gt;{&lt;/p&gt;
&lt;p align="justify"&gt;}&lt;/p&gt;
&lt;p align="justify"&gt;#endregion&lt;/p&gt;
&lt;p align="justify"&gt;#region Module Event Handlers&lt;/p&gt;
&lt;p align="justify"&gt;public void OnPreRequestHandlerExecute(Object source, EventArgs e)&lt;/p&gt;
&lt;p align="justify"&gt;{&lt;/p&gt;
&lt;p align="justify"&gt;HttpApplication app = (HttpApplication)source;&lt;/p&gt;
&lt;p align="justify"&gt;HttpContext context = app.Context;&lt;/p&gt;
&lt;p align="justify"&gt;// TODO: implement module functionality here&lt;/p&gt;
&lt;p align="justify"&gt;}&lt;/p&gt;
&lt;p align="justify"&gt;#endregion&lt;/p&gt;
&lt;p align="justify"&gt;}&lt;/p&gt;
&lt;p align="justify"&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;&lt;/span&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;En este fichero debemos hacer 3 modificaciones:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;1. Vaciamos todo el contenido de la funci&amp;oacute;n &amp;ldquo;Init&amp;rdquo;, y a&amp;ntilde;adimos la siguiente l&amp;iacute;nea que nos a&amp;ntilde;adir&amp;aacute; el evento manejador:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align="justify"&gt;&lt;i&gt;application.EndRequest += new EventHandler(application_EndRequest);&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align="justify"&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p align="justify"&gt;2. Eliminamos la siguiente funci&amp;oacute;n, que no necesitamos para nuestro m&amp;oacute;dulo:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align="justify"&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;public&lt;/i&gt;&lt;i&gt; void OnPreRequestHandlerExecute(Object source, EventArgs e)&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;{&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;HttpApplication app = (HttpApplication)source;&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;HttpContext context = app.Context;&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;// TODO: implement module functionality here&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align="justify"&gt;&lt;em&gt;&lt;/em&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;3. A&amp;ntilde;adimos la siguiente funci&amp;oacute;n. En la parte comentada que pone &amp;ldquo;A&amp;Ntilde;ADIMOS NUESTRO C&amp;Oacute;DIGO&amp;rdquo; es donde deberemos programar las acciones que realizar&amp;aacute; nuestro m&amp;oacute;dulo, por ejemplo, a&amp;ntilde;adir una l&amp;iacute;nea nueva a todas las peticiones HTML que le llegan al servidor, filtrar su contenido, borrado de comentarios&amp;hellip; Para este ejemplo, vamos a a&amp;ntilde;adir una nueva l&amp;iacute;nea de texto, que salga en todas las p&amp;aacute;ginas web que devuelva nuestro servidor a los usuarios. Para ello simplemente llamamos al objeto context y le indicamos que en la respuesta a&amp;ntilde;adiremos un bloque de texto:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align="justify"&gt;&lt;i&gt;void&lt;/i&gt;&lt;i&gt; application_EndRequest(object sender, EventArgs e)&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;{&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;HttpApplication application = (HttpApplication)sender;&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;HttpContext context = application.Context;&lt;/i&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;&lt;/i&gt;&lt;b&gt;//A&amp;Ntilde;ADIMOS NUESTRO C&amp;Oacute;DIGO&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;&lt;/i&gt;context.Response.Write(&amp;ldquo;P&amp;aacute;gina modificada por &lt;a href="http://www.windowstecnico.com/"&gt;www.windowstecnico.com&lt;/a&gt;&amp;rdquo;);&lt;/p&gt;
&lt;p align="justify"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align="justify"&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Una vez construido nuestro m&amp;oacute;dulo debemos hacer 2 cosas:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;1.) Tenemos que firmar nuestra librer&amp;iacute;a .dll que hemos generado, para ello hacemos doble clic en el explorador de soluciones en la etiqueta &amp;ldquo;properties&amp;rdquo; y nos vamos a la pesta&amp;ntilde;a &amp;ldquo;firma&amp;rdquo;, marcamos la casilla &amp;ldquo;firmar el ensamblado&amp;rdquo; y en seleccionar un archivo de clave de nombre seguro le damos a :&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_c6EYhkUKGik/SiwoEMoF_YI/AAAAAAAAB-0/grFmEqP1oYo/s1600-h/image%5B9%5D.png"&gt;&lt;img border="0" width="613" src="http://lh4.ggpht.com/_c6EYhkUKGik/SiwoFYgyyoI/AAAAAAAAB-4/23a8yWFVcRU/image_thumb%5B5%5D.png?imgmax=800" alt="image" height="439" style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Le asignamos un nombre, por ejemplo, key.snk y desmarcamos la casilla de proteger con contrase&amp;ntilde;a. Con esto ya tenemos nuestra .dll firmada:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_c6EYhkUKGik/SiwoGeY-JfI/AAAAAAAAB-8/RbHMKQKbDBM/s1600-h/image%5B13%5D.png"&gt;&lt;img border="0" width="490" src="http://lh6.ggpht.com/_c6EYhkUKGik/SiwoHtA_8oI/AAAAAAAAB_A/j-WD2vBvKX0/image_thumb%5B7%5D.png?imgmax=800" alt="image" height="339" style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;2.) Tenemos que a&amp;ntilde;adir un peque&amp;ntilde;o script, que nos enviar&amp;aacute; nuestra .dll firmada a la carpeta de ensamblados que se encuentra en la ruta C:\Windows\assembly, desde donde el IIS la recoger&amp;aacute; para poder agregarla finalmente c&amp;oacute;mo modulo. Para ello, sin salirnos de la ventana &amp;ldquo;properties&amp;rdquo; nos vamos a la pesta&amp;ntilde;a &amp;ldquo;Eventos de generaci&amp;oacute;n&amp;rdquo;, y en el cuadro &amp;ldquo;l&amp;iacute;nea de comandos del evento posterior a la generaci&amp;oacute;n&amp;rdquo; incluimos el siguiente script si est&amp;aacute;is usando Visual Studio 2005:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align="justify"&gt;CALL &amp;quot;%VS80COMNTOOLS%\vsvars32.bat&amp;quot; &amp;gt; NULL&lt;/p&gt;
&lt;p align="justify"&gt;gacutil.exe /if &amp;quot;$(TargetPath)&amp;quot;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align="justify"&gt;&amp;oacute; el siguiente si se est&amp;aacute; usando Visual Studio 2008:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align="justify"&gt;CALL &amp;quot;%VS90COMNTOOLS%\vsvars32.bat&amp;quot; &amp;gt; NULL&lt;/p&gt;
&lt;p align="justify"&gt;gacutil.exe /if &amp;quot;$(TargetPath)&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Quedando finalmente lo siguiente:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_c6EYhkUKGik/SiwoIgGb-TI/AAAAAAAAB_E/v7iKhfZaoWE/s1600-h/image%5B17%5D.png"&gt;&lt;img border="0" width="649" src="http://lh6.ggpht.com/_c6EYhkUKGik/SiwoKJeRcpI/AAAAAAAAB_I/qQ5dwYP2QCM/image_thumb%5B9%5D.png?imgmax=800" alt="image" height="337" style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;Configuraci&amp;oacute;n del IIS:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;1. Tras ejecutarse los scripts ya tendremos nuestra .dll firmada en la carpeta C:\Windows\assembly y lista para agregarla como modulo (en caso de tener la .dll aparte, bien porque la hemos generado desde otro PC o porque estamos probando una que no hemos generado nosotros, nos bastar&amp;aacute; con copiar la .dll a esta misma carpeta, seguramente tengamos que aumentar las permisos de esta carpeta antes). Tras esto nos vamos al Administrador de Internet Information Services y hacemos doble clic en el icono &amp;ldquo;m&amp;oacute;dulos&amp;rdquo;:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_c6EYhkUKGik/SiwoLOC8TgI/AAAAAAAAB_M/TGaDyEtXbTw/s1600-h/image%5B21%5D.png"&gt;&lt;img border="0" width="642" src="http://lh5.ggpht.com/_c6EYhkUKGik/SiwoMWhDh9I/AAAAAAAAB_Q/-kSjvcvRSPk/image_thumb%5B11%5D.png?imgmax=800" alt="image" height="423" style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Vamos a la opci&amp;oacute;n &amp;ldquo;agregar modulo administrado&amp;rdquo;:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_c6EYhkUKGik/SiwoN39qOOI/AAAAAAAAB_U/earEkxRehuQ/s1600-h/image%5B25%5D.png"&gt;&lt;img border="0" width="658" src="http://lh6.ggpht.com/_c6EYhkUKGik/SiwoQ5tS31I/AAAAAAAAB_Y/ZDOmRvm-zn0/image_thumb%5B13%5D.png?imgmax=800" alt="image" height="526" style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;En tipo, en el desplegable, seleccionamos nuestro m&amp;oacute;dulo, y le damos un nombre cualquiera:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_c6EYhkUKGik/SiwoSA7cpeI/AAAAAAAAB_c/uDO3d1OBtB8/s1600-h/image%5B29%5D.png"&gt;&lt;img border="0" width="454" src="http://lh5.ggpht.com/_c6EYhkUKGik/SiwoTbTfT4I/AAAAAAAAB_g/SlAiCXbfOsE/image_thumb%5B15%5D.png?imgmax=800" alt="image" height="327" style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Una vez hecho esto, si abrimos un sitio web alojado en el IIS, deber&amp;iacute;a estar funcionando nuestro m&amp;oacute;dulo y mostrarnos en las p&amp;aacute;ginas web la l&amp;iacute;nea de texto que le indicamos:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_4FA89E76.png"&gt;&lt;img border="0" width="474" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_1142DAC3.png" alt="image" height="282" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Espero que os haya gustado el post y que os anim&amp;eacute;is a programar vuestros propios m&amp;oacute;dulos, y recordad que lo mas importante es tener una buena idea y pensar que todo es programable, solo hacen falta las fuentes de informaci&amp;oacute;n adecuadas :), el pr&amp;oacute;ximo d&amp;iacute;a os hablar&amp;eacute; sobre la programaci&amp;oacute;n de m&amp;oacute;dulos con interfaz gr&amp;aacute;fica.&lt;/p&gt;
&lt;p&gt;saludos!!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=1158" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Windows+7/default.aspx">Windows 7</category><category domain="http://www.windowstecnico.com/archive/tags/Windows+Vista/default.aspx">Windows Vista</category><category domain="http://www.windowstecnico.com/archive/tags/Windows+Server+2008/default.aspx">Windows Server 2008</category><category domain="http://www.windowstecnico.com/archive/tags/Internet/default.aspx">Internet</category><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/IIS/default.aspx">IIS</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Creación e instalación de módulos para Internet Information Services 7 (parte I)</title><link>http://www.windowstecnico.com/archive/2009/10/27/creaci-243-n-e-instalaci-243-n-de-m-243-dulos-para-internet-information-services-7-parte-i.aspx</link><pubDate>Tue, 27 Oct 2009 08:07:28 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:1016</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=1016</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/10/27/creaci-243-n-e-instalaci-243-n-de-m-243-dulos-para-internet-information-services-7-parte-i.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://seekdotnethosting.files.wordpress.com/2009/03/iis7.jpg"&gt;&lt;img title="clip_image001" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="476" alt="clip_image001" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image001_5F00_446DA684.jpg" width="498" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En el post de hoy vamos a comenzar una cadena de posts sobre IIS7, en concreto me gustaría hablaros sobre donde se prolongan sus límites mediante programación.&lt;/p&gt;  &lt;p align="justify"&gt;Este será el primero de tres post, en los que comentaré desde el principio hasta el final como implementar un nuevo módulo para IIS7 desde 0, que haga lo que vosotros queráis, desde captar una simple petición web que haga algún usuario al servidor, y modificarla a vuestro antojo, a sustituírsela por otro documento, añadirle scripts, lo que vosotros queráis, la imaginación pondrá el límite en esta tarea.&lt;/p&gt;  &lt;p align="justify"&gt;En este, que será el primer post, os voy a introducir en la materia y daros un poco de información sobre el tema empezando por el principio de los tiempos.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;¿Que es &lt;/b&gt;&lt;a href="http://www.iis.net/"&gt;&lt;b&gt;IIS7&lt;/b&gt;&lt;/a&gt;&lt;b&gt;?&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;IIS7 es el servidor que llevan incorporadas las últimas versiones de los sistemas operativos Windows, en concreto IIS 7.0 en las versiones de Windows Vista y Microsoft Server 2008 e IIS 7.5 en su nueva versión para Windows 7 y Microsoft Server 2008 R2. Para los expertos en el tema sabréis que IIS7 se ha visto mejorado con respecto a IIS6 en numerosos aspectos, entre los que destaca la seguridad y sobre todo su aspecto y simplicidad, y es en este último en el que Microsoft puede estar bien orgullosa, porque navegar por el menú gráfico del IIS7 es un verdadero placer:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image003_5F00_1A23900B.jpg"&gt;&lt;img title="clip_image003" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="508" alt="clip_image003" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image003_5F00_thumb_5F00_1E306E8E.jpg" width="428" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;IIS7 también destaca por su sencillez de configuración, en gran parte conseguido por su interface. &lt;/p&gt;  &lt;p align="justify"&gt;Además, IIS7 ha sido diseñado pensando en los desarrolladores, facilitándoles Starters Kits para la implementación de extensiones para añadirles más características. Para estos últimos también posee un sistema de diagnóstico en tiempo de ejecución, muy útil a la hora de depurar, que ofrece información sobre que peticiones están ejecutándose actualmente, cuánto tiempo llevan ejecutándose, que URLs están siendo invocadas, que cliente las invoca, y cuál es su estado actual. Un verdadero gustazo.&lt;/p&gt;  &lt;p align="justify"&gt;Ahora que ya sabéis un poco más sobre IIS7, a instalarlo!, tenéis un sencillo manual sobre su instalación en el siguiente link:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://learn.iis.net/page.aspx/28/installing-iis-70-on-windows-vista/"&gt;http://learn.iis.net/page.aspx/28/installing-iis-70-on-windows-vista/&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;¿En qué lenguaje programaremos los módulos para IIS7?&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Una vez instalado IIS7, y nos hayamos familiarizado con el entorno, comenzaremos a programar nuestro primer módulo. Los módulos para IIS7 los programaremos en C#, en .NET por supuesto :), así que ir preparando el Visual Studio (2005 o 2008), que el próximo día daremos caña al compilador.&lt;/p&gt;  &lt;p align="justify"&gt;En el próximo post, os comentaré como programar vuestro primer módulo, en él, os enseñaré a crear una extensión para el servidor que capture todas las peticiones web que realicen los usuarios al servidor y a modificarles las páginas solicitadas, añadiéndoles una línea de texto al final de la página antes de devolvérsela al usuario. Un ejemplo muy sencillo, pero con el que veréis claramente, que se puede hacer casi cualquier cosa en el servidor desde un simple módulo del IIS.&lt;/p&gt;  &lt;p align="justify"&gt;Saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=1016" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Windows+7/default.aspx">Windows 7</category><category domain="http://www.windowstecnico.com/archive/tags/Windows+Vista/default.aspx">Windows Vista</category><category domain="http://www.windowstecnico.com/archive/tags/Windows+Server+2008/default.aspx">Windows Server 2008</category><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/IIS/default.aspx">IIS</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Diseña tus propios videojuegos para Windows, Zune y XBOX 360 con Microsoft XNA (Parte VI)</title><link>http://www.windowstecnico.com/archive/2009/09/28/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-vi.aspx</link><pubDate>Mon, 28 Sep 2009 13:04:26 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:882</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=882</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/09/28/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-vi.aspx#comments</comments><description>&lt;p align="justify"&gt;Buenas a todos, la pasada semana finalizamos la cadena de posts sobre programación de videojuegos en XNA explicando como se producían las colisiones entre los diferentes objetos del juego. Hoy vamos a pasar a resumir todos los contenidos que hemos visto, os enseñaré a poner música de fondo en los juegos para darles un toque mas profesional y finalmente os voy a enseñar algunos ejemplos de videojuegos, algunos programados por mi, para daros ideas de videojuegos que podéis programar.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;&lt;u&gt;Añadir una cancion como fondo de un videojuego&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Una de las mejores opciones que nos proporciona XNA es la de poder añadir una canción en formato mp3 para que suene mientras se reproduce el juego, para ello en primer lugar elegiremos la canción que nos interese, y la almacenaremos en la carpeta “Content” del videojuego, al igual que las imágenes que hemos utilizado en anteriores post. Una vez agregada la cargaremos en el juego de la misma manera que cargamos una imagen, primero nos crearemos una variable tipo song:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;song musica;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Y después iremos a la función LoadContent() y la agregaremos de la siguiente manera, siendo canción nuestra cancion.mp3 (recordar que siempre ponemos el nombre sin la extensión):&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;musica = Content.Load&amp;lt;Song&amp;gt;(“cancion”);&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Para reproducir la canción nos bastara con poner inmediatamente después de la linea anterior, lo siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;MediaPlayer.Play(musica);&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Como veis es muy sencillo.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;&lt;u&gt;¿Qué hemos visto sobre programación de videojuegos en 2D?&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En primer lugar hablamos sobre XNA, que era, para que servía, que podíamos hacer con el, que necesitábamos para instalarnoslo y vimos algunos ejemplos, entre ellos un videojuego de sonic que programé para enseñaroslo:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.windowstecnico.com/archive/2009/08/31/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-i.aspx"&gt;http://www.windowstecnico.com/archive/2009/08/31/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-i.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:15ce536e-0be3-48ee-87d9-d0fe5e0578eb" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ychQYuSF3r8&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ychQYuSF3r8&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;En segundo lugar estudiamos como crear un proyecto en XNA, vimos para que servían cada una de las funciones que nos proporcionaba la plataforma y cargamos el videojuego que trae XNA de ejemplo para probarlo:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.windowstecnico.com/archive/2009/09/07/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-ii.aspx"&gt;http://www.windowstecnico.com/archive/2009/09/07/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-ii.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;En tercer lugar, os enseñé a cargar un objeto y un fondo en el proyecto de nuestro videojuego, y aprendimos a mover un objeto por la pantalla, capturando las teclas de nuestro teclado:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.windowstecnico.com/archive/2009/09/14/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-iii.aspx"&gt;http://www.windowstecnico.com/archive/2009/09/14/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-iii.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:9579e065-2c07-4082-94fe-68e3c46d8d1f" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/O3be7RNuNao&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/O3be7RNuNao&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;En cuarto lugar estudiamos como simular los pasos que daría un muñeco cuando va andando:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.windowstecnico.com/archive/2009/09/17/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-iv.aspx"&gt;http://www.windowstecnico.com/archive/2009/09/17/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-iv.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:a8b1ac6b-4ce3-45f6-8f62-d1070e302239" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/I3QgQeqPzM0&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/I3QgQeqPzM0&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;En quinto lugar aprendimos a generar colisiones entre los diferentes objetos del videojuego:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.windowstecnico.com/archive/2009/09/22/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-v.aspx"&gt;http://www.windowstecnico.com/archive/2009/09/22/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-v.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:872df8d0-c621-46f4-8bfd-cc86a79c35ee" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/G9XvNOD0AA0&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/G9XvNOD0AA0&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Hoy finalmente hemos aprendido a añadir música de fondo al videojuego.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Con todo esto, tenéis los conocimientos necesarios para programar casi cualquier videojuego en 2D, simplemente os queda practicar mucho, y si queréis dar mas realismo a vuestros videojuegos acompañar estas prácticas con el estudio de algunas funciones matemáticas y físicas que os permitan el conseguir movimientos de lanzamientos, impactos y golpes mas realistas entres los diferentes objetos del juego, cosas que se escapan del contenido de este manual con el que simplemente os quería introducir en la programación de videojuegos y que espero os haya sido muy útil y os sirva de plinto para seguir aprendiendo mucho mas sobre esta tecnología.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Os dejo también algunos videos de videojuegos en 2D que han sido programados en XNA:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:84f5b40c-10fc-4b01-8135-a272bf3b86e2" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/XliQy1wH0GI&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/XliQy1wH0GI&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:32fc59f3-7870-4326-82da-63d3bcf5ff0a" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WUXUfodBlQo&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/WUXUfodBlQo&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:ca88d409-5a31-4e53-a127-35e91d4d6332" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6hv0Av6WBnc&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/6hv0Av6WBnc&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:e1a86fa5-62da-4ced-af8b-cf8ad1ebc100" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_FmV01TQq_A&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/_FmV01TQq_A&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Para finalizar os voy a mostrar el último videojuego que programé, para mostrarle una idea a uno de los lectores de nuestro blog sobre como programar un tetris. Está programado con una única pieza (la L), y sin rotaciones, para ahorrar tiempo, pero podéis ver la potencia de la plataforma que en poco mas de media hora y con las dos siguientes imágenes como base me permitieron programar el siguiente juego:&lt;/p&gt;  &lt;p align="center"&gt;&amp;#160;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_5D69A89F.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="454" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_35ECF92C.png" width="282" border="0" /&gt;&lt;/a&gt; &lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_6AB4916D.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="48" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_437A4838.png" width="48" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:64d23698-d146-44ef-bc28-4a784cc55e48" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ZuoCPlBfLNc&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ZuoCPlBfLNc&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=882" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/Xna/default.aspx">Xna</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Diseña tus propios videojuegos para Windows, Zune y XBOX 360 con Microsoft XNA (Parte V)</title><link>http://www.windowstecnico.com/archive/2009/09/22/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-v.aspx</link><pubDate>Tue, 22 Sep 2009 14:32:46 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:866</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=866</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/09/22/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-v.aspx#comments</comments><description>&lt;p align="justify"&gt;Buenas a todos, estamos en semana de SIMO!, supongo que muchos de vosotros estaréis disfrutando ahora mismo de él, mientras que otros estaréis esperando post y comentarios en blogs de informática que leer para enteraros de todo lo que pasa en el pabellón 7 del IFEMA, pero mientras tanto, como durante todo el mes de Septiembre, os traigo el V y último post del manual sobre programación en 2D. Voy a extender el manual un post más, que publicaré en unos días, para mostraros algunos videos de videojuegos en 2D que he programado y enseñaros a programar otro juego en 2D, pero diferente, para que veáis otras posibilidades de juegos en 2D, hay cientos de ellas. Mientras tanto hoy vamos a continuar por donde lo dejamos el último día, y vamos a aprender a generar colisiones entre dos objetos.&lt;/p&gt;  &lt;p align="justify"&gt;Seguiremos aprovechando el videojuego Alien, y vamos a añadirle una piedra en el suelo a nuestro juego, para que cuando nuestro muñeco choque con ella no pueda avanzar, y no le quede más remedio que superarla de un salto.&lt;/p&gt;  &lt;p align="justify"&gt;Para comenzar debemos conseguir una imagen de una piedra, la almacenaremos en la carpeta Content y la cargaremos en el juego como ya sabemos. Ahora debemos repasar como crear un objeto en el juego, para ello volveremos a la parte III del manual, y crearemos un nuevo vector, una nueva textura, a la que le asignaremos la imagen que antes cargamos, y en la función Draw() la dibujaremos en pantalla, de tal manera que tengamos al arrancar el videojuego una imagen como la siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image002_5F00_163AE20B.jpg"&gt;&lt;img title="clip_image002" style="border-top-width:0px;display:block;border-left-width:0px;float:none;border-bottom-width:0px;margin-left:auto;margin-right:auto;border-right-width:0px;" height="404" alt="clip_image002" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image002_5F00_thumb_5F00_504ED04C.jpg" width="535" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Bien, una vez que tengamos generada nuestra piedra, debemos realizar la colisión. Para ello vamos a rodear a nuestro alienígena y a nuestra piedra de una “esfera imaginaria” que simule el cuerpo del alienígena y la superficie de la piedra, ya que recordemos, que nuestros objetos en el videojuego ocuparán un único pixel (un vector2D). Una vez que hayamos generado las esferas hay una función en XNA que nos dirá si han chocado entre sí o no.&lt;/p&gt;  &lt;p align="justify"&gt;En primer lugar debemos crear 2 vectores que simularan el centro del cuerpo del alienígena y el centro de la superficie de la piedra: &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;Vector2 centro_piedra;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;Vector2 centro_alien;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Después crearemos las 2 esferas que rodearán al alienígena y a la piedra:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;BoundingSphere esfera_alien;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;BoundingSphere esfera_piedra;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora vamos a crearnos una función auxiliar que comprobará si los 2 objetos, el alienígena y la piedra han colisionado:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;public bool colision()&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;centro_piedra = new Vector2(textura_piedra.Width / 2, textura_piedra.Height / 2);&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;centro_piedra += piedra;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;esfera_piedra = new BoundingSphere(new Vector3(centro_piedra, 0), textura_piedra.Width / 2);&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;centro_alien = new Vector2(textura_alien_der_parado.Width / 2, textura_alien_der_parado.Height / 2);&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;centro_alien += alien;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;esfera_alien = new BoundingSphere(new Vector3(centro_alien, 0), textura_alien_der_parado.Width / 2);&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;if(esfera_alien.Intersects(esfera_piedra))&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;return true;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;return false;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Si estudiamos el código detenidamente, en primer lugar veremos que debemos calcular el centro de la piedra, que evidentemente se sitúa en la mitad del ancho y del alto del dibujo de la piedra que le hemos asignado a la textura. &lt;/p&gt;  &lt;p align="justify"&gt;Inmediatamente después, le sumamos el vector piedra a la variable centro_piedra, ya que el dibujo de la piedra no se encuentra en el punto “0,0” del eje de las X y de las Y, sino que se encuentra en el punto donde estaba la piedra originalmente.&lt;/p&gt;  &lt;p align="justify"&gt;Finalmente generamos la esfera, a la que le tenemos que pasar como primer parámetro un Vector3(x,y,z), en el que la X y la Y serán nuestro centro de la piedra, y Z será 0, ya que es un juego en 2D y no tiene profundidad, y como segundo parámetro le pasaremos el radio de la esfera, es decir, la mitad del ancho de la piedra.&lt;/p&gt;  &lt;p align="justify"&gt;Las siguiente tres líneas de código son semejantes pero para el alienígena.&lt;/p&gt;  &lt;p align="justify"&gt;Nota: además de la esfera, podéis rodear a los objetos del juego también por cuadrados, siempre debéis usar la forma geométrica que mejor se adapte al objeto que estáis dibujando.&lt;/p&gt;  &lt;p align="justify"&gt;Tras las creaciones de las esferas veréis un IF, en el que comprobamos si una esfera intercepta con la otra, y devolvemos true o false, dependiendo de si ha habido colisión o no.&lt;/p&gt;  &lt;p align="justify"&gt;¿Hasta ahora bastante sencillo no?, ya solo nos queda utilizar nuestra función colision() en la función Update() de la siguiente manera, debemos cambiar el contenido del bucle “foreach” por el siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;if (ekey == Keys.Left)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;if (!colision)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;alien.X -= 5;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;alien.X += 5;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;direccion_movimiento = izq;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;num_movimiento += 1;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;if (num_movimiento == 3) num_movimiento = 0;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;if (ekey == Keys.Right)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;if (!colision)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;alien.X += 5;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;alien.X -= 5;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;direccion_movimiento = der;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;num_movimiento += 1;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;if (num_movimiento == 3) num_movimiento = 0;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Si os fijáis, el único cambio ha sido añadir una línea de código en cada IF, de tal manera que si se produce una colisión el alienígena retroceda 5pixels, pero os pongo el código entero del bucle para que lo veáis más claro.&lt;/p&gt;  &lt;p align="justify"&gt;Si compiláis y ejecutáis debería producirse la colisión perfectamente. Ahora si os creáis una función sencilla que os permita saltar hasta cierta altura, capturando en vez de las teclas izquierda y derecha, la tecla arriba y haciendo que cuando el muñeco llegue a determinada altura baje hasta el suelo, tendréis un videojuego parecido al del siguiente vídeo:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:4c8ae25d-926e-4d8d-88b6-572f8223ff21" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/G9XvNOD0AA0&amp;amp;hl=es&amp;amp;fs=1&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/G9XvNOD0AA0&amp;amp;hl=es&amp;amp;fs=1&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Con todo lo que llevamos aprendido a lo largo de estos 5 posts a modo de manual deberíais estar preparados para programar casi cualquier videojuego en 2D, ahora solo os queda practicar y sobretodo imaginación, ya que la clave de un buen juego es la novedad y el ingenio. En el próximo post, como comenté más arriba, os traeré ejemplos de videojuegos en 2D, algunos programados por mí, y programaremos otro tipo de videojuego en 2D, pero como ya tenemos las bases no nos entretendremos en aspectos técnicos e iremos directamente a ver los resultados para daros mas ideas sobre videojuegos para programar.&lt;/p&gt;  &lt;p align="justify"&gt;Saludos! Y practicar mucho!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=866" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/Xna/default.aspx">Xna</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Diseña tus propios videojuegos para Windows, Zune y XBOX 360 con Microsoft XNA (Parte IV)</title><link>http://www.windowstecnico.com/archive/2009/09/17/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-iv.aspx</link><pubDate>Thu, 17 Sep 2009 08:16:01 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:850</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=850</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/09/17/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-iv.aspx#comments</comments><description>&lt;p align="justify"&gt;Buenas a todos, tras tres post explicando la programación de videojuegos con XNA ya debéis tener una idea más o menos clara del contenido necesario para programar videojuegos en 2D. Hoy vamos a complementarla con un pequeño truco en el que enseñaremos a simular el movimiento que realizaría nuestro alienígena andando. Para ello, tenemos que conseguir sprites del alienígena en diferentes posturas en las que salga andando. En mi caso, como os comenté el otro día, el muñeco lo he dibujado con el 3D Studio y me limité a tomar capturas del mismo, pues bien, hoy he colocado el personaje en diferentes posturas y he tomado las siguientes capturas mirando hacia ambos lados:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_744CC892.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="183" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_0C0690AA.png" width="71" border="0" /&gt;&lt;/a&gt; &lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_5DB22C5E.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="183" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_1E0CF12E.png" width="71" border="0" /&gt;&lt;/a&gt; &lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_677E8442.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="183" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_101CF04A.png" width="71" border="0" /&gt;&lt;/a&gt; &lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_3A311F9C.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="183" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_331473D5.png" width="71" border="0" /&gt;&lt;/a&gt; &lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_566689DC.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="183" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_2C1C7363.png" width="71" border="0" /&gt;&lt;/a&gt; &lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_436C9936.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="183" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_58EEF9F3.png" width="71" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Cómo es evidente, el mayor realismo a la hora de andar lo conseguiremos con sprites en posturas realistas, los mías no son los mejores, pero para enseñaros el ejemplo nos valdrán.&lt;/p&gt;  &lt;p align="justify"&gt;En primer lugar, cargaremos los sprites en la carpeta “Content” y los agregaremos al proyecto, como aprendimos en el pasado post.&lt;/p&gt;  &lt;p align="justify"&gt;Después deberemos agregar una variable textura nueva por cada nuevo sprite que vayamos a añadir, en mi caso, las seis variables siguientes:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Texture2D textura_alien_der_parado;&lt;/p&gt;  &lt;p align="justify"&gt;Texture2D textura_alien_der_andando;&lt;/p&gt;  &lt;p align="justify"&gt;Texture2D textura_alien_der_andando2;&lt;/p&gt;  &lt;p align="justify"&gt;Texture2D textura_alien_izq_parado;&lt;/p&gt;  &lt;p align="justify"&gt;Texture2D textura_alien_izq_andando;&lt;/p&gt;  &lt;p align="justify"&gt;Texture2D textura_alien_izq_andando2;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Y en la función Loadcontent() enlazaremos a las variables sus respectivas imágenes:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;textura_alien_der_parado = Content.Load&amp;lt;Texture2D&amp;gt;(&amp;quot;alien-der-parado&amp;quot;);&lt;/p&gt;  &lt;p align="justify"&gt;textura_alien_der_andando = Content.Load&amp;lt;Texture2D&amp;gt;(&amp;quot;alien-der-andando&amp;quot;);&lt;/p&gt;  &lt;p align="justify"&gt;textura_alien_der_andando2 = Content.Load&amp;lt;Texture2D&amp;gt;(&amp;quot;alien-der-andando2&amp;quot;);&lt;/p&gt;  &lt;p align="justify"&gt;textura_alien_izq_parado = Content.Load&amp;lt;Texture2D&amp;gt;(&amp;quot;alien-izq-parado&amp;quot;);&lt;/p&gt;  &lt;p align="justify"&gt;textura_alien_izq_andando = Content.Load&amp;lt;Texture2D&amp;gt;(&amp;quot;alien-izq-andando&amp;quot;);&lt;/p&gt;  &lt;p align="justify"&gt;textura_alien_izq_andando2 = Content.Load&amp;lt;Texture2D&amp;gt;(&amp;quot;alien-izq-andando2&amp;quot;);&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Bien, una vez cargados los sprites, nos queda la tarea de simular el movimiento, para ello mostraremos los sprites en cadena, enlazándolos a las pulsaciones de las teclas, es decir, en principio el alienígena comienza parado, si pulsamos una vez la tecla derecha, avanza 5pixels a la derecha y mostramos el sprite del alienígena levantando un poco una pierna, si volvemos a pulsar la tecla derecha avanzaremos otros 5pixels y mostraremos el sprite del alienígena levantando mas la pierna. Para ello hay infinitas maneras, yo os voy a proponer la siguiente que es bastante sencilla:&lt;/p&gt;  &lt;p align="justify"&gt;En primer lugar crearemos las siguientes variables, que nos permitirán almacenar la dirección del movimiento del teclado, y el número de sprite a mostrar (parado, andando1 o andando2):&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;const int izq = 1;&lt;/p&gt;  &lt;p align="justify"&gt;const int der = 2;&lt;/p&gt;  &lt;p align="justify"&gt;int direccion_movimiento=2, num_movimiento=0;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Después modificaremos el contenido de la función Update() por el siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;estadoteclado = Keyboard.GetState();&lt;/p&gt;  &lt;p align="justify"&gt;Keys[] teclaspulsada = estadoteclado.GetPressedKeys();&lt;/p&gt;  &lt;p align="justify"&gt;foreach (Keys ekey in teclaspulsada)&lt;/p&gt;  &lt;p align="justify"&gt;{&lt;/p&gt;  &lt;p align="justify"&gt;if (ekey == Keys.Left)&lt;/p&gt;  &lt;p align="justify"&gt;{&lt;/p&gt;  &lt;p align="justify"&gt;alien.X -= 5;&lt;/p&gt;  &lt;p align="justify"&gt;direccion_movimiento = izq;&lt;/p&gt;  &lt;p align="justify"&gt;num_movimiento += 1;&lt;/p&gt;  &lt;p align="justify"&gt;if (num_movimiento == 3) num_movimiento = 0;&lt;/p&gt;  &lt;p align="justify"&gt;}&lt;/p&gt;  &lt;p align="justify"&gt;if (ekey == Keys.Right)&lt;/p&gt;  &lt;p align="justify"&gt;{&lt;/p&gt;  &lt;p align="justify"&gt;alien.X += 5;&lt;/p&gt;  &lt;p align="justify"&gt;direccion_movimiento = der;&lt;/p&gt;  &lt;p align="justify"&gt;num_movimiento += 1;&lt;/p&gt;  &lt;p align="justify"&gt;if (num_movimiento == 3) num_movimiento = 0;&lt;/p&gt;  &lt;p align="justify"&gt;}&lt;/p&gt;  &lt;p align="justify"&gt;}&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Como veis, el único cambio que hemos realizado es que cuando identificamos que se ha pulsado la tecla del cursor derecho o izquierdo almacenamos el movimiento, y aumentamos la variable num_movimiento, que definirá el nº del sprite a mostrar.&lt;/p&gt;  &lt;p align="justify"&gt;Finalmente modificaremos la línea de código de la función Draw() que pintaba al alienígena en la pantalla por el siguiente código, en el que dependiendo de la dirección del movimiento y del número de movimiento pintará un sprite u otro:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;switch (direccion_movimiento)&lt;/p&gt;  &lt;p align="justify"&gt;{&lt;/p&gt;  &lt;p align="justify"&gt;case izq:&lt;/p&gt;  &lt;p align="justify"&gt;switch (num_movimiento)&lt;/p&gt;  &lt;p align="justify"&gt;{&lt;/p&gt;  &lt;p align="justify"&gt;case 0:&lt;/p&gt;  &lt;p align="justify"&gt;spriteBatch.Draw(textura_alien_izq_parado, alien, Color.White);&lt;/p&gt;  &lt;p align="justify"&gt;break;&lt;/p&gt;  &lt;p align="justify"&gt;case 1:&lt;/p&gt;  &lt;p align="justify"&gt;spriteBatch.Draw(textura_alien_izq_andando, alien, Color.White);&lt;/p&gt;  &lt;p align="justify"&gt;break;&lt;/p&gt;  &lt;p align="justify"&gt;case 2:&lt;/p&gt;  &lt;p align="justify"&gt;spriteBatch.Draw(textura_alien_izq_andando2, alien, Color.White);&lt;/p&gt;  &lt;p align="justify"&gt;break;&lt;/p&gt;  &lt;p align="justify"&gt;}&lt;/p&gt;  &lt;p align="justify"&gt;break;&lt;/p&gt;  &lt;p align="justify"&gt;case der:&lt;/p&gt;  &lt;p align="justify"&gt;switch (num_movimiento)&lt;/p&gt;  &lt;p align="justify"&gt;{&lt;/p&gt;  &lt;p align="justify"&gt;case 0:&lt;/p&gt;  &lt;p align="justify"&gt;spriteBatch.Draw(textura_alien_der_parado, alien, Color.White);&lt;/p&gt;  &lt;p align="justify"&gt;break;&lt;/p&gt;  &lt;p align="justify"&gt;case 1:&lt;/p&gt;  &lt;p align="justify"&gt;spriteBatch.Draw(textura_alien_der_andando, alien, Color.White);&lt;/p&gt;  &lt;p align="justify"&gt;break;&lt;/p&gt;  &lt;p align="justify"&gt;case 2:&lt;/p&gt;  &lt;p align="justify"&gt;spriteBatch.Draw(textura_alien_der_andando2, alien, Color.White);&lt;/p&gt;  &lt;p align="justify"&gt;break;&lt;/p&gt;  &lt;p align="justify"&gt;}&lt;/p&gt;  &lt;p align="justify"&gt;break;&lt;/p&gt;  &lt;p align="justify"&gt;}&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Si compilamos y ejecutamos deberíamos ver un movimiento como el siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:8d123ffd-3b35-4dde-a5aa-9325c57e61ce" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/I3QgQeqPzM0&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/I3QgQeqPzM0&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;En mi caso no ha quedado perfecto ya que los sprites no eran los mejores, para que salga el efecto más realista os recomiendo bajaros los sprites hechos de internet, como hice con el juego que os mostré en el primer post y que programé para rememorar un antiguo Sonic.&lt;/p&gt;  &lt;p align="justify"&gt;El próximo día avanzaremos un poco con las clases de XNA y estudiaremos como reproducir colisiones entre dos objetos del juego, en el ejemplo del videojuego alien, vamos a hacer que se encuentre con una piedra que le frene el paso, y tenga que saltarla para seguir adelante.&lt;/p&gt;  &lt;p align="justify"&gt;Así que hasta el próximo post os dejo tiempo para que practiquéis y probéis varios sprites hasta que os queden movimientos más realistas, lo más importante es la imaginación!&lt;/p&gt;  &lt;p align="justify"&gt;Saludos!!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=850" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/Xna/default.aspx">Xna</category><category domain="http://www.windowstecnico.com/archive/tags/Videojuegos/default.aspx">Videojuegos</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Diseña tus propios videojuegos para Windows, Zune y XBOX 360 con Microsoft XNA (Parte III)</title><link>http://www.windowstecnico.com/archive/2009/09/14/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-iii.aspx</link><pubDate>Sun, 13 Sep 2009 22:15:39 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:845</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=845</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/09/14/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-iii.aspx#comments</comments><description>&lt;p align="justify"&gt;Buenas a todos, hoy vamos a proseguir con el manual de programación de videojuegos en XNA continuando como comentamos el último día por la programación de nuestro primer videojuego en 2D.&lt;/p&gt;  &lt;p align="justify"&gt;En el pasado post comentamos como instalar Visual Studio y las librerías de XNA, creamos el proyecto de nuestro primer videojuego y finalmente hablamos de las funciones principales que llevan los videojuegos en XNA y el acometido de cada una de ellas. Pues bien, hoy vamos a proceder a “rellenar” estas funciones para generar nuestro primer juego, será uno muy sencillo, en el que un muñeco se mueva hacia los lados por un escenario sin obstáculos, pero para empezar esta semana, no está mal, y servirá para que aprendáis los elementos necesarios para que un juego se ejecute.&lt;/p&gt;  &lt;p align="justify"&gt;En primer lugar debéis conseguir el sprite de un muñeco y un fondo para el videojuego, un sprite es una imagen de un muñeco u objeto del videojuego en una postura determinada, en mi caso como tenía algo de tiempo libre he creado un alienígena en 3D Studio y he hecho una captura del mismo que he pasado a imagen en formato PNG, para que conserve más calidad, pero en principio el Visual Studio aceptará las imágenes de vuestros sprites en cualquier formato.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;ALIENIGENA:&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_212C2849.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="131" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_2368B105.png" width="131" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;FONDO:&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image004_5F00_53928C79.jpg"&gt;&lt;img title="clip_image004" style="border-top-width:0px;display:block;border-left-width:0px;float:none;border-bottom-width:0px;margin-left:auto;margin-right:auto;border-right-width:0px;" height="450" alt="clip_image004" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image004_5F00_thumb_5F00_28DC430B.jpg" width="593" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Una vez tengáis vuestros sprites, nos iremos a la carpeta raíz de nuestro proyecto, y en la subcarpeta “Content” los copiaremos, ya que es en esta carpeta donde los buscará el Visual Studio por defecto.&lt;/p&gt;  &lt;p align="justify"&gt;Ahora abriremos el proyecto de Visual Studio que creamos el último día e iremos a la carpeta “content”, pulsaremos el botón derecho del ratón sobre ella y en el desplegable que se nos abrirá seleccionamos “agregar un elemento existente”, entonces se nos abrirá la carpeta content en la que veremos nuestros sprites, los seleccionamos y aceptamos, y ya tendremos nuestras imágenes agregadas al proyecto.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image005_5F00_12AB491B.jpg"&gt;&lt;img title="clip_image005" style="border-top-width:0px;display:block;border-left-width:0px;float:none;border-bottom-width:0px;margin-left:auto;margin-right:auto;border-right-width:0px;" height="442" alt="clip_image005" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image005_5F00_thumb_5F00_1411FC9E.jpg" width="315" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Tras esta sencilla tarea vamos a explicar cómo se integra un sprite en el videojuego. Imaginemos por un momento que nuestro videojuego corresponde con una ventana de 640x480 pixels, 640px de ancho, por 480px de alto, un muñeco en el videojuego representará un único pixel en el videojuego de estos 640x480, llamado Vector2D, a lo que os preguntareis: pero… ¿si nuestra imagen ocupa más de 1pixel?, bien, para eso hay una función programada en XNA que diciéndole el pixel donde está el muñeco en la pantalla y el ancho y alto de nuestro Sprite, nos lo rodea de una forma geométrica (esfera, cuadrado,…) para cuando ese sprite tenga que colisionar con otro objeto se “choquen” y podamos detectarlo.&lt;/p&gt;  &lt;p align="justify"&gt;Por tanto en un videojuego en 2D tenemos que tener claro el concepto de que un sprite, será un Vector2D que ocupará un único pixel en la pantalla. Aclarada esta idea, comencemos a picar código.&lt;/p&gt;  &lt;p align="justify"&gt;En primer lugar deberemos declarar las variables necesarias, en nuestro sencillo videojuego solo necesitaremos cuatro, la primera variable representará la textura del muñeco, es decir, la imagen que “enlazaremos” al vector ó pixel que representa al muñeco en pantalla. La segunda de ellas representará la textura del fondo del videojuego. La tercera variable nos servirá para almacenar las teclas que un usuario a tecleado y así comprobar la tecla que ha pulsado para reproducir sus pulsaciones en movimientos del muñeco en el videojuego. La cuarta variable representará el pixel del muñeco que comentamos antes.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;b&gt;//Declaracion de variables&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Texture2D textura_alien;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Texture2D textura_fondo;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;KeyboardState estadoteclado;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Vector2 alien;&lt;/b&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Declaradas las variables vamos a comenzar a rellenar las funciones que hablamos el último día. Comenzaremos por la función Initialize() dónde deberemos sustituir la línea comentada:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;// TODO: Add your initialization logic here&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Por las siguientes cuatro líneas de código, que simplemente definirán el ancho y alto de la pantalla del videojuego, y crearemos el Vector2 (el famoso pixel, que antes definimos), el cual situaremos por ejemplo en la posición X=100px Y=380px de la pantalla:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;b&gt;graphics.PreferredBackBufferHeight = 480;&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;graphics.PreferredBackBufferWidth = 640;&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;graphics.ApplyChanges();&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;alien = new Vector2(100, 380);&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;El siguiente paso será asociar las fotos que almacenamos en la carpeta “Content” con las variables texture2D que antes declaramos, para ello le indicamos el nombre de la imagen, pero sin la extensión, el Visual Studio la encontrá igualmente, no os preocupéis, en mi caso tenía las imágenes: alien_der_andando.png y fondo.jpg.&lt;/p&gt;  &lt;p align="justify"&gt;Al igual que antes, sustituiremos la línea comentada:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;// TODO: use this.Content to load your game content here&lt;/p&gt;    &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Por las siguientes:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;b&gt;textura_alien = Content.Load&amp;lt;Texture2D&amp;gt;(&amp;quot;alien_der_andando&amp;quot;);&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;textura_fondo = Content.Load&amp;lt;Texture2D&amp;gt;(&amp;quot;fondo&amp;quot;);&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora programaremos los movimientos de nuestro muñeco, para ello nos iremos a la función Update() y sustituiremos de nuevo la línea comentada de siempre por el siguiente código, en el que leeremos el estado del teclado y observaremos todas las pulsaciones comprobando si coincide con una pulsación de la “flecha izquierda” del teclado o de la “flecha derecha”, en caso de ser una de ellas, moveremos nuestro muñeco (nuestro pixel) a la izquierda o a la derecha en el eje de las X de la pantalla, en nuestro caso hemos puesto que se mueva 5pixels, que es una velocidad bastante aceptable:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;b&gt;estadoteclado = Keyboard.GetState();&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;Keys[] teclaspulsada = estadoteclado.GetPressedKeys();&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;foreach (Keys ekey in teclaspulsada)&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;{&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;if (ekey == Keys.Left)&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;{&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;alien.X -= 5;&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;if (ekey == Keys.Right)&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;{&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;alien.X += 5;&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Finalmente tendremos que pintar el muñeco en la pantalla, para ello nos vamos a la función Draw() y sustituiremos la línea comentada por las siguientes líneas. Al principio y al final abriremos y cerraremos el modo “dibujo” y entre medias podremos dibujar los objetos en la pantalla:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;b&gt;spriteBatch.Begin(SpriteBlendMode.AlphaBlend);&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;spriteBatch.Draw(textura_fondo, Vector2.Zero, Color.White);&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;spriteBatch.Draw(textura_alien, alien, Color.White);&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;b&gt;spriteBatch.End();&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Como veis dibujar un objeto es muy sencillo, el primer parámetro que le pasaremos a la función “spriteBatch.Draw” será la textura del objeto, el segundo parámetro será la posición de la pantalla que ocupará, como habréis imaginado, al actualizar la posición del muñeco en la función Update, ya no hace falta que dibujemos el objeto unos pixels hacia un lado, ya que el vector se actualizó en la función Update() que se ejecuta antes que la función Draw(), el tercer parámetro lo dejaremos tal cual:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;b&gt;spriteBatch.Draw(TEXTURA, VECTOR, Color.White);&lt;/b&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Pues esto es todo por hoy, si os ha salido todo bien, debería compilar y ejecutarse sin problemas y tendréis un videojuego como el siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:c7576d34-f1bb-419b-8b47-29ba61004530" style="padding-right:0px;display:block;padding-left:0px;float:none;padding-bottom:0px;margin-left:auto;width:425px;margin-right:auto;padding-top:0px;"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/O3be7RNuNao&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/O3be7RNuNao&amp;amp;hl=es&amp;amp;fs=1&amp;amp;&amp;amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;El próximo día vamos a convertir el movimiento de nuestro muñeco en algo más realista, haciendo que cuando se mueva simule que va andando, moviendo las piernas, y que cuando vaya hacia atrás, mire hacia atrás, hasta entonces os dejo practicando con el post de hoy!&lt;/p&gt;  &lt;p align="justify"&gt;Saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=845" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/Xna/default.aspx">Xna</category><category domain="http://www.windowstecnico.com/archive/tags/Videojuegos/default.aspx">Videojuegos</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Diseña tus propios videojuegos para Windows, Zune y XBOX 360 con Microsoft XNA (Parte II)</title><link>http://www.windowstecnico.com/archive/2009/09/07/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-ii.aspx</link><pubDate>Sun, 06 Sep 2009 22:53:32 GMT</pubDate><guid isPermaLink="false">f5fee4ed-c2ed-43f2-a57e-69c2e2dfbdde:673</guid><dc:creator>Juan Antonio</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.windowstecnico.com/rsscomments.aspx?PostID=673</wfw:commentRss><comments>http://www.windowstecnico.com/archive/2009/09/07/dise-241-a-tus-propios-videojuegos-para-windows-zune-y-xbox-360-con-microsoft-xna-parte-ii.aspx#comments</comments><description>&lt;p align="justify"&gt;Buenas a todos, en el post de hoy vamos a continuar con la cadena de posts sobre Microsoft XNA, comenzando por donde lo dejamos el ultimo día, la instalación del producto.&lt;/p&gt;  &lt;p align="justify"&gt;Para instalar la plataforma completa deberemos tener dos ejecutables diferentes, el primero será el archivo que nos instalará el Visual Studio Express Edition, bien la versión 2005 ó bien la versión 2008 según la que nos hayamos descargado. El segundo será el instalador de XNA, donde se encuentran todas las librerías necesarias para la programación de videojuegos.&lt;/p&gt;  &lt;p align="justify"&gt;Hacemos doble clic en el primero de ellos, el Visual Studio, como veréis es un instalador normal, procederemos con la técnica del “siguiente, siguiente,…”, por lo que no nos vamos a entretener mas en explicarlo. Una vez instalado, instalaremos XNA desde su ejecutable de la misma manera.&lt;/p&gt;  &lt;p align="justify"&gt;Tras instalar ambos elementos, abrimos el Visual Studio:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_7A4E438A.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="539" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_59849D9A.png" width="432" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Una vez abierto iremos a la pestaña “Archivo” y seleccionaremos “Nuevo proyecto”:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_53871DB6.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="574" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_565484BC.png" width="427" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Deberíamos ver lo siguiente:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_2ACAF6C6.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="342" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_664307D9.png" width="580" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Ya tenemos todo preparado para empezar a programar nuestros videojuegos. Pero antes de tirarnos al rio, vamos a aprender jugando un poco. Como habréis visto en la imagen anterior, al instalarnos XNA, se nos ha instalado el código fuente de un videojuego que nos dan de ejemplo, al que han llamado “Platformer Starter Kit (3.1)”. Vamos a utilizar este código y generar el juego para practicar, para ello seleccionaremos el icono del muñeco que pone “Platformer Starter Kit (3.1)”, le daremos un nombre, una ubicación y aceptamos, deberíamos ver, el siguiente árbol de clases en el explorador de soluciones:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_6D1D4D62.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="1040" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_7C5646E0.png" width="380" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;No os asustéis al verlo, aunque sea muy grande, es porque está el videojuego programado para las tres plataformas, es decir, es el mismo código, pero copiado tres veces para ejecutarse en Windows, en Xbox 360 y en Zune.&lt;/p&gt;  &lt;p align="justify"&gt;Si compilamos y ejecutamos el juego, pulsando F5, podremos jugar a nuestro primer juego hecho con XNA.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_532B5C4A.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="320" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_7252D8E5.png" width="531" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Tras haber jugado un poco con esta especie de “Indiana Jones” en 2D, vamos a pararnos un rato a estudiar el código. Cómo veréis, tenemos numerosas cosas, en primer lugar veremos 3 grandes bloques, uno con un icono de Windows, otro con un icono de Xbox 360 y otro con el icono de Zune, como es obvio y habréis intuido, es el mismo juego, pero programado para las tres plataformas diferentes. Si ahora nos centramos en el bloque del código de Windows, veremos numerosas clases diferentes, “enemy, animation, gem, player …”, pero ¿para qué queremos todas estas clases? Bien, cuando creemos un nuevo proyecto, se nos generará una única clase llamada “game”, donde contendrá todos los elementos necesarios para ejecutar el videojuego, pero por mantener un poco de orden y limpieza, y que cuando llevemos algunos cientos de líneas no nos comencemos a liar, está bien el utilizar una de las ventajas que nos ofrece C#, la orientación a objetos, y separar los elementos principales del juego en clases independientes, que iremos instanciando en la clase “game” según vayamos necesitando. Por ejemplo, podemos separar en clases independientes los movimientos que puede realizar el personaje principal del juego de los de otros personajes que salgan en el juego, sus texturas y variables, … Si no tenéis muy claro aún de que estamos hablando, cuando veamos algo de código volveremos sobre ello.&lt;/p&gt;  &lt;p align="justify"&gt;Por otro lado, además de las clases, veréis una sección en la que pone HighResolutionContent y otra que pone SharedContent, estas son las carpetas que contendrán las imágenes, fondos, músicas y demás elementos externos que utiliza el videojuego. Todos estos elementos externos como imágenes, sonidos, música de fondo… los almacenaremos en la carpeta “Content”, que se nos ha generado dentro de la carpeta raíz del proyecto, y luego podremos ir generando dentro de ella subcarpetas para organizar todo un poco.&lt;/p&gt;  &lt;p align="justify"&gt;Tras explicaros un poco a “groso modo” el contenido del videojuego de muestra, vamos a cerrarlo y a crear el proyecto de nuestro primer videojuego.&lt;/p&gt;  &lt;p align="justify"&gt;Al igual que antes vamos a la pestaña “Archivo” y seleccionamos “Nuevo proyecto”, se nos abrirán todas las plantillas que podemos seleccionar, de todos los elementos que salen a nosotros solo nos interesan tres de ellos:&lt;/p&gt;  &lt;p align="justify"&gt;· Windows Game (3.1)&lt;/p&gt;  &lt;p align="justify"&gt;· Xbox 360 Game (3.1)&lt;/p&gt;  &lt;p align="justify"&gt;· Zune Game (3.1)&lt;/p&gt;  &lt;p align="justify"&gt;Para comenzar vamos a generar un “Windows Game”. Bien, ahora le damos un nombre, una ubicación y aceptamos.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_26D57A38.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:block;float:none;margin-left:auto;border-left:0px;margin-right:auto;border-bottom:0px;" height="512" alt="image" src="http://blogserver.informatica64.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/image_5F00_thumb_5F00_3B7F750B.png" width="360" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Si os fijáis en el explorador de soluciones, ya no tenemos todas las clases que teníamos en el videojuego anterior, como os dije solo tenemos ahora una clase llamada Game1, donde deberemos programar todo el juego. Por otro lado tenemos otra clase llamada Program, que ignoraremos, ya que simplemente es la encargada de llamar a la clase Game1 para ejecutar el juego.&lt;/p&gt;  &lt;p align="justify"&gt;Para finalizar por hoy, vamos a abrir el código de la clase Game1.cs y estudiarlo un poco, para ello, podemos hacer doble clic sobre ella, se os abrirá la clase con el siguiente código que vamos a analizar por partes:&lt;/p&gt;  &lt;p align="justify"&gt;En primer lugar veremos todas las librerías que utiliza, si os fijáis la mayoría llaman a la biblioteca de Xna:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;using System;&lt;/p&gt;            &lt;p&gt;using System.Collections.Generic;&lt;/p&gt;            &lt;p&gt;using System.Linq;&lt;/p&gt;            &lt;p&gt;using Microsoft.Xna.Framework;&lt;/p&gt;            &lt;p&gt;using Microsoft.Xna.Framework.Audio;&lt;/p&gt;            &lt;p&gt;using Microsoft.Xna.Framework.Content;&lt;/p&gt;            &lt;p&gt;using Microsoft.Xna.Framework.GamerServices;&lt;/p&gt;            &lt;p&gt;using Microsoft.Xna.Framework.Graphics;&lt;/p&gt;            &lt;p&gt;using Microsoft.Xna.Framework.Input;&lt;/p&gt;            &lt;p&gt;using Microsoft.Xna.Framework.Media;&lt;/p&gt;            &lt;p&gt;using Microsoft.Xna.Framework.Net;&lt;/p&gt;            &lt;p&gt;using Microsoft.Xna.Framework.Storage;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Avanzando un poco llegamos a una serie de funciones, de las cuales nos centraremos únicamente en cuatro de ellas, ya que serán las únicas que debemos tocar a la hora de programar el juego.&lt;/p&gt;  &lt;p align="justify"&gt;La primera de las cuatro funciones que aparecen es la función Initialize, esta función se ejecuta únicamente cuando se inicia el videojuego, así que la aprovecharemos para inicializar variables, inicializar las texturas de los personajes e inicializar el tamaño de pantalla del videojuego:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;protected override void Initialize()&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;// TODO: Add your initialization logic here&lt;/p&gt;            &lt;p&gt;base.Initialize();&lt;/p&gt;            &lt;p&gt;}&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;La siguiente función, LoadContent, la utilizaremos para cargar las imágenes (que almacenaremos en la carpeta “Content”) que representaran las texturas del juego y los sonidos y demás elementos externos que requiramos en el videojuego:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;protected override void LoadContent()&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;// Create a new SpriteBatch, which can be used to draw textures.&lt;/p&gt;            &lt;p&gt;spriteBatch = new SpriteBatch(GraphicsDevice);&lt;/p&gt;            &lt;p&gt;// TODO: use this.Content to load your game content here&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Las dos funciones anteriores, Initialize y LoadContent se ejecutarán únicamente al principio del juego. Ahora vamos a explicar las siguiente funciones que se ejecutaran de manera infinita hasta que el juego finalice, es decir, en un bucle cuya función de salida es cerrar el videojuego.&lt;/p&gt;  &lt;p align="justify"&gt;En la función Update deberemos programar las acciones que determinen las modificaciones en el juego, es decir, por ejemplo, si el personaje principal, se mueve hasta la mitad de la pantalla y hay una piedra, que no pueda avanzar más, o por poner otro ejemplo, si estamos programando un juego de coches, si el jugador pulsa la tecla flecha izquierda, haremos que el coche gire a la izquierda:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;protected override void Update(GameTime gameTime)&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;// Allows the game to exit&lt;/p&gt;            &lt;p&gt;if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)&lt;/p&gt;            &lt;p&gt;this.Exit();&lt;/p&gt;            &lt;p&gt;// TODO: Add your update logic here&lt;/p&gt;            &lt;p&gt;base.Update(gameTime);&lt;/p&gt;            &lt;p&gt;}&lt;b&gt;&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Finalmente nos encontraremos con la function Draw, que se ejecutará después de la función Update, y será la encargada de dibujar todos los elementos en pantalla, por tanto, si se ha producido un cambio en el juego en la función Update, cambiaremos los objetos de pantalla para reproducir ese cambio en la función draw. Por continuar el ejemplo, si tenemos el coche en el centro de la pantalla, y en la función Update detectamos que el jugador a pulsado la tecla izquierda, y hemos indicado al coche, que gire a la izquierda unos pixels, dibujaremos el coche en esta iteración del bucle general unos pixels mas a la izquierda, para visualizar la acción que ha ejercido el jugador sobre el teclado en la pantalla:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;protected override void Draw(GameTime gameTime)&lt;/p&gt;            &lt;p&gt;{&lt;/p&gt;            &lt;p&gt;GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/p&gt;            &lt;p&gt;// TODO: Add your drawing code here&lt;/p&gt;            &lt;p&gt;base.Draw(gameTime);&lt;/p&gt;            &lt;p&gt;}&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Con todo esto, tenéis para practicar durante los próximos días, hoy ya hemos visto un código terminado, es más sencillo de lo que parece a primera vista, y como habéis visto en el videojuego que estamos programando desde cero, las funciones para las que debemos generar el código se resumen en cuatro muy sencillas de entender y que tienen una finalidad muy delimitada, lo que las simplifica enormemente.&lt;/p&gt;  &lt;p align="justify"&gt;El próximo día rellenaremos estas cuatro funciones para generar nuestro primer juego, en él, añadiremos un muñeco que se mueva por la pantalla, un ejemplo sencillo y muy ilustrativo, por si queréis ir preparándolo, necesitaremos un fondo como el que habéis visto en el videojuego “Platformer Starter Kit (3.1)”, y dos imágenes de un muñeco mirando hacia ambos lados. &lt;/p&gt;  &lt;p align="justify"&gt;Un saludo y espero estéis disfrutando del manual!!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.windowstecnico.com/aggbug.aspx?PostID=673" width="1" height="1"&gt;</description><category domain="http://www.windowstecnico.com/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://www.windowstecnico.com/archive/tags/Xna/default.aspx">Xna</category><category domain="http://www.windowstecnico.com/archive/tags/Videojuegos/default.aspx">Videojuegos</category><category domain="http://www.windowstecnico.com/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.windowstecnico.com/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://www.windowstecnico.com/archive/tags/Programacion/default.aspx">Programacion</category><category domain="http://www.windowstecnico.com/archive/tags/.Net/default.aspx">.Net</category></item></channel></rss>