Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System (España) €

nº20 noviembre 2005 • 8,50 dotNetdotNetManíawww.dotnetmania.comManía Dedicada a los profesionales de la plataforma .NET

Novedades en lala seguridadseguridad enen Visualisual StudioStudio 20052005 • Programando para 64 bits con .NET Fra- mework 2.0 • Novedades para desarrollo Web en ASP.NET.NET 2.02.0 •• Optimización ASP.NET.NET 2.02.0 •• NovedadesNovedades en el estándar de C#• “Reflexionando” y haciendo “reflexión” sobre la genericidad de .NET 2.0 • Novedades de Visualisual BasicBasic 2005• ¿Maestro-detalle con Visualisual BasicBasic 2005? • El IDE de Visualisual StudioStudio 20052005 •• Novedades en la extensibilidad de Visualisual Studio 2005 • ADO.NET 2.0, más y mejor acceso a datos

dnm.editorial dotNetManía Visual Studio 2005 Dedicada a los profesionales de la plataforma .NET Vol. II •Número 20 • Noviembre 2005 Precio: 8,50€ < < Bienvenido al número 20, de noviembre Y también, cómo no, algunas noveda- de 2005, de dotNetManía, el número que des que afectan a los lenguajes de progra- Editor Paco Marín más horas de sueño nos ha quitado :-). mación, con artículos generales para Visual ([email protected]) El día 7 de noviembre se habrá pre- Basic y el nuevo estándar ECMA de C#; ade- Administración sentado oficialmente la nueva versión más, otro más específico de generics con C# Pilar Pérez Visual Studio 2005, junto con SQL Server y uno más explicando la generación de códi- ([email protected]) 2005 y BizTalk Server 2006. Por este moti- go para Visual Basic con uno de los asisten- Asesor Técnico vo hemos querido hacer un número espe- tes. ha puesto especial cuidado en Marino Posadas ([email protected]) cial dedicado exclusivamente al nuevo ahorrarnos líneas de código innecesarias; Visual Studio 2005, tal y como hicimos ya según comenta José M. Alarcón en su artí- Redactores Antonio Quirós, Dino Esposito, Guillermo con SQL Server 2005. culo, hasta un 70% en ASP.ET 2.0 con res- 'guille' Som, Jorge Serrano, José Manuel Nuestro objetivo es que usted tenga, pecto a ASP.NET 1.x. Alarcón, Luis Miguel Blanco, Miguel Katrib (Grupo Weboo). después de leerlo, una idea bastante apro- No nos hemos olvidado del IDE de ximada de las novedades más importantes Visual Studio 2005, nuestro banco de tra- Colaboradores habituales Ángel Esteban, Braulio Díez, Daniel Mazzini, de Visual Studio 2005 y .NET Framework bajo, que sufre cambios significativos. Eladio Rincón, Erich Bühler, Fernando 2.0. Para lo cual hemos dedicado 32 pági- Enfocado desde un punto de vista general y Nogueras, Jorge Crespo Cano, José Miguel Torres, Miguel Egea, Octavio Hernández, nas más de lo habitual y un buen puñado también más específicamente con las nove- Pablo Abbate, Pepe Hevia, Rodrigo Corral y de horas extraordinarias. Aún así, han que- dades sobre la extensibilidad. Salvador Ramos. dado cosas en el tintero pues las novedades Seguramente debimos hacer más hin- Además colaboran en este número son muchas, ciertamente. capié en las nuevas capacidades de desplie- Alberto Ruíz, Carlos Quintero, Javier Izquierdo, José Murillo, Mario del Valle y Este mes publicamos las entrevistas a gue; por supuesto, las cinco páginas dedi- Sergio Vázquez Brian Keller, Program Manager de Visual cadas a Team System son insuficientes; las Studio 2005, y a Mike Hernández y Donald dos dedicadas a seguridad sólo dan para Drake, del equipo de desarrollo de Visual apuntar novedades; nos hemos dejado atrás Edición y Suscripciones .netalia Studio Tools for Office 2005, otro de los a J#,... En fin, faltan muchas líneas por c/ Robledal, 135 grandes cambios en esta versión. escribir, afortunadamente. Aquí no hace 28529 Rivas-Vaciamadrid (Madrid) Hemos escrito sobre algunas ediciones más que comenzar nuestro trabajo con esta Tf. (34) 91 666 74 77 nuevas: Visual Studio Team System y Visual nueva versión. Fax (34) 91 499 13 64 Studio Web Developer Express Edition. Mi más sincero agradecimiento a las Publicidad Procuramos abarcar las novedades de personas de Microsoft Ibérica que nos han Mediadev Sophie Mancini ([email protected]) .NET Framework más relevantes: la nue- apoyado incondicionalmente y, por Tf. 93 426 22 57 - 670 99 74 64 va capacidad de generar código nativo de supuesto, a todos los redactores que se han Fax. 93 423 11 40 64 bits, las novedades en cuanto a la segu- implicado y que han trabajado duro para Imprime ridad, los nuevos ADO.NET 2.0, .NET que esto fuera un todo y no la suma de sus Gráficas Vallehermoso www.graficasvallehermoso.com Compact Framework 2.0 y ASP.NET 2.0; individualidades. Lo mejor es que se ponga cómodo, ISSN este último con dos artículos, uno genéri- 1698-5451 co y otro más en detalle enfocado a la opti- pase página y deje esta editorial para leer

Depósito Legal mización. algo más interesante. M-3.075-2004 Manía dotNet < < 3 dnm.20sumario Visual Studio 2005, un entorno de desarrollo para todos los gustos 8-10 Presentación de Javier Izquierdo, gerente de producto de Visual Studio de la nueva versión. Entrevista a Brian Keller 12-13 Program Manager de Visual Studio 2005 Novedades en la seguridad en Visual Studio 2005 14-15

Programando para 64 bits con .NET Framework 2.0 16-17

Novedades para desarrollo Web en ASP.NET 2.0 y Visual Web Developer 2005 18-24

Optimización ASP.NET 2.0.¡Como una moto! 25-29

dnm.laboratorio 30-32 Visual Studio 2005 Web Developer Express Entrevista a Mike Hernández y Donald Drake 34-35 Equipo de desarrollo de Visual Studio Tools for Office 2005 Novedades en el estándar de C# 36-39

“Reflexionando” y haciendo “reflexión” sobre la genericidad de .NET 2.0 40-46

Novedades de Visual Basic 2005 48-55

¿Maestro-detalle con Visual Basic 2005? ¡Chupado! 56-59

El IDE de Visual Studio 2005 60-63

Novedades en la extensibilidad de Visual Studio 2005 64-68

dnm.laboratorio 70-72 .NET Compact Framework 2.0 ADO.NET 2.0. Más y mejor acceso a datos 74-80

Visual Studio 2005 Team System 81-84

dnm.todotnet.qa 86-88 Visual Studio 2005 tips & tricks dnm.biblioteca.net 89 Visual C# 2005: A developer's notebook (Jesse Liberty) Pro C# 2005 and the .NET 2.0 Platform (Andrew Troelsen) dnm.desvan 90 dnm.sumario

<< dnm.noticias

Business Objects presenta BusinessObjects XI Release 2

permite a los usuarios realizar consul- (ETL). Los proyectos de ETL suelen dise- tas y análisis sobre esas fuentes de una ñarse de forma ad hoc, en un proceso para forma más sencilla. Ahora los usuarios el cual escasean las mejores prácticas. pueden integrar información proce- Cuando un responsable de TI empieza a Business Objects ha anunciado hoy la dente de bases de datos OLAP y rela- diseñar un proyecto de ETL, ha de definir disponibilidad de BusinessObjects XI Release cionales y efectuar consultas y análisis minuciosamente la correspondencia exac- 2. Las mejoras y los nuevos productos que

noticias de manera integrada a partir de esos ta entre cada fuente de datos y las necesi- incorpora BusinessObjects XI Release 2 ofre- datos, como si estos procediesen de una dades empresariales de los usuarios finales. cerán a los usuarios una mayor simplicidad sola fuente. Con BusinessObjects Composer, los desarro- de manejo, información más fiable, así lladores pueden documentar fácilmente como la posibilidad de estandarizar toda su BusinessObjects Desktop Intelligence todo el proceso de ETL. Ahora pueden ini- infraestructura en torno a una única plata- ciar nuevos proyectos de ETL de mayor El producto BusinessObjects Desktop forma de BI. nivel con sólo consultar proyectos realiza- Intelligence, antes conocido como “cliente dos anteriormente. BusinessObjects Intelligent Question completo” (Full Client), permite a todos los clientes de Business Objects disfrutar de Business Objects ha presentado tam- todas las ventajas de la plataforma Gestión automatizada del ciclo de vida de BI bién BusinessObjects Intelligent Question, un BusinessObjects XI, incluidas las funcionali-

noticias. Las nuevas funcionalidades de Business- nuevo producto que proporciona una inter- dades de toma de decisiones colaborativas, faz más fácil de utilizar, que resultará atrac- Objects XI Release 2 permiten a los respon- la integración con Microsoft Live Office, sables de informática gestionar con mayor tiva para un nuevo colectivo de usuarios y la BI Encyclopedia, que ofrece informa- empresariales. Con Intelligent Question, el facilidad las implantaciones de BI de las que ción de contexto adicional sobre el nego- ya disponen. Ahora los responsables de TI usuario de a pie puede formular fácilmen- cio. Con Desktop Intelligence, los usuarios te preguntas acerca de su negocio y recibir pueden utilizar herramientas de gestión tienen a su disposición un lugar unificado automatizada del ciclo de vida para mover respuestas sin necesidad de ejecutar con- desde donde ver todo el contenido de BI y sultas ni de entender de datos. cualquier objeto u aplicación de BI, a tra- compartirlo con sus otros colegas. vés de los entornos de desarrollo, pruebas Mejoras en Web Intelligence y producción. Esta nueva característica per- BusinessObjects Composer mite a las organçizaciones reducir el coste BusinessObjects XI Release 2 intro- noticias. BusinessObjects Composer es un produc- de mantenimiento de sus implantaciones duce importantes mejoras en Web to nuevo e innovador que ayuda a los res- de BI, facilitando al mismo tiempo su Intelligence La nueva versión de Web ponsables de TI a mejorar su eficiencia y ampliación gradual. Intelligence sincroniza datos proceden- la calidad de diseño de sus proyectos de Para más información: http://www.busi- tes de varias fuentes distintas, lo que extracción, transformación y carga de datos nessobjects.com.

Borland presenta Delphi 2006,C# Builder 2006 y C++ Builder 2006

Delphi 2006, C# los cambios de código fuente y la integra- ECO III, el marco único de Borland Builder 2006 y C++ ción perfecta con herramientas ALM de para Delphi 2006 y C# Builder, ofrece ser-

noticias. Builder 2006 ofrecen a Borland, ayudan a reducir el tiempo y el vicios para aplicaciones como el mapeado partir de ahora Borland coste de construcción, gestión, manteni- relacional de objetos (ORM) y la persis- Developer Studio –el miento y ampliación de las aplicaciones tencia transparente de objetos, lo que evi- entorno de desarrollo Windows y .NET. ta a los desarrolladores la complejidad de multilenguaje de Bor- Los usuarios de Delphi también pue- construir y mantener sus propios servicios land para las aplicacio- den acelerar el desarrollo con soporte para personalizados. nes Microsoft Win- ingeniería inversa, “prototipaje” rápido e ECO III también contribuye a que el dows y .NET–. Se tra- integración avanzada de IDE con modela- desarrollo basado en el diseño sea una rea- ta del único entorno de desarrollo integra- do UML, requerimientos, control de ver- lidad gracias a su Framework basado en do que incluye soporte para las aplicacio- siones, seguimiento de bugs y colaboración modelos, especialmente útil para la crea- nes Delphi/Delphi .NET, C, C++ y C#. entre equipos. Con soporte para Microsoft ción de aplicaciones de bases de datos basa- noticias. Los clientes que adquieran cualquiera de .NET Framework, ASP.NET, VCL.NET, das en formularios para servicios Web, estos productos obtendrán un soporte para VCL y Win32 SDK. Además, dado que ASP.NET y Windows. los cuatro lenguajes sin costes adicionales, Delphi soporta tanto Win32 como .NET, Estas nuevas versiones se presentarán con la flexibilidad de personalizar las capa- los clientes pueden continuar con el desa- en Madrid y Barcelona el 15 y 16 de cidades específicas del lenguaje. rrollo y mantenimiento de las aplicaciones noviembre respectivamente, con la pre- Las nuevas mejoras de Delphi 2006, Win32 existentes, a la vez que simplifican sencia de Jason Vokes, Director de Producto

Manía tales como un sistema de plantillas en direc- el camino hacia .NET Framework y las apli- de Borland. Para más información e ins- to, refactorings avanzados que automatizan caciones Windows de próxima generación. cripción: 902 34 45 56 y en www.borland.es. dotNet < <

6 noticias. dnm.noticias

Eventos OJ.X de Compuware Lanzamiento de Visual Studio 2005 y SQL Server 2005 Compuware celebró el 6 de octubre en su sede central de Detroit el segundo encuentro tecnológico OJ.X y donde se mostraron las más novedosas tecnologías de desarrollo de aplicaciones El 15 y 17 de noviembre, en Barcelona y Madrid, son las fechas y los lugares elegidos El evento reunió a alrededor de 1.000 para la presentación más esperada de los dos desarrolladores para mostrarles las más avan- últimos años. zadas tecnologías y experiencias en desarro- Para la presenta- llo de software. ción en España de En este segundo año, Compuware ha Visual Studio 2005, ampliado el alcance del evento incluyendo SQL Server 2005 y las tecnologías de desarrollo Microsoft .NET BizTalk Server 2006, y Java, las dos mayores plataformas que están Microsoft Ibérica tie- usando actualmente las empresas para el ne previstos dos even- desarrollo y la implantación de aplicaciones tos de carácter intro- distribuidas. ductorio y general: El encuentro tuvo como objetivo mostrar ver la solidez de Compuware y la continuada uno en Barcelona que se celebrará el día 15 y educar sobre las habilidades y estrategias más inversión en tecnologías .NET y su concen- de noviembre en el salón La Sagrada Familia avanzadas para incrementar la productividad tración en la innovación sobre aplicaciones del del hotel AC Barcelona, coincidiendo con el del desarrollo, el ROI (retorno de inversión) y la ciclo de vida”. IT Forum; y otra en Madrid que se celebra- calidad, con independencia de la tecnología Compuware participará como gold sponsor rá el día 17 de noviembre en la Sala Retiro, subyacente. La edición de este año contó con en el próximo Microsoft Visual Studio 2005 entre el pabellón 8 y 10 del recinto ferial IFE- presentaciones relevantes tanto por parte de Launch Tour en el que se presentará Visual MA y coincidiendo con el SIMO. Microsoft como de Eclipse. Studio 2005 a nivel mundial. En él, Más información sobre estos eventos y El evento se desarrolló en un ambiente Compuware presentará la siguiente versión de registro en: http://www.encuentromicrosoft.com. abierto e incluyó sesiones técnicas, laborato- Compuware TestPartner con capacidades de Más adelante para la presentación de la rios de aprendizaje interactivo, estudios reales pruebas funcionales y de regresión, integradas versión española de estos productos habrá de casos de desarrollo y conferencias de exper- en Microsoft Visual Studio 2005 Team System. una gira por 14 ciudades españolas, aún por tos. Los desarrolladores, sus jefes y los CIO Además, Compuware planea introducir decidir. Incluiremos detalles de estos even- pudieron aprender tendencias y técnicas de la una nueva versión de Compuware tos el próximo mes. mano de algunos de los más brillantes y con- DevPartner Studio con una completa inte- Como ya informamos el mes pasado, el sumados visionarios de la industria. gración en el IDE de Visual Studio 2005: DevPartner Studio 8.0 que ofrecerá soporte 7 de noviembre Steve Ballmer será el Soporte para Visual Studio 2005 mejorado para servicios Web, una nueva e inno- encargado de anunciar este lanzamiento Compuware anunció en este evento el vadora característica llamada Performance Expert en un evento de un solo día que se cele- soporte para Microsoft Visual Studio 2005 y capacidades para la simulación de fallos. brará en San Francisco, en el Moscone de sus herramientas para la ayuda al desa- Adicionalmente, Compuware introducirá una West Convention Center. rrollo, testeo, gestión de aplicaciones. nueva versión de DevPartner Fault Simulator Más información en: http://www.micro- “Compuware es un miembro importante que se integra con DevPartner Studio. soft.com/launchtour2005. y valioso del programa Visual Studio Industry A principios de 2006, Compuware tiene Partner (VSIP) y tiene un rica tradición en apli- pensado liberar la próxima versión de su herra- caciones empresariales”, dijo Rick LaPlante, mienta de análisis de seguridad DevPartner HP Integrity Summit 2005 General Manager de Visual Studio 2005 Team SecurityChecker, con soporte para Visual System en Microsoft Corporation (al que tuvi- Studio 2005. Durante los días 5 y 6 de Octubre en mos la ocasión de entrevistar el mes de mayo Más información sobre este evento en: Madrid, se ha celebrado el HP Integrity pasado). “Nosotros estamos muy contentos de http://www.compuwareojx.com Summit 2005 que este año se componía del HP Integrity Developer Forum para desa- rrolladores y del HP Integrity Forum, diri- Alhambra-Eidos celebra su 15 cumpleaños gido a las grandes empresas españolas . La tercera edición del HP Integrity Alhambra-Eidos, empresa especializada Developer Forum se ha celebrado con un gran en facilitar soluciones a las necesidades empre- despligue tecnológico, con un área de traba- sariales en el ámbito de las TIC, ha celebrado jo de 4.000m2, un taller de programación con sus 15 años de trayectoria en este sector. más de 100 puestos de trabajo y 300 cone- A la fiesta asistieron más de 300 personas xiones en red, un centro de proceso de datos entre empleados, clientes, colaboradores y con 70 servidores de alta disponibilidad. medios de comunicación. Alrededor de 50 desarrolladores tuvieron Durante estos 15 años de experiencia, la oportunidad de migrar aplicaciones reales Alhambra-Eidos se ha convertido en una de a plataformas de 64 bits con la asistencia de reconocimientos de fabricantes como Cisco las empresas punteras del mercado nacional, técnicos de las diferentes empresas partici- Manía con una amplia proyección y profesionales alta- Systems o Microsoft, entre otros. Más infor- pantes: Intel, Bea, Oracle, Microsoft... mente cualificados, que se ha reflejado en los mación en: http://www.alhambra-eidos.com. Más información en http://www.hp.es. dotNet < < dnm.noticias 7 Javier Izquierdo Visual Studio 2005 Un entorno de desarrollo para todos los gustos

Es realmente una gran satisfacción para mí el presentar la nueva versión de Visual Studio, que acaba de lanzarse conjuntamente con SQL Server. Juntos, estos productos ofre- cen una completa plataforma que permite a las organizaciones satisfacer las nuevas demandas de sus negocios y con la que las empresas podrán generar soluciones conec- tadas más rápida y eficientemente, desarrollar las aplicaciones de misión crítica más exigentes y tomar decisiones mejor fundamentadas.

< < Han pasado casi diez años desde que Microsoft Este primer Visual Studio .NET cambiaba drás- presentó la primera versión de Visual Studio, la sui- ticamente el concepto de la suite de desarrollo, al te de herramientas de desarrollo para trabajar en ofrecer un entorno de trabajo integrado y único entornos Windows. Por aquel entonces, con Visual independientemente del lenguaje de programación Studio 97, básicamente se siguió el concepto de otros empleado (existen casi 30 lenguajes .NET ahora paquetes y sencillamente se procedió a incluir los mismo), y permitiendo la utilización de diferentes diferentes productos existentes en un mismo paque- lenguajes en un mismo proyecto. .NET comenza- te, pero cada uno tenía su propio ejecutable y tra- ba a despertar el interés de la comunidad de desa- bajaban por separado, con lo que los desarrollado- rrollo, y en poco tiempo se convertía en una alter- res habitualmente aprendían a manejar un solo len- guaje de programación. Aún hubo otro producto, Visual Studio 6.0, con la misma filosofía aunque con sensibles mejoras con respecto a su antecesor. Pero ya en el 2000 el pro- pio Bill Gates anunció públicamente el cambio trascendental que Microsoft planeaba para su futu- Visual Studio 2005 es el mejor ra línea de productos… estamos hablando de .NET, la plataforma de aplicaciones empresariales de entorno de desarrollo creado hasta Microsoft que como buenos lectores de esta revis- ta ya conocen con bastante detalle. el momento y con la amplia Así, en la primavera de 2002 presentamos al mer- variedad de versiones ofrecidas cado el nuevo Visual Studio .NET 2002, y con él la base de este cambio, el primer .NET Framework, así como estamos seguros de que todos los ASP.NET y un nuevo y moderno lenguaje basado en C, que desde su creación ha recibido el apoyo de desarrolladores encontrarán la numerosos académicos y desarrolladores profesiona- Javier Izquierdo les, quienes ya lo han convertido en uno de los más solución a sus necesidades Es Ingeniero Técnico de Obras utilizados en la actualidad; nos referimos por supues- Públicas por la UPM y Gerente de Producto de Visual to a C#. Había llegado la hora de los servicios Web y Studio desde julio de 2000 la programabilidad de Internet. dnm.dnm.plataforma.netplataforma.net

nativa reconocida como plataforma de aplicaciones empresariales. Solo un año después estaba dispo- Me alegro de tener la ocasión de poder nible una versión actualizada del pro- dirigirme a los lectores de dotNetManía ducto, Visual Studio .NET 2003, la cual coincidiendo con un momento tan especial incluía ya J# (la sintaxis Java para como es el anuncio de Visual Studio 2005, la .NET) y sobre todo, aparte de mejo- nueva y mejorada versión de nuestro con- ras de rendimiento y resolución de junto de herramientas de desarrollo. bugs, integraba el desarrollo para dis- Atrás quedaron las primeras versiones positivos móviles, que hasta el momen- de Visual Studio, una evolución que se ha to requería de la utilización de otras venido realizando sobre un firme y cons- herramientas. tante propósito, el de ofrecer a los desarro- Y así llegamos hasta el presente, lladores una solución flexible y dinámica que con el esperado lanzamiento de la les permita potenciar su productividad y efi- nueva versión, Visual Studio 2005 (ya ciencia en las labores de desarrollo y testeo no es necesaria la inclusión de .NET del software. en el nombre del producto, pues ha Este importante lanzamiento se produ- quedado constatado que es el funda- Rosa Mª García ce conjuntamente con el anuncio de SQL mento de la plataforma Microsoft), Consejera Delegada de Server 2005, la esperada versión de nuestro el cual ha sido presentado conjunta- Microsoft Ibérica gestor de bases de datos y herramienta de mente con SQL Server 2005, con el business intelligence, y BizTalk Server 2006, que está perfectamente integrado, en un completo e integrado ecosistema de pro- este mes de noviembre (aunque aún ductos que marcará, sin duda, un antes y un después en la forma de trabajo de los deberemos esperar unas semanas has- desarrolladores. Esperamos satisfacer las expectativas que, tanto la comunidad téc- ta disponer de versiones en español, nica como los fieles lectores de dotNetManía, han puesto en nosotros. previstas para después de las Navidades). Nuevas ediciones para el nue- vo Visual Studio 2005 Express y Visual J# 2005 Express– más como para los profesionales del desa- Visual Web Developer 2005 rrollo Web tendremos Visual Studio Con Visual Studio 2005 no solo pre- Express), orientados a los desarrolla- 2005 Standard, el cual incluye opcio- sentamos una versión actualizada y mejo- dores noveles, estudiantes y aficionados nes como el desarrollo para dispositi- rada del producto, además ampliamos el que desean dar sus primeros pasos en el vos móviles o el soporte nativo de 64 alcance del producto, incorporando nue- mundo de la programación. Dichos pro- bits, y que permite además extender vas líneas para ofrecer soluciones para ductos Express estarán disponibles para el entorno de desarrollo con más de todos los perfiles de usuarios. su descarga de forma gratuita por tiem- 300 herramientas de otros fabricantes po indefinido, para hacer más accesible miembros del programa de Partners Visual Studio 2005 Express la plataforma .NET a los futuros pro- de Visual Studio (VSIP). fesionales del sector. Así, aparece Visual Studio 2005 Visual Studio 2005 Professional Express, compuesta por cinco productos Visual Studio 2005 Standard (los cuatro lenguajes de programación Llegamos así a la versión que como Microsoft –Visual Basic 2005 Express, Para aquellos desarrolladores que su nombre indica, Visual Studio 2005 Visual C++ 2005 Express, Visual C# 2005 aún utilizan versiones pre-.NET así Professional, está dirigida a los profe- sionales del desarrollo trabajando en solitario o en pequeños equipos. No solo ofrece importantes mejoras en cuanto a sus características (Editar y Continuar, empaquetamiento y publi-

cación automáticas con ClickOnce, Manía apariencia consistente de las aplica- dotNet < < 9 << dnm.plataforma.net

Nuevas Suscripciones MSDN Con Visual Studio 2005 los desarrolladores podrán Todas las ediciones Team System se ofrecen en conjunto con la nueva Suscripción MSDN Premium, que viene • Obtener una mayor productividad mediante herramientas integradas a sustituir a la actual MSDN Universal, del ciclo de vida de desarrollo que reducen la complejidad de crear solu- de forma que el usuario siempre esté al ciones orientadas a servicios y permiten a las organizaciones comuni- día y disponga de todos los recursos que carse y colaborar más eficazmente. pueda necesitar. Por otro lado, Visual • Disponer de un mayor conocimiento de los procesos de desarro- Studio Professional además de en solita- llo utilizando Visual Studio 2005 Team System, permitiendo a los rio podrá adquirirse con Suscripción equipos de desarrollo analizar sus procesos software, tomar mejo- MSDN Premium o con Suscripción res decisiones de desarrollo y mejorar la previsión del ciclo de vida MSDN Professional; mientras que la de desarrollo del software . Suscripción MSDN Enterprise desapare- • Trabajar sobre una plataforma de aplicaciones segura, de alto rendi- ce y deja de comercializarse. miento y fiable con el .NET Framework 2.0 y Visual Studio 2005. [ ] Conclusión En definitiva, creemos sincera- mente que Visual Studio 2005 es el mejor entorno de desarrollo creado ciones y sitios Web con las plantillas Studio 2005 Team Foundation Server. Y hasta el momento y con la amplia de Páginas Maestras, etc); además se para las empresas que deseen incre- variedad de versiones ofrecidas esta- ha mejora sustancialmente el rendi- mentar la carga de usuarios en las prue- mos seguros de que todos los desa- miento. Para los interesados en crear bas que realizan sobre sus aplicaciones, rrolladores, desde los noveles hasta los soluciones sobre Excel, Word e se dispone de Visual Studio 2005 Test profesionales con amplia experiencia, InfoPath disponemos de Visual Studio Load Agent. encontrarán la solución a sus necesi- 2005 Tools para Office System, un aña- dido que se instala sobre Visual Studio y permite trabajar con Visual Basic o C# beneficiándose de IntelliSense y el resto de sus características a la vez que se tiene acceso al modelo de objetos de los productos Office.

Visual Studio 2005 Team System

Y por fin nos encontramos con la gran novedad en este lanzamiento, la entrada de Microsoft en el mercado de las herramientas de ciclo de vida del software con Visual Studio 2005 Team System. Diseñado para el trabajo en equipo, y puesto que las funciones den- tro de los equipos de desarrollo se han especializado, se ofrecen diferentes “sabores” según el puesto que se desempeña, disponiendo de una edi- ción para desarrolladores, otra para Y por supuesto, Team System será dades. Como parte del compromiso arquitectos y otra para probadores de muy competitivo en precio respecto a de innovación y mejora que represen- software. También es posible disponer soluciones de ciclo de vida de otros ta Visual Studio 2005, esperamos que de las características de las tres edicio- fabricantes, acercando y popularizan- ayude a todos nuestros clientes y nes mediante el paquete Team Suite. do de este modo su utilización en socios de negocio a mejorar su pro- Estas ediciones trabajan en conjunto organizaciones dedicadas al desarro- ductividad y competitividad y a alcan- con el repositorio de versiones y por- llo en todos los segmentos de merca- zar el éxito.

Manía tal de proyecto, en un modelo cliente do, no solo grandes empresas sino Más información en www.micro- servidor de nivel empresarial, Visual también pequeñas y medianas. soft.com/spanish/msdn/vs2005. dotNet < < 10

dnm.directo.entrevistas

Marino Posadas

Entrevista a Brian Keller Program Manager de Visual Studio 2005

Además de su posición en el equipo de desarrollo de Visual Studio 2005,Brian Keller se mostró especialmente hábil en un paquete de demos con las que contribuyó a la keynote inicial deAndrew Lees,en el pasado Tech-Ed 2005 de Ámsterdam.Amablemente, aceptó responder a nuestras preguntas para dotNetManía.

< < Lo primero, me gustaría que nos hicieras un resumen sobre millones, en todo el mundo. Son desarrolladores no pro- las distintas versiones de Visual Studio 2005, inclu- fesionales, con distintos perfiles: desde el usuario avan- yendo las ediciones Express, en términos de licencias y zado, el principiante, el administrador de sistemas que precios, o sea, en cuanto a su disponibilidad. quiere tener capacidades extendidas de administración Visual Studio Express está pensado para estudian- mediante programas, etc. tes, aficionados y personas que empiezan con desarro- Has mencionado un nuevo elemento dentro del llos, sin experiencia previa. Queríamos poner a dispo- menú principal de Visual Studio, que tuve ocasión de sición de este colectivo una herramienta sencilla, inme- comprobar desde las primeras betas, y que está relacio- diata, con todo lo que se necesita para empezar a hacer nado con la Comunidad (de hecho, se llama así). desarrollos reales. Por eso incluye muchos tutoriales, ¿Significa eso una voluntad por parte de Microsoft para ejemplos, acceso a recursos comunitarios, etc. En tér- abrir lo más posible los recursos comunitarios de desa- minos de funcionalidad, no existe ninguna limitación, rrolladores? ¿Vais a continuar con esa línea? salvo algunas herramientas de alto costo como las pen- Hemos estado pensando cómo potenciar los recur- sadas para desarrollo en grupo, plantillas empresaria- sos comunitarios vinculados con las herramientas de les, aplicaciones para dispositivos móviles, etc. Pero desarrollo, y hemos contactado con un gran número de puede desarrollarse cualquier tipo de aplicación median- partners para conseguir que esa idea se pudiera expre- te las ediciones Express, aunque no todas las herra- sar de forma clara en el nuevo Visual Studio 2005. Eso mientas de soporte estén presentes. nos llevó a incluir esas nuevas opciones e incluso otras, Respecto a las licencias, tampoco existen limitacio- como los llamados kits de inicio, que pueden verse en la nes importantes. Se pueden construir aplicaciones para página principal de todos las ediciones de Visual Studio, cualquiera, distribuirlas como se necesite, comerciali- incluyendo las Express. zarlas, etc. Y respecto a los precios, creemos que son muy ¿Tiene eso algo que ver con una iniciativa llamada competitivos. Por ejemplo, las versiones Express, están Coding for fun? valoradas alrededor de los 49$, y SQL Server Express es En efecto. Es una idea con soporte Web, que tiene gratuito y va a continuar en esa categoría, y pensamos por objeto suministrar contenidos interesantes en tér- que es un gran valor añadido. minos de artículos, código fuente, etc., para que la gen- A propósito de estos comentarios, en la revista hemos te lo pueda incluir en sus propios proyectos. Ahora (pri- tenido ocasión de hablar con otros responsables de Visual meros de julio/05) ya tenemos una treintena de artícu- Studio, y hemos observado la presencia común del tér- los disponibles y pensamos ir aumentando a un ritmo de mino “entusiasta”. ¿Puedes explicarnos exactamente qué unos dos o tres por semana. Queremos que se manten- entendéis por entusiasta, y sobre todo, cuántos de ellos ga vivo, añadiendo además, video webcasts, similares a los Marino Posadas es asesor técnico y tenéis “censados”, como usuarios reales y/o potenciales? que publica Channel9. redactor de Es curioso que lo comentes, porque recientemente Hablemos acerca de lenguajes. ¿Piensas que el len- dotNetManía, MVP de hemos ponderado el número de usuarios que pensamos guaje J# ha evolucionado en su aceptación en la forma C# y formador de que caen dentro de las categorías de aficionados o entu- esperada por Microsoft? ¿Cuáles son las estadísticas de Alhambra-Eidos siastas, y la cifra sube hasta aproximadamente los 18 uso actuales? << dnm.directo.entrevistas

Al principio se trataba de un lengua- je estratégico, en muchas formas, ya que permitía una migración sencilla para los usuarios de Java. Ahí, pensamos que ha sido tremendamente exitoso, y ha cum- plido sobradamente las expectativas. Otra fuente muy importante de programado- res de J# ha sido la comunidad de ISV, donde la migración a .NET se ha visto muy beneficiada por la existencia de J#. En mi experiencia docente, he podi- do comprobar que, mientras muchos organismos oficiales, pymes, y princi- piantes prefieren Visual Basic, en el mun- do universitario, el lenguaje de adopción es claramente C#, debido a sus caracte- Marino Posadas y Brian Keller rísticas sintácticas, fundamentalmente. ¿Esa situación perjudica la promoción de que es quien está desarrollando esa carac- ADO.NET, quizás la capacidad de devol- J# como lenguaje? terística. Es una de las herramientas que ver objetos DataTable como valor de retor- Nosotros tenemos claro cuál es la se consideran como recursos añadidos y, no de un servicio Web; y respecto a las situación del lenguaje en la comunidad en a veces, el canal de distribución, o los aplicaciones para dispositivos móviles, me este momento. Como dije, ha cumplido calendarios pactados no permiten que gustan especialmente el nuevo emulador, y cumple su función y expectativas y segui- ciertos elementos aparezcan en las betas, que es capaz de funcionar en un Virtual rá estando ahí, dentro de esos términos, aunque luego estén en el producto final. PC, y el soporte de Platform/Invoke para por decirlo así. Aunque entendemos que De hecho también va a figurar en todas soportar mensajes SMS. para la mayoría de la comunidad de desa- las versiones Express de los productos. Para concluir, ¿puedes decirnos algo rrolladores los lenguajes más atractivos Aunque ADO.NET no parece haber acerca de las implicaciones en la adopción sean Visual Basic y C#, por supuesto. cambiado excesivamente desde la versión por parte de los equipos de desarrollo del Y, respecto a estos dos últimos, ¿pien- anterior, ASP.NET sí que ha sufrido un nuevo Visual Studio Team System? Por sas que todavía Visual Basic es el lengua- montón de cambios, nuevos modelos de ejemplo, no me parece que muchos de je más popular, o está empezando a cam- compilación, edición, desarrollo y distri- esos entusiastas que citábamos antes vayan biar la tendencia? bución, más de 60 controles de servidor a ir por ese camino inmediatamente, debi- Eso es interesante de analizar, porque añadidos, etc. ¿Supone eso que ASP.NET do a la curva de aprendizaje… si piensas en todas las versiones de Visual estaba inmaduro respecto a ADO.NET? Es cierto, yo tampoco lo creo. Pienso Basic, como VBA, VBScript, etc., enton- Lo que pasa, a veces, es que lleva tiem- que es una herramienta para equipos de ces Visual Basic es, sin duda, el lenguaje po averiguar cómo la gente va a utilizar desarrollo más experimentados, y mayo- más popular. Pero si sólo consideramos los una tecnología. El equipo de desarrollo res en volumen que el programador indi- lenguajes .NET, creemos que la tenden- de ASP.NET es uno de los mejores de vidual. Entre otras cosas, porque requie- cia está empezando a igualarse entre Microsoft en términos de mirar qué es lo re conocimientos del ciclo de vida correc- ambos. Aunque no era así en un principio. que están haciendo los clientes, analizar- to de las aplicaciones, de las que llamamos Respecto a las nuevas características lo y determinar cuáles son las necesida- best practices, etc. Somos conscientes de de los lenguajes, parece que una de las más des. De esa forma, hemos sido capaces de esto, así como de que existe un enorme esperadas por los desarrolladores era la de reducir el código necesario en alrededor trabajo que hacer todavía para las próxi- “Editar y continuar”, al estilo de las ver- de un 70% para esta versión. Cada ver- mas versiones en términos de facilidad de siones de VB anteriores a .NET. Sé que sión nueva es mejor que la anterior, por- uso, de características de instalación Visual Basic 2005 y C# 2.0 van a incluir que aprende de los errores cometidos y ve (recordemos que en la Beta 1 se requerí- esa característica, pero hay un temor en las carencias con más claridad. an 3 máquinas distintas para su instala- los beta-testers respecto a la presencia de Aunque no soy muy aficionado a las ción, aunque en esta Beta 2, ya sólo hace refactoring en Visual Basic, porque las preguntas tópicas, a veces parecen inevita- falta una), etc. betas actuales sólo la incluyen para C#. bles las comparativas. ¿Podrías citar las que Pero pienso que para el momento ¿Qué puedes comentar al respecto? –para ti– son las 3 mejores características en que el producto esté oficialmente en Pues entonces, tengo un mensaje tran- de la nueva versión, respecto a cuatro pun- la calle, vamos a disponer de una exce- quilizador para vuestros lectores, ya que, tos concretos: Windows, ASP.NET, lente herramienta, muy fácil de usar, aunque no está presente en la Beta 2, sí ADO.NET y aplicaciones para móviles? considerando las capacidades que tiene, que lo va a estar en la versión final. Lo que Para Windows, la distribución Click- y que va a suponer una herramienta de sucede es que hemos llegado a un acuer- Once; en ASP.NET, el número de nuevos un valor añadido fantástico para nues- Manía do con otra compañía (Developer Express), controles, junto a los kits de inicio; en tros clientes. dotNet < < 13 dnm.plataforma.net

Marino Posadas Novedades en la seguridad en Visual Studio 2005

.NET es una plataforma que nació con la seguridad “en mente”,por su propio diseño. En la ejecución del código (Code Access Security o CAS), en los metadatos que cada ensamblado especifica de cara a garantizar restricciones en la ejecución y en un mode- lo de especificación de políticas de ejecución muy configurable.Esta nueva versión con- tiene novedades y extiende otros conceptos ya presentes, dando a la plataforma un tono de solidez único hasta ahora.

< < Podríamos dividir en dos categorías las nuevas caracte- aspectos internos de interés tienen que ver con la rísticas de seguridad, dependiendo del tipo de códi- propagación de los símbolos de “impersonation” go a analizar: nativo o administrado. No vamos a tocar entre distintas hebras. Ese comportamiento, que aquí las propias del código nativo, pero sí recordar no era asumido por .NET anteriormente, ahora sí que, para programadores de C++, la nueva herra- lo es, hasta el punto de poner a disposición del usua- mienta de análisis de código que se incluye en Visual rio los métodos SuppressFlow() y SuppressFlow Studio Team System, posee un montón de atracti- WindowsIdentity(), con el objeto de poder operar vas novedades en ese sentido. Por una parte, vamos al estilo anterior. a comentar brevemente la seguridad del propio Framework 2.0. Después, veremos algunos cambios AccessControl en Visual Studio 2005. Dentro del espacio System.Security, el namespa- Seguridad en .NET Framework 2.0 ce AccessControl suministra acceso mediante código a las ACL (Access Control List) del sistema, no sólo en Vamos a resaltar algunas de las novedades en los lectura, sino permitiendo la creación de nuevos obje- espacios de nombres de .NET Framework 2.0. La tos, la toma de control sobre objetos existentes, y la primera que nos llamó la atención, es la clase posibilidad de convertir cadenas SDDL (Security SecureString. Se diseñó como parte del espacio de Descriptor Description Language) en descriptores bina- nombres System.Security, y no se almacena en rios y viceversa. De hecho, todos los objetos en los memoria, como la clase string, sino mediante Data que la seguridad era importante, disponen desde esta Protection API (DPAPI), en un espacio controlado versión de dos nuevos métodos: GetAccessControl() por el sistema. Similares medidas se han tomado en y SetAccessControl(). el espacio de nombres System.Diagnostics, donde Muchos otros aspectos que no podemos destacar la clase ProcessStartInfo, dispone de una propie- por la falta de espacio: la clase NegotiateStream, per- dad Password, del tipo SecureString. Garantizan que teneciente a System.Net.Security, permite ahora cre- el acceso al contenido de la cadena cifrada sólo pue- ar canales seguros de comunicación para facilitar la da hacerse a través de DPAPI sin accesos alterna- implementación de Kerberos o SSL en las aplicacio- tivos. nes. En el apartado de la criptografía, las nuevas cla- Marino Posadas es ProtectedData ProtectedMemory asesor técnico y Otra clase específica de la seguridad es la poten- ses y hacen uso direc- redactor de te SecurityContext. Permite capturar el contexto to de DPAPI, y existen novedades como la no nece- dotNetManía, MVP de de seguridad de un subproceso y restaurarlo en otro sidad de CAPICOM (el API de criptografía basado C# y formador de proceso. Eso incluye los marcadores de subproce- en un módulo de Interop), para manejar certificados y Alhambra-Eidos so para CAS, tales como Assert y PermitOnly. Otros mensajes. << dnm.plataforma.net

Otras primicias agradables, las comprobar hasta qué punto un códi- mos establecer exactamente qué tipo de encontramos en los espacios de nom- go cumplía con los principios de dise- permisos se van a conceder en función bres System.Diagnostics (donde la cla- ño recomendados. A partir de ahora, de las zonas de ejecución que establece se Process permite una llamada direc- se integra en las ventanas de configu- la directiva CAS (default, LocalIntranet, ta a CreateProcessWithLogonW, sin ración de propiedades del proyecto, Internet, etc.) necesidad de Platform/Invoke), o en donde, además, podemos observar una System.DirectoryServices y System.Web, solapa especial “Security”, dedicada donde podemos usar DPAPI para cifrar fundamentalmente a la distribución secciones de ficheros Web.Config, con ClickOnce y la forma de garantizar su código de este tipo: ajuste fino.

//fichero Web.Config

// manejo de Web.config string configFilePath = null; Configuration config = Figura 2 Configuration.GetExeConfiguration(path,ConfigurationUserLevel.None); config.AppSettings.ProtectSection(ProtectedConfiguration.DataProtectionProviderName); config.Update(); Otra de las mejoras a destacar tiene //fichero de salida que ver con la edición de código. Si hemos establecido una restricción a partir de la ventana anterior (por ejemplo, si hemos excluido el permiso FileIOPermission), al intentar editar incluyendo la clase File del espacio de nombres System.IO, casi todos los métodos de la clase aparecen deshabi- litados, de acuerdo con la directiva esta- AQAAA... blecida, si bien esta característica sólo está presente en Visual Basic. A eso hay que subrayar la capaci- dad de ejecutar código con mínimos privilegios (una de las recomendacio- Fuente 1 nes para la escritura de código segu- ro que encontramos en la mayoría de Y además, se han añadido muchas manuales), la informa- nuevas clases y propiedades dentro de ción extendida de CAS (como una nueva clase de eviden- errores de seguridad, cia que nos indica si un ensamblado ha y las nuevas capacida- sido cargado desde GAC), así como des de testing de apli- otras novedades para el manejo de la dis- caciones ofrecidas por tribución ClickOnce. En un próximo artí- Visual Studio Team culo profundizaremos algo más en estas System, incluyendo la características. creación de tests unita- rios, de stress, y un lar- Seguridad en el IDE go etc. En suma, el pro- Figura 1. Solapa de “Seguridad” en la “Ventana de ducto ha sido revisado FXCop: Una herramienta “de obli- Propiedades” de “Proyecto” “con la seguridad” en la gado cumplimiento” proa, y, nuevos análisis, nos irán descubriendo

FxCop se había estado usando Como vemos, si la aplicación sólo cómo esa seguridad aparece por doquier Manía como herramienta independiente para dispone de permiso Partial Trust, pode- en toda la plataforma. dotNet < < 15 dnm.plataforma.net

José Murillo

Programando para 64 bits con .NET Framework 2.0

Por primera vez,y con la reciente salida de la versión 2005 de Visual Studio,Microsoft tiene una bonita historia que contar en torno a los 64 bits. Los compiladores para el .NET Framework 2.0 son los primeros capaces de generar código MSIL opti- mizado para plataformas de 64 bits, tanto para procesadores Itanium como los basados en tecnología extendida x64.

< < La arquitectura de los 64 bits La transición de 32 a 64 bits es tan inminente e ine- vitable como fue en su momento la de 16 a 32 bits, aun- Los procesadores Itanium están que afortunadamente ya podemos anticipar que no será tan compleja, sobre todo para aplicaciones desarrolla- diseñados principalmente para ejecutar das con código manejado. Las ventajas de los 64 bits son varias: desde poder código nativo en 64 bits, no de 32 bits direccionar hasta 8 TB (sí, ¡TeraBytes!) frente a los clásicos 3 GB de los procesadores de 32 bits, inclu- so permitir escalar verticalmente nuestro servidor hasta nuevos límites. Un ejemplo: este incremento 64 entre otros. Son procesadores que mantienen su de memoria permite al sistema operativo pasar de núcleo de 32 bits pero incorporan un conjunto de ins- un máximo de 115.000 conexiones TCP/IP simul- trucciones extendidas que le permiten ejecutar código táneas a más de 1.000.000 en Windows Server 2003. de 64 bits. Estos sistemas nos permiten acceder a las En un escenario de un servidor Web con ASP.NET, ventajas de los 64 bits pero manteniendo la habilidad el cambio a 64 bits no supondría sólo ventajas para de ejecutar código 32 bits de forma nativa con el ren- nuestra aplicación en cuanto al uso de memoria, dimiento habitual. sino sobre todo en el rendimiento y escalabilidad Por otro lado podremos encontrar procesadores de nuestra Web. nativos de 64 bits, los conocidos como IPF (Itanium Dentro de los sistemas de 64 bits podemos dife- Pentium Family) o IA64 y basados en la tecnología EPIC renciar dos arquitecturas completamente diferentes, (Explicit Parallel Instruction Computing). Son procesado- cada una con sus ventajas e inconvenientes, pero sobre res con arquitectura completamente diferente a los x86 todo destinadas a dos escenarios claramente diferen- o x64, mucho más potentes y capaces de ejecutar hasta ciados. Es fundamental conocer cuáles son nuestros 6 instrucciones en paralelo. El inconveniente de estos Jose Murillo objetivos y prioridades antes de decantarnos por una u procesadores es que no pueden ejecutar código de 32 Es ISV Developer Advisor en la División de Desarrollo y otra arquitectura. bits de forma nativa, así que esta ejecución de código Plataforma (DPE) de Microsoft Por un lado nos podemos encontrar con los siste- de 32 bits se realiza a nivel del sistema operativo median- Ibérica. Su objetivo es ayudar a los mas basados en procesadores extendidos, los conocidos te un subsistema de emulación conocido como WoW64 fabricantes de software (ISVs) en como x64, basados en la tecnología EM64T (Extended (Windows 32 on Windows 64). Por desgracia, el impac- la implementación de tecnologías Microsoft, especialmente sobre la Memory 64 Technology). Ejemplos de éstos son los siste- to de este subsistema de emulación en el rendimiento plataforma de desarrollo .NET. mas basados en Intel Xeon, Pentium 4 x64 o AMD Athlon es bastante elevado. << dnm.plataforma.net

Los procesadores con tecnología extendida x64 están destinados principalmente a estaciones de trabajo con grandes necesidades de rendimiento, direccionamiento de memoria, o precisión en operaciones de coma flo- ...portar nuestras aplicaciones .NET a 64 bits tante, como por ejemplo aplicaciones de diseño gráfico CAD, de cálculos de ingeniería, o simplemente para entu- consiste simplemente en cambiar el target de la siastas de videojuegos o sistemas multimedia. configuración de compilación y recompilar En el caso de los procesadores IA64 o Itanium, su uso está principalmente destinado a servidores de bac- kend como bases de datos (existe una versión de SQL Server 2000 y 2005 para IA64), servidores de compo- nentes de 64 bits, o servidores de aplicaciones Web para tará sobre el Framework 2.0 para 64 bits, con lo cual el 64 bits. Como vemos, el mensaje es claro. Los procesa- rendimiento será mayor. Sin embargo, esto ya era posi- dores Itanium están diseñados principalmente para eje- ble con el código generado mediante Visual Studio cutar código nativo en 64 bits, no de 32 bits. 2003, aunque era ejecutado sobre una versión del Framework 1.0 o 1.1 corriendo en 32 bits bajo WoW64, con lo cual el rendimiento era incluso inferior que en máquinas nativas de 32 bits. La gran novedad es la posibilidad que tenemos aho- Tanto en C# como en Visual Basic 2005 ra con Visual Studio 2005 de especificar como target en la configuración de compilación tanto procesadores podemos generar código manejado Itanium (IA64) como Extendidos (x64). En este caso, el código MSIL generado estará optimizado para que el para 64 bits JITter de dichas plataformas sea capaz de generar códi- go nativo optimizado para ese procesador, por ejemplo haciendo así uso de las nuevas capacidades de Itanium para ejecutar instrucciones simultáneamente. El incre- Generación de código para 64 bits con mento del rendimiento de nuestra aplicación en estos casos es notable. Visual Studio 2005 Así pues y con todo lo visto, podemos decir que en la mayoría de los casos, portar nuestras aplicaciones .NET El IDE de Visual Studio 2005 sigue siendo una apli- a 64 bits consiste simplemente en cambiar el target de la cación de 32 bits, aunque por primera vez soportada en configuración de compilación y recompilar. WoW64. Esto quiere decir que ya podemos instalarlo Obviamente el escenario se complica si tenemos directamente en máquinas Itanium, aunque mi reco- dependencias de código de 32 bits, tanto en componen- mendación personal es no hacerlo y seguir desarrollan- tes COM accedidos mediante COM Interop, como en do sobre estaciones de trabajo de 32 bits. En este caso, DLL nativas referenciadas mediante Platform Invoke. En el modelo de desarrollo recomendado es mediante des- el caso de que tengamos acceso al código de estos com- pliegues y depuración remota sobre la máquina Itanium. ponentes, la recomendación es recompilarlos también De todas formas, aunque despleguemos el IDE en la mis- en 64 bits. ma máquina, si intentamos depurar código nativo de 64 En el caso de que no tengamos acceso al código fuen- bits, nos encontraremos con el IDE ejecutando bajo 32 te o podamos recompilar los componentes en 64 bits, ten- bits y la aplicación a depurar en 64 bits, con lo cual inter- dremos que exponerlos a nuestro proceso manejado de namente se utilizará depuración remota aún dentro de 64 bits mediante un proceso wrapper de 32 bits y realizar una misma máquina, ya que código de 32 y 64 bits no la comunicación mediante mecanismo IPC (InterProcess pueden convivir en un mismo proceso. Communication). Si nuestro componente es COM, bas- Lo que sí cambian son los compiladores. Tanto en tará con registrarlo en COM+ como servidor, así será la C# como en Visual Basic 2005 podemos generar códi- propia plataforma de COM+ quien nos lo exponga a nues- go manejado para 64 bits. ¿Pero no habíamos queda- tro código manejado mediante un proceso de 32 bits. Si do en que el código MSIL era código intermedio inde- el componente es una DLL nativa, por ejemplo en C o pendiente de la plataforma? ¿por qué tenemos enton- C++, tendremos que hacer un wrapper nosotros mismos, ces que volver a recompilar para 64 bits? Efectivamente por ejemplo mediante un Server ATL que lo encapsule y el código MSIL que generamos con la configuración exponga el mismo contrato mapeado. por defecto (anyCPU) es agnóstico a la plataforma. Este ¡Animaos! Sólo tenéis que cambiar una opción de código puede ser ejecutado en cualquier tipo de pro- la configuración de Visual Studio y recompilar para 64 cesador, ya que el JITter generará código nativo sobre bits. Ahora ya sólo nos falta una máquina de 64 bits para Manía la marcha. En el caso de máquinas de 64 bits, se ejecu- poder ejecutarlo :-). dotNet < < 17 dnm.asp.net

José M.Alarcón Novedades para desarrollo Web en ASP.NET 2.0 y Visual Web Developer 2005

Si bien ASP.NET 1.x era un marco de desarrollo Web excelente, lo cierto es que la nueva versión 2.0 es todavía mucho mejor y viene con gran cantidad de carac- terísticas nuevas.Sólo por alguna de ellas ya merece la pena actualizarse.El entor- no de Visual Studio 2005 también se ha mejorado notablemente.Vamos a cono- cer todas estas interesantes mejoras y añadidos.

< < Cuando la primera beta de la plataforma .NET “asomó la cabe- • Los nuevos controles Web incrementan la pro- za” allá por el verano del año 2000 (¡ya han pasado más ductividad de forma espectacular tanto en tra- de 5 años, parece mentira!) todos los programadores tamiento y visualización de datos como en contuvimos la respiración. Aquello era todo tan nuevo cuestiones relativas a seguridad. y diferente de lo que conocíamos en el mundo Microsoft que suponía una amenaza, pues había que aprenderlo Dicho esto vamos a conocer las novedades más todo desde cero de nuevo si realmente la cosa iba en importantes. Empezaremos por las menos obvias serio. Por fortuna en cuanto te metías un poquito en pero aún así significativas, e iremos viendo las más ello veías que las ventajas sobrepasaban con creces a las espectaculares al final para mantener así la tensión dificultades y que .NET iba a hacernos la vida más fácil. dramática ;-) De todas las áreas abarcadas por .NET, la más espec- tacular y novedosa era, sin duda, la referida al desarro- Nuevo modelo de compilación y menos llo de aplicaciones Web. La diferencia entre ASP.NET código 1.x y cualquier otro marco de desarrollo Web conoci- do por entonces era simplemente abismal: controles, Si abrimos una página ASPX y su correspondiente viewstate, postback, enlace a datos, compilación, etc, etc. archivo de código (.vb o .cs) en ASP.NET 1.x vere- Combinado con Visual Studio y todas sus herramien- mos mucho código. Para empezar, todos los con- tas gráficas, ASP.NET ofrecía un poder sin preceden- troles de la página se declaran como miembros de la tes para crear aplicaciones HTTP. clase que la representa y existe una parte de iniciali- Aunque ASP.NET 1.x es espectacular y parece zación con bastante código. Además el archivo .ASPX que las mejoras siempre podrán ser pocas, lo cierto utiliza lo que ha dado en llamar Code-Behind para es que la versión 2.0 del marco de desarrollo vuelve relacionar el código con la interfaz de usuario, y a sorprendernos gratamente. Los chicos de Microsoft ambas debían estar sincronizadas en cuanto a sus no se han limitado a añadir unas cuantas cosillas de miembros públicos (los mismos controles declara- compromiso. La 2.0 trae tantas novedades que es dos) para funcionar. José Manuel Alarcón difícil elegir por dónde empezar. De todos modos La nueva versión utiliza mucho menos código. es redactor de dotNetManía. Es ingeniero industrial y conviene destacar un par de hechos importantes res- Para ello emplea un nuevo modelo de compilación especialista en consultoría de pecto a esta nueva versión: y de relación entre una página ASPX y su código aso- empresa. Ha escrito varios libros, • Según estimaciones de Microsoft la nueva ver- ciado, que saca partido a una de las nuevas caracte- y ha publicado más de sión de ASP.NET permite reducir las líneas de rísticas de los lenguajes de la plataforma: las clases doscientos artículos sobre informática e ingeniería en código que es necesario escribir en un 70% en parciales. La característica de clases parciales per- revistas especializadas.Visita su muchos escenarios, sobre todo en los que hacen mite dividir el código que define a una clase en diver- blog en www.jasoft.org. uso intensivo de enlazado a datos. sos archivos en lugar de obligarnos como hasta aho- << dnm.asp.net

ra a mantener todo lo relativo a una cla- se dentro del mismo lugar. Esta carac- terística a simple vista puede parecer una nimiedad, pero realmente tiene gran Según estimaciones de Microsoft la nueva versión de interés ya que permite cosas como repartir el trabajo de una clase entre ASP.NET permite reducir las líneas de código que es varios programadores, o características como el nuevo modelo de soporte de necesario escribir en un 70% en muchos escenarios código que mencionamos. En las páginas ASPX de la versión 2.0 hay una directiva Page análoga a la siguiente:

<% @ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> Ahora Visual Studio nos permite dis- poner del código y la interfaz en el mis- Si nos fijamos, ahora ya no se uti- ye la nueva palabra clave Partial (en mo archivo si lo deseamos; cosa que liza el atributo CodeBehind que apare- minúsculas en C#). Es decir, lo que antes no era posible desde el entorno. cía en esta directiva en las páginas de vemos es sólo una parte de la definición También nos deja mezclar código y la versión 1.x. En su lugar se utiliza el de la clase que representa la lógica de la páginas escritas en diferentes lenguajes atributo Codefile que indica también página. Ello se debe a que, cuando al mismo tiempo, depurando la aplica- en qué archivo está la funcionalidad ASP.NET compila la página, primero ción en todas ellas a la vez. asociada a esta interfaz de usuario. Si completa automáticamente el código de Se han definido una serie de carpe- indican lo mismo: ¿a qué se debe este la clase _Default con otra implementa- tas en el raíz de las aplicaciones que tie- cambio?. ción parcial de ésta en la que se definen nen un significado especial. Por ejem- Si examinamos el archivo de código los controles de la página (el código que plo, si creamos una carpeta llamada (.cs o .vb) asociado a la página, vere- ha desaparecido respecto a las versiones App_code, todo archivo de código fuen- mos que tiene muchas menos líneas y anteriores del entorno). Luego define te que coloquemos en ella se compilará es más sencillo de leer (más “limpio”) una nueva clase específica para la pági- automáticamente y estará disponible que el de versiones anteriores, tal y na que hereda de _Default y es en ella para su uso desde las páginas del sitio como se observa en la figura 1. En esta donde inicializa los controles y hace el Web. Se pueden mezclar ahí archivos misma figura podemos contemplar que nexo entre la interfaz y la lógica. Es por de código escritos en diferentes len- incluso la versión de Visual Basic es este motivo que ahora los manejadores guajes e incluso, sólo con dejar en ella todavía más limpia que la de C# al no de eventos de la clase se declaran con los archivos .wsdl y .xsd que definen un incluir siquiera sentencias Imports mien- accesibilidad protected, para que pue- servicio Web se crea de forma automá- tras que la de C# lleva varios using. dan utilizarse desde la clase derivada. tica un proxy para poder utilizarlo (aun- A esta novedosa que no veremos el código auto-genera- forma de separar (y do sí podremos hacer uso de él). Aunque al mismo tiempo para esto último ya existe una carpeta unir en tiempo de especial llamada App_WebReferences que ejecución) la interfaz nos permitirá mantener ordenadas nues- de la lógica hay tras referencias a servicios. Como quien la denomina vemos todas estas carpetas llevan el code-beside, como prefijo “App_”. Existen muchas otras homenaje al hasta como App_Data, App_GlobalResources, ahora utilizado code- App_LocalResources o App_Themes. behind de ASP.NET Con ASP.NET 2.0 se proporciona 1.x. Sólo este cambio una herramienta de precompilación de ya nos hace la vida sitios Web (Aspnet_compiler.exe). Gracias mucho más fácil a los a ello podemos precompilar nuestras apli- programadores. caciones evitando la compilación dinámi- Es muy fácil com- ca y por tanto reduciendo el tiempo de Figura 1. Como se puede observar,tanto en Visual Basic como en probar este funciona- inicio de ejecución de las mismas (no se C# el código de nuestras páginas se ha reducido considerablemente gracias a la técnica de clases parciales empleada. miento si nos vamos a generan las páginas bajo demanda). la carpeta temporal de Además proporciona un modo de pre- ASP.NET y abrimos compilación especial para distribuir apli-

Si nos fijamos en la definición de la los archivos de código generados de for- caciones que elimina todo rastro de nues- Manía clase veremos que su definición inclu- ma automática que allí encontraremos. tro código (incluso del HTML de las pági- dotNet < < 19 << dnm.asp.net

nas ASPX) y nos facilita su despliegue con XCopy pro- plo el primero de ellos (Wizard) permite la creación visual tegiendo nuestra propiedad intelectual. de asistentes en múltiples pasos e introduce el JavaScript Las nuevas clases de manipulación de archivos de y la lógica de servidor necesarios para conseguir su fun- configuración mejoran nuestras capacidades para cre- cionamiento. ar asistentes de configuración e instaladores de apli- Existen categorías enteras de nuevos controles como caciones. Ahora existe también una zona concreta den- los relacionados con la seguridad, los portales persona- tro del archivo de configuración que se usa para alma- lizables o la navegación. Estos últimos ofrecen grandes cenar cadenas de conexión a bases de datos, facilitan- facilidades para crear elementos de exploración de la do su acceso. A esto se une la capacidad de ASP.NET estructura de una Web como menús desplegables, árbo- 2.0 para cifrar y descifrar automáticamente zonas ente- les o rutas. De los otros hablaremos dentro de un rato. ras de web.config usando DPAPI, por lo que se mejo- Los controles de usuario ahora son más potentes, ra mucho la seguridad ante el robo de estos archivos. fundamentalmente por dos motivos: su aspecto al utili- zarlos y la facilidad acceder a ellos. Ahora, al emplearlos Controles nuevos y mejorados en alguna página, ya no se muestra un aburrido rectán- gulo gris sin pistas de cómo es el control en realidad. En general todos los controles Web se han mejora- Desde el diseñador de la página veremos el aspecto real do bastante. Ahora devuelven siempre etiquetas com- del control de usuario (figura 3) y podremos redimen- patibles con el estándar XHTML 1.1. Existe una nueva sionarlo y trabajar mejor con él. característica de los controles Web llamada renderiza- Para usar un control de usuario desde cualquier pági- ción adaptativa. Ésta permite que dichos controles se adapten a las características del navegador que solicite la página de un modo mucho más flexible que los contro- les anteriores. Por ejemplo, un mismo control Web se verá correctamente (aunque de forma diferente) en un navegador de escritorio como y en un navegador WAP desde un teléfono móvil si existen direc- Figura 3.Ahora los controles de usuario se muestran con su tivas de renderizado para ellos. También se pueden usar verdadero aspecto en la superficie de diseño de las páginas filtros dependientes del dispositivo en las propiedades por lo que resultan más intuitivos y fáciles de usar. de los controles indicando valores distintos para dife- rentes dispositivos. na ASPX antes había que emplear una directiva <%@ En tiempo de diseño algunos controles muestran un Register %> en cada una de ellas. No es que se trata- panel de tareas adjunto que facilita asistentes y accesos se de un gran problema porque al arrastrar un control directos a sus características más importantes (figura 2). sobre una página, el entorno de Visual Studio lo hacía Gracias a él se acelera mucho el trabajo. automáticamente, pero sí era un engorro si decidía- Existen nuevos controles que mejoran a algunos ante- mos cambiar la definición del control (había que tocar riores, así como controles desconocidos hasta la fecha. todas las páginas) o decidíamos sustituirlo por otro Por ejemplo, el control GridView mejora notablemente (había que retocar o borrar manualmente las directi- al anterior control de rejilla DataGrid y permite hacer vas). En ASP.NET 2.0 se puede definir un control para más cosas con menos código. De hecho, aunque con- su uso directo desde cualquier página registrándolo en troles anteriores de este tipo siguen estando soportados web.config dentro del nodo : ni siquiera aparecen en el cuadro de herramientas. Existen controles nuevos como Wizard, ImageMap o Substitution entre otros que dotan de nuevas capacidades. Por ejem-

Internacionalización Otra gran novedad de ASP.NET 2.0 es la reno- vada capacidad de internacionalización de aplica- ciones que es más fácil que nunca. Podemos con- seguir que los elementos de la interfaz se adapten automáticamente a las preferencias de idioma del navegador de los usuarios creando archivos de

Manía recursos para cada idioma y colocándolos en una Figura 2. Los paneles de tareas disponibles en algunos carpeta especial. controles resultan de gran ayuda para trabajar. dotNet < < 20 << dnm.asp.net

Existen recursos locales (para páginas trata de controles que representan cone- se puede reutilizar la misma página para concretas) y globales (utilizables desde xiones con diferentes tipos de orígenes de hacer uso de los datos de cualquier otra cualquier lugar). Las carpetas especiales información que van desde bases de datos fuente. para ellos son respectivamente App_ a objetos de negocio. No disponen de apa- El comportamiento de los orígenes LocalResources y App_GlobalResources. riencia visual pero se arrastran igualmen- de datos se puede parametrizar a partir Los archivos de recursos tienen extensión te sobre los formularios Web para traba- de casi cualquier cosa: desde valores de .resx y poseen un editor propio (figura 4) jar con ellos visualmente y poder usar sus propiedades de otros controles hasta coo- que permite añadir no sólo cadenas de tex- paneles de tareas. Abstraen al programa- kies o cabeceras HTTP recibidas y por to, sino iconos, imágenes y sonidos espe- dor de las complejidades relacionadas con supuesto directamente por código. cíficos de cada cultura. el manejo de los datos, permitiendo de En el caso de aplicaciones empresa- manera automática seleccionarlos, actua- riales tal vez el origen de datos más inte- lizarlos, ordenarlos, paginarlos, etc. No resante sea el ObjectDataSource. Expone hace falta volver a escribir código los mismos métodos que cualquiera de ADO.NET de bajo nivel más que en cir- los otros pero en lugar de acceder direc- cunstancias muy concretas. tamente a los datos emplea objetos per- ASP.NET 2.0 provee de serie con los sonalizados de capa de negocio para Figura 4. El editor de recursos integrado siguientes tipos de orígenes de datos: hacerlo. de Visual Web Developer. Control Descripción Por ejemplo, para que una página SqlDataSource Enlaza con cualquier base de datos para la que exista un proveedor mipagina.aspx pueda utilizar recursos loca- de ADO.NET. lizados basta con crear un archivo con el AccessDataSource Está especializado en trabajar con bases de datos Microsoft Access. mismo nombre y extensión .resx (sería ObjectDataSource Se enlaza con objetos de negocio y capas personalizadas de acceso a mipagina.aspx.resx) e incluir en ella los datos. distintos recursos del idioma por defecto. XmlDataSource Trata datos contenidos en documentos XML. Para enlazarlo a la interfaz se usa una eti- SiteMapDataSource Se enlaza con la jerarquía de clases expuesta por el modelo de queta especial (resaltada en negrita en este navegación de sitios de ASP.NET 2.0. ejemplo):

A pesar de su nombre, el primero de ellos no sólo se enlaza a bases de datos SQL Server sino que lo hace con cual- skins quier sistema gestor de datos para el que Esto hará que dinámicamente a la pro- exista un proveedor .NET, como Lo más habitual cuando se crea una piedad Text de la etiqueta se le asocie el Oracle, MySQL, o mediante un con- aplicación o un sitio Web es que las pági- valor del recurso de nombre Saludo. Si trolador OLEDB u ODBC. nas que lo conforman sean todas bastante ahora creamos otro archivo de recursos Cuando hemos definido un control parecidas o al menos que existan varios con una extensión adicional para indicar de tipo DataSource en una página bas- grupos de páginas similares que sólo varí- el idioma (por ejemplo, mipagina.aspx.en- ta con asignar su nombre en la propie- an ciertos contenidos entre ellas. En us.resx para el inglés americano) se aso- dad DataSourceID de cualquier control ASP.NET 1.x si queríamos que nuestras ciará el valor del idioma correspondiente que se enlace a datos (casi todos) para páginas dispusiesen de zonas comunes para cuando el usuario lo haya elegido como que funcione. Así de simple. Como conseguir un aspecto COHERENTE preferido en su navegador. todos los controles DataSource sopor- debíamos recurrir a soluciones caseras Para que esto funcione de forma tan las mismas interfaces, sólo con cam- como emplear controles de usuario colo- automática hay que incluir el nodo biar la asignación del origen de datos cados manualmente en todas las páginas siguiente en web.config:

Los temas de ASP.NET son como hojas de estilo Mejoras en el uso de caracte- rísticas de datos que se aplican a controles Web y sus elementos tienen una sintaxis prácticamente idéntica a la de los El nuevo modelo de enlazado a datos desde la interfaz de usuario se basa en el controles cuyo aspecto definen uso de orígenes de datos en lugar de enla- Manía zar directamente con objetos DataSet. Se dotNet < < 21 << dnm.asp.net

ContentPlaceHolder. La sintaxis de este control es NOTA análoga a la siguiente:

Aunque normalmente soy partidario de utilizar los términos en castellano siempre que los haya, en este caso hago una excepción y empleo siempre el término anglosajón Master Pages (o MP) para refe- rirme a esta característica. El motivo es que este Su única propiedad interesante es precisamente término es el más aceptado y el que veremos con su identificador ya que este tipo de control se utiliza más frecuencia y además considero que la traduc- para marcar las posiciones en las que irán los dife- ción “Páginas principales” elegida por Microsoft no rentes contenidos de las páginas derivadas dentro de ha sido la más afortunada. la plantilla de estructura que es una Master Page. []De este modo, cuando una página normal derive de una MP, sólo se podrá introducir código dentro de (cabeceras, laterales y pies, por ejemplo) o bien crear una las zonas definidas por estos comodines de conteni- clase propia heredada de Page que cargase ciertos con- do, permaneciendo las demás inalterables. troles automáticamente. Ninguna de estas soluciones era Al editar una página que deriva de una Master Page realmente buena o estaba exenta de problemas. aparece el aspecto y estructura de la página principal en ASP.NET 2.0 proporciona un modelo nativo y cohe- el diseñador, pero sólo se pueden tocar las partes corres- rente para crear plantillas de páginas que se reutilicen pondientes a los comodines de contenido (vea figura 5). sin esfuerzo entre las páginas de un sitio Web. A esta característica se la denomina Master Pages (MP). Una Master Page proporciona una forma de defi- nir una estructura e interfaz comunes para un grupo de páginas pertenecientes a un mismo sitio Web. Esta estructura común se almacena en un único archivo independiente. Ello facilita mucho su mantenimien- to puesto que, para actualizar todas las páginas que lo utilizan, basta con editar dicho archivo. Una Master Page es en realidad como una página ASPX normal que contiene código, elementos HTML y controles Web de servidor. Sin embargo, poseen una extensión diferente (.master) y utilizan una directiva <% @ master %> en lugar de una directiva <% @ page %>. Figura 5.Al editar una página que hace uso de una Master Page sólo podre- mos modificar aquellas zonas definidas para contenidos en la plantilla. Por lo demás se pueden considerar prácticamente equi- valentes. Esto es importante porque significa que ya sabe- mos todo lo necesario para crearlas. Además las MP se pueden anidar de forma que Una página ASPX normal puede derivar su estruc- unas hereden el aspecto y la disposición de otras, aun- tura a partir de una MP simplemente añadiendo un atri- que en este caso no se podrán usar directamente des- buto MasterPageFile a su directiva de página, así: de el diseñador de Visual Studio .NET 2005. Gracias a las Master Pages podemos definir una <% @ Page Language="C#" MasterPageFile="~/Articulos.master"... estructura común para las páginas de nuestra aplica- ción Web. Sin embargo, aún no hemos resuelto todas Que indica el archivo de página principal que se las cuestiones sobre el mantenimiento de la interfaz utilizará para su estructura. que se presentan normalmente. Los controles que aña- Para agregar una Master Page a nuestro proyecto damos a las zonas de contenido de nuestras páginas sólo hay que elegir el icono “Página Principal” en todavía tendrán el aspecto predeterminado. Podemos el diálogo de agregar nuevo elemento, del mismo configurar su aspecto estableciendo las propiedades de modo que se añade cualquier otro objeto. Al abrir apariencia del control (como BackColor, Font, etc...). El una MP aparece un diseñador idéntico al de una problema que tiene este método es que, si deseamos página ASPX normal. Podemos arrastrar sobre su cambiar por completo la apariencia de estos controles, superficie cualquier control así como editar su tendríamos que tocar una por una todas las páginas. HTML de la manera usual. También lleva un archi- Esta no es una opción admisible en cuanto la aplica- vo de código asociado en el que se puede respon- ción dispone de más de unas pocas páginas. der a sus diversos eventos. La única diferencia apre- Aparte del normal uso de hojas de estilo en cas-

Manía ciable a simple vista respecto a una página normal cada (CSS) que proporciona HTML, ASP.NET 2.0 es que contiene por defecto un control de tipo introduce una interesante novedad que se comple- dotNet < < 22 << dnm.asp.net

menta a la perfección con las Master Pages para sol- El segundo atributo indica el tema que se va a ventar el problema del aspecto: los temas y máscaras aplicar. El entorno de desarrollo nos ofrece de mane- de controles Web. ra automática una lista de temas disponibles al escri- La funcionalidad ofrecida por los temas de bir este atributo por lo que es muy fácil usarlo. Nada ASP.NET 2.0 se entiende fácilmente si los asemejamos más establecer el atributo, la página se personaliza con las hojas de estilo. Los temas de ASP.NET son como siguiendo los dictados de los archivos .skin que haya hojas de estilo que se aplican a controles Web y sus ele- definidos para el tema. Dado que podemos dispo- mentos tienen una sintaxis prácticamente idéntica a la ner de varios temas se puede asignar uno diferente de los controles cuyo aspecto definen. a cada grupo de páginas de una aplicación según las Un tema de ASP.NET 2.0 está formado por uno necesidades. o varios archivos de tipo .skin junto con las imáge- Para no tener que establecer manualmente los nes y hojas de estilo CSS que éstos utilicen, que se temas y las Master Pages a cada página, es posible defi- almacenan dentro de una carpeta con el nombre del nirlos de manera global para un sitio o una carpeta tema y que a su vez está contenida en una carpeta de éste por medio de sendas entradas en el archivo especial de nombre App_Themes. Por ejemplo, la figu- web.config, por lo que se facilita mucho más la tarea ra 6 muestra una carpeta App_Themes que contiene dos en sitios grandes. temas y cada uno de ellos a su vez contiene un archi- vo .skin, hojas CSS y gráficos específicos del tema. Webparts: trocitos de portales

Por si a alguien las nuevas capacidades de perso- nalización y adaptación automática a plantillas le pare- ciesen poco, con esta nueva revisión de la plataforma se incluyen unos nuevos elementos de interfaz de usua- rio realmente impresionantes: los Webparts. Si usted ha visto en alguna ocasión en funciona- miento Sharepoint Portal Server ya sabe a qué me estoy refiriendo. Sí, en efecto, añadir la capacidad de personalizar una página visualmente, arrastrando y Figura 6. Estructura de ejemplo de la carpeta de temas de soltando sus distintos elementos como en Sharepoint una aplicación. En este caso hay dos temas diferentes (white es una capacidad estándar que se ha añadido a y black) cada uno con sus correspondientes archivos de ASP.NET gracias a los Webparts. Y lo mejor es que definición. podemos crear nuestros propios Webparts y reutili- zarlos en otras aplicaciones ASP.NET así como en el Un archivo de máscara contiene definiciones de propio Sharepoint. Aunque la tarea se ha facilitado controles ASP.NET a los que se le establecen valo- mucho sigue siendo algo compleja de habilitar y res de propiedades que serán aplicadas de modo auto- requiere una buena explicación que abordaremos en mático cuando aparezcan en una página que use el un próximo artículo. De momento le dejamos, ami- tema al que pertenece la máscara. Por ejemplo, si un go lector, con la miel en los labios. archivo .skin contiene el siguiente código: Seguridad, control de acceso y personali- Hasta ahora, si queríamos establecer un sistema de seguridad propio ajeno a las características de IIS Conseguiremos que las páginas que lo apliquen dis- o el propio sistema operativo empleábamos autenti- pongan de controles TextBox con el fondo gris claro y cación Forms. En este sistema con ASP.NET 1.x era el borde punteado de 1 píxel de ancho. Al igual que en el propio programador el que debía construir sus pro- las CSS es posible definir diferentes clases para un mis- pios sistemas de almacenamiento, validación y uso de mo tipo de control y aplicarlas selectivamente. perfiles de usuario y roles. Ello implicaba normal- Para que una página se adapte automáticamente mente escribir código de consulta contra bases de a un tema definido en la carpeta App_Themes lo único datos, el cual validaría las credenciales de los usua- que tenemos que hacer es asignar un atributo Theme rios y obtendría los roles de los mismos. Luego se en la directiva de la página, así: creaban objetos de seguridad (Principal e Identity) asig- nándole estos valores y asociándolos al contexto de <% @ Page Theme="MiTema" Language="VB" AutoEventWireup="false" la aplicación. CodeFile="Default.aspx.vb" Inherits="_Default" %> ASP.NET 2.0 nos libera por fin de todo ello y Manía ofrece de serie una completa API de gestión de dotNet < < 23 << dnm.asp.net

usuarios que nos evita tener que rein- Por fin, para la parte de ventar la rueda en cada aplicación. La personalización, esto es, man- clase Membership proporciona una sen- tener las preferencias de los cilla interfaz de programación para visitantes de nuestro sitio sin almacenar y recuperar información complicarnos la vida, se provee sobre los usuarios de nuestras aplica- de un objeto Profile similar a ciones. Lo más interesante de todo es los anteriores y también basa- que, al igual que muchas otras carac- do en proveedores. terísticas nuevas de ASP.NET 2.0, está Se proporciona una com- basada en un patrón de diseño de pro- pleta interfaz de gestión de Figura 8.Aspecto del nuevo control de autenticación veedores, lo que permite cambiar los usuarios, roles y configuración tras aplicarle un estilo de los predefinidos que vienen métodos de trabajo y almacenamien- (figura 7) de la que tenemos el con Visual Web Developer. to sin tocar el código de la aplicación. código fuente y que nos facili- Es decir, abstrae la funcionalidad del ta mucho la vida a la hora de soporte físico utilizado para imple- establecer los datos iniciales de un sitio tenemos libertad de añadir nuevos mentarla. Así, por defecto esta API Web. pasos o modificar los predetermina- utiliza SQL Server 2005 para almace- dos a voluntad. nar toda la información de seguridad En la figura 8 se ve un de una aplicación. Pero dada su arqui- control de autenticación tectura basada en proveedores pode- en pleno proceso de per- mos cambiar el modo de gestión con sonalización estética. sólo un ajuste en el archivo de confi- guración. Incluso, es posible definir En resumen métodos de gestión de usuarios pro- pios sin modificar el código de nues- En este artículo he- tras aplicaciones. Esto nos permite mos tratado de llamar la reutilizar infraestructuras de seguri- atención sobre lo más dad preexistentes que hubiésemos cre- sobresaliente que ofrecen ado para ASP.NET 1.x sin perder el ASP.NET 2.0 y Visual trabajo. Figura 7.Aspecto de la herramienta de configuración de Web Developer 2005 Membership consta de un conjunto de seguridad que viene con ASP.NET 2.0. (que es como se llama la métodos estáticos (compartidos) para parte de Visual Studio poder crear, eliminar y validar usuarios dedicada a desarrollo entre otras cosas. Así, por ejemplo, para Pero tal vez lo más espectacular Web y que está separada de lo demás por crear un usuario escribiríamos: relacionado con la seguridad sean los completo). Aún siendo un texto bastante nuevos controles de seguridad (bauti- extenso para lo habitual en una revista sólo Membership.CreateUser("usuario", "clave") zados como de “inicio de sesión”). hemos rascado un poco la superficie, y nos Estos controles nos dan ya hechas hemos dejado en el teclado muchas cosas Y para validarlo sólo hay que usar su multitud de operaciones comunes de por comentar. Si bien la mayoría son método ValidateUser: seguridad relacionadas con la interfaz pequeños detalles comparado con todo lo de usuario. Por ejemplo, el control visto aquí, todos ellos contribuyen a que Membership.ValidateUser("usuario", "clave") Login permite disponer de un com- el nuevo entorno sea el mejor que hemos pleto diálogo de autenticación con visto nunca, lleno de destellos de calidad Que devuelve verdadero o falso en sólo arrastrarlo sobre un formulario por doquier. función de si las credenciales son o no Web. El CreateUserWizard es un asis- Siga atento a dotNetManía y en los válidas. tente con varios pasos que permite la próximos números iremos desgranando El objeto Roles complementa al creación automática de nuevos usua- para usted con mayor detalle cada una de anterior para permitir la gestión de los rios. El control LoginView permite per- estas novedades. Esperamos que tras leer roles de un usuario y, al igual que aquel, sonalizar lo que ven los usuarios en este texto, como mínimo, esté deseando está basada en el mismo patrón de pro- función de los roles a los que perte- descargar la versión gratuita del entorno veedores. No es necesario utilizar el nezcan. Y todavía hay unos cuantos (Visual Web Developer 2005 Express) para mismo proveedor para los roles que más. Lo mejor es verlos en funciona- empezar a experimentar algunas de las para los usuarios. Por ejemplo, se pue- miento. Son realmente útiles. características comentadas. Puede leer den autenticar usuarios contra una base Todos ellos permiten la personali- sobre ella en el artículo de Sergio de datos SQL Server y obtener los roles zación, tanto parcial por medio de Vázquez. Ahí podrá encontrar también

Manía desde el Directorio Activo o las cuen- propiedades, como absoluta usando una tabla comparativa de versiones. tas locales. plantillas. En el caso de los asistentes Siga sintonizándonos. dotNet < < 24 ern” Hoy díasededicaal terreno”. colabora habitualmentecon oNtaí.EsMCSDen dotNetManía. Ha sidoconsultora “todo programación distribuida gratificante mundo dela Trabaja como Developer o iul C++. con Visual < Reyes García Braulio Díez Braulio Díez < Lo normalcuando de Avanade. docencia. Solutions do lasnovedadesquenostraeASP.NET 2.0. servidores, ampliacionesdeanchobanda…usan- Vamos avercómoahorrarnosuncapitalensuper- las intranetstampocoselibrandeestosmales). vidor seconvierteenalgoconusabilidadcero(¡Ojo! tísima, oinclusoquecuandolanzamoseventosalser- cación alservidorenproducciónyvemosqueeslen- macrotiendas delibros, que acudimostodosenmasa(periódicosonline, es algoreservadoaesospocossitiosdelaredlos y dineroenmejorarelrendimientodelaspáginas, y fluido,conloquepareceesodegastartiempo en unservidordelaredlocal.Todo funcionarápido desarrolle ytesteeenlapropiamáquinaoasumo mos elriesgode quelaaplicacióndejedeser“usable”. una transiciónaotrapágina.Si no hacemosestocorre- usuario sepaquealgoestáenmarcha, einclusohacer algunos eventos,mostraralgún mensajeparaqueel las validacionesposiblesamétodos Javascript,opara puede abusardedichapráctica, hayquemovertodas programar unaaplicaciónWindows! plo: cambiodeselecciónenuncombo),¡eracómo control ASPXauneventoenelservidor(porejem- tó deASP.NET, era la deasociarunaacciónun que soy, unadelascaracterísticasquemásmeimpac- Llamadas fueradebanda con Visual Studio2005enesteárea. vamosaver esteartículo lasnovedades quenostrae zación quetraeincorporada...En nadiesepreocupa endedicaruntiempoaestudiarlamaquinariadeoptimi- manejar, conclusiónquesaquéessi ASP.NETrápido alnotenerartificios.La estanfácilde autor eraquesibien ASP.NET PHPeramás eramuy amigableyorientadoaobjetos, quecomparaba Hace untiempoleíartículo ASP.NET laconclusióndel conPHP, Reyes García El problemallegacuandosubimosnuestraapli- Con elpasodeltiempo,unose da cuentaquenose Como viejodesarrolladordeaplicaciones se creaunaaplicaciónWeb esquese dotnetmania.com Optimización ASP.NET2.0 :-)...). desktop Obervaciones Principal Mejora Sirve Para Llamadas fueradebanda rador recibela respuestadelservidor, actualizarla rio sigatrabajandoconsupágina, ycuandosuexplo- es enviarunapeticiónalservidor, dejarqueel usua- ra debanda para esoASP.NET 2.0incorpora lasllamadas que irenviandoyrecibiendolapáginacompleta?… alguna formadeenviarunapeticiónsimplesintener quiero leerunsimpledatodelservidor!¿Nohay la envíadevueltaalcliente¿¡Como!?,¡perosiyo página entera,elservidorlaprocesadenuevoyse vía siparacadapeticiónquehacemosenviamosla directamente enlamáquinacliente,yaúnmástoda- remoto siempreeslento,comparadocontrabajar es tanlento?Enviarunapeticiónaunservidor o Script callbacks Con unallamadafueradebanda, loquehacemos Todo estomeparecemuybien,pero¿porqué ¡Como unamoto! to paraIE. exploradores, peroenBeta2sóloestabalis- En teoríadebefuncionarparatodoslos sando. la operaciónen Más usabilidad son máspequeños. Round trips na completa. la páginaactual,sintenerqueenviarpági- Ejecutar eventosenelservidoryactualizar (o comodiceneninglés ). : lospaquetesqueseenvían : permitetrabajarmientras background dnm. se estáproce- asp.net Out ofbandcalls fue- 25 <

Páginas asíncronas Otra ventaja de utilizar páginas asín- Sirve Para Extraer temporalmente de la cola de páginas a procesar aquella que esté espe- cronas es que podemos lanzar todas las rando respuestas de procesos asíncronos (ej. llamada a servicio Web, o pro- peticiones asíncronas en paralelo, y que ceso pesado de base de datos). el Framework se encarge de avisarnos Mejora Carga de servidor: al eliminar de la cola de peticiones aquellas que pueden cuando están todas listas, en vez de ir Principal tardar, el servidor puede responder a más peticiones simultáneamente). lanzándolas una a una. Obervaciones Otra ventaja es la de poder lanzar varias tareas asíncronas en paralelo. De la Web de dotNetManía pue- des descargar un ejemplo que procesa de forma asíncrona una llamada a un Para solucionar este problema usa- • Páginas asíncronas: ejecuta las lla- servicio Web de Amazon (en fuente 1 y remos lo siguiente: madas asíncronas, duerme las hebras 2 puedes ver fragmentos del mismo). • Llamadas asíncronas a servicios Web y las incorpora a la cola de hebras, y/o ADO.NET: se dividen en dos cuando todas las llamadas asíncro- Caché 2.0 pasos, un primero BeginInvoke y un nas se han ejecutado. segundo EndInvoke. Cuando subimos una aplicación a producción, una de los detalles que debemos tener en cuenta es el asignar- <%@ Page Language="C#" AutoEventWireup="true" le caché a ciertas páginas y ciertos datos, CodeFile="Default.aspx.cs" Inherits="_Default" Async="true" %> para que el servidor tarde menos en pro- cesar las respuestas, y minimizar el trá- Fuente 1. (ASPX) En la página le añadimos la opción para que sea asíncrona. fico entre nuestra aplicación y el servi- dor de base de datos. ¿Como funciona la caché en ASPX protected void Page_Load(object sender, EventArgs e) 1.1? Básicamente consiste en coger una { página, o un segmento de datos (por // Vamos a realizar una busqueda de libros ejemplo un DataTable que contuviera la KeywordRequest keyword = new KeywordRequest(); lista de delegaciones de nuestra empre- ProductInfo productInformation = null; sa), y en vez de hacer que nuestra apli- // Buscamos todos los libros que tenga que ver con C# cación lea de la base de datos cada vez keyword.keyword = "C#"; que se hiciera una petición, mantener- keyword.mode = "books"; lo en memoria por un tiempo (por ejem- (…) // Iniciamos la busqueda... plo 3 minutos). Esta aproximación hace PageAsyncTask searchTask; que nuestro servidor tarde muy poco en bool executeInParallel = true; // Si hubieran más tareas asíncronas, ejecutarlas en generar una página, ya que lo tiene todo paralelo preparado para montarla o incluso la searchTask = new PageAsyncTask( tiene ya montada. El problema aquí es delegate(Object Source, EventArgs ea, AsyncCallback callback, que, al darle un tiempo fijo de validez a Object State) la caché, si el cambio de unos datos es { crítico para el negocio, tenemos o bien // Arrancamos la llamada al webService return search.BeginKeywordSearchRequest(keyword, callback, State); que no usar caché o darle un tiempo de }, vida muy corto. delegate(IAsyncResult Ar) Si mal no recuerdo, en un sitio Web { de visitas masivas, la página principal la // cuando recibamos respuesta, la procesamos productInformation = search.EndKeywordSearchRequest(Ar); tenían en caché por 5 segundos, lo que hacía que se pudieran responder muchas // Transformar el resultado a DataSet más peticiones, pero… ¿y si pudiéramos DataSet ds = TransformToDataSet(productInformation); mantener dicha caché hasta que real- dgLibros.DataSource = ds; dgLibros.DataBind(); mente cambiaran los datos? Eso mismo }, es lo que incorpora la caché en ASPX null, null, executeInParallel 2.0, dialoga con SQL Server e invalida ); una caché cuando su fuente de datos a // Registramos la tarea para que se ejcute en paraleo cambiado, esto nos lo proporciona de RegisterAsyncTask(searchTask); dos formas: } • Para SQL Server 7.0 y 2000: El siste- ma de caché funciona a nivel de tabla,

y ASP.NET pregunta cada segun- Manía Fuente 2. (.CS, code-behind) Registramos la tarea asíncrona, le decimos que hacer al arrancar y que hacer al finalizar la tarea. dos si ha habido cambios en la tabla dotNet < < 27 << dnm.asp.net

Cache 2.0 Sirve Para Guardar una caché de datos/páginas, que sólo se ASP.NET 2.0 dialoga con SQL Server e invalida una caché refresquen cuando realmen- te haya cambios en la base de sólo cuando la fuente de datos cambia. Con SQL Server datos de la que leemos. 2000 funciona a nivel de tabla, mientras que con 2005 lo Mejora Tiempo de respuesta del ser- Principal vidor: al no tener que ir a hace a nivel de fila y con mayor optimización base de datos cada vez que cargamos una página, y no tener que poner un tiempo ajustado para el refresco de la información, se aprove- chan recursos y se procesan en cuestión (para ello primero hay que • Para SQL Server 2005: Se puede afi- las peticiones de páginas más preparar nuestra base de datos, utili- nar a nivel de fila de una tabla, y rápido. aspnet_regsql zaremos la utilidad que SQL Server, mediante Notification Obervaciones Donde está más optimizada podemos lanzar desde la línea de Delivery Services, es el que nos avisa es bajo SQL Server 2005, si comandos, la consola de Visual Studio cuando los datos han cambiado; esto bien también podemos hacer 2005), ver fuente 3. es mucho más óptimo que el primer uso de ella en 7.0 y 2000.

sistema, pero sólo funciona para esta protected void Page_Load(object sender, EventArgs e) versión del motor de base de datos. { // Ojo, este ejemplo es para SQL Server 2000. Esto sólo // se debe ejecutar una vez, sirve para preparar la base de datos ViewState // para usar caché en una tabla, también se puede habilitar usando la // herramienta aspnet_regsql Una de las características mas valo- radas y odiadas de ASP.NET es, sin //SqlCacheDependencyAdmin.EnableNotifications(@"server=LocalHost; //database=NorthWind;uid=sa"); duda alguna, el "View State". Por un //SqlCacheDependencyAdmin.EnableTableForNotifications(@"server=LocalHost; lado nos permite guardar información //database=NorthWind;uid=sa", "Categories"); sobre el estado y aspecto de nuestros controles, así como información propia // Para testeo, hacemos un select de la tabla "Categories" de la base de datos // "Northwind" (la trae de ejemplo SQL Server) y lo mostramos en un datagrid de la aplicación a nivel de página/esta- SqlConnection conn = new do. Por otro lado, toda está información SqlConnection(@"server=LocalHost;database=NorthWind;uid=sa"); viaja en un campo escondido de la pági- SqlDataAdapter adapter = new SqlDataAdapter("Select * from Categories",conn); DataSet categories = new DataSet(); adapter.Fill(categories); ViewState Sirve Para Almacenar información del // Creamos una dependencia que se dispare cuando la tabla "categories" cambie. estado de los controles de una // "Northwind" es una entrada que hemos creado en el web.config de la aplicación // en la entrada system.web/caching/sqlCacheDependency donde el indicamos el página, así como información // connection string. propia a nivel de página. SqlCacheDependency dependency = new SqlCacheDependency("Northwind", "categories"); El ViewState viaja incrustado // "Cacheamos" la página, y le decimos que mientras no cambie la tabla "categorías" en la página que se envía al // no la recargemos cliente. Response.AddCacheDependency(dependency); Response.Cache.SetValidUntilExpires(true); Mejora El formato en que se graba se Response.Cache.SetExpires(DateTime.Now.AddMinutes(60)); Principal ha optimizado, la informa- Response.Cache.SetCacheability(HttpCacheability.Public); GridCategorias.DataSource = categories; ción de ViewState que ahora GridCategorias.DataBind(); se genera ocupa menos.

// Esto nos sirve para ver que la página es la que estaba en caché. Round trips: los paquetes que // Para ver un cambio, modifica una entrada en la tabla categories se envían son más pequeños. // de la base de datos "NorthWind" (base de datos de ejemplo de SQL Server 2000) Response.Write("Pagina creada el : " + DateTime.Now.ToString()); Obervaciones Para hacer uso de esta mejo- } ra sólo tenemos que compi- lar nuestra aplicación en

Manía VStudio 2005.

Fuente 3. Ejemplo de uso, caché 2.0 dotNet < < 28 << dnm.asp.net

En la versión 2.0 se ha optimizado la serialización del ViewState, llegando a reducirse al 50 % del tamaño generado en la versión 1.1. Para hacer uso del nuevo View State sólo tenemos que recompilar nuestra aplicación

na generada para el usuario, con lo que, si nos des- • Tenemos la opción de no distribuir los ASPX, con cuidamos, el tamaño de nuestra página en Kb se pue- lo que ya no se podría modificar nada, ni la pre- de disparar. Un ejemplo de este caso se da al usar con- sentación de nuestra aplicación. Esto es muy útil troles pesados como el DataGrid. para productos “en caja”. En la versión 2.0 se ha optimizado la serialización La herramienta que nos permite precompilar del ViewState, llegando a reducirse al 50 % del tama- dichas páginas se llama aspnet_compiler, podrá ño generado en la versión 1.1. encontrar ejemplos más detallados en el apartado …Lo mejor de todo esto es que, para hacer uso del de links que sigue. nuevo ViewState, lo único que tenemos que hacer es recompilar nuestra aplicación con Visual Studio 2005. Para saber más Precompilación de páginas Si quiere ampliar información acerca de este tema, aquí tiene unos enlaces que le pueden ser de interés: Con ASP.NET 1.1, cuando nuestra aplicación reci- Llamadas fuera “Script Callbacks in ASP.NET 2.0” be la primera petición, las páginas ASPX son parseadas de banda (Dino Sposito) http://msdn.micro- y precompiladas a código intermedio, con lo que el soft.com/msdnmag/issues/04/08/Cutti tiempo de respuesta de cara al cliente es malísimo. Si ngEdge esto sólo ocurre la primera vez, ¿por qué preocupar- nos.? Bueno seguro que esa primera vez coincide con “Script Callbacks in ASP.NET una demo que estamos haciendo, o con que uno de los 2.0 - interesting, but lacking” gerentes de la empresa tiene acceso para probarlo como http://west-wind.com/weblog/ un piloto, mejor ponerle remedio. posts/2302.aspx ASP.NET 2.0 nos da la oportunidad de precom- pilar los ASPX, con lo que obtenemos las siguientes ventajas: Páginas asíncronas “Async Pages in ASP.NET 2.0” • La primera petición que recibamos se ejecuta igual http://odetocode.com/Blogs/scott/archi- de rápido que cualquier otra. ve/2005/06/16/1656.aspx • Evitamos que aparezcan errores de compilación de páginas en el servidor en producción. “Dimtry Robsman, Tech ed 2005- Asynchronous pages in ASP.NET 2.0” http://blogs.msdn.com/dmitryr/archi- ve/2005/07/05/435647.aspx Precompilación Sirve Para Evitar que las páginas se compilen en la pri- View State “ViewState Encoding in ASP.NET mera petición. 2.0” http://pluralsight.com/blogs/fritz/ archive/2004/06/03/408.aspx Mejora Tiempo de respuesta: Evita el que la pri- Principal mera petición de una página ASPX sea “Whidbey will brings us a shorter muy lenta. viewstate, guaranteed!” http://weblogs.asp.net/vga/archi- Obervaciones También se puede usar para evitar ve/2004/05/26/WhidbeyWillBringsUs exponer el código fuente (ASPX inclui- AShorterViewstateGuaranteed.aspx dos), así como para evitar que aparez- can errores de compilación en el servi- Precompilación “Precompilation in ASP.NET 2.0” dor en producción. de páginas http://www.codeproject.com/aspnet/Pre Manía compile.asp dotNet < < 29 dnm.laboratorio.net

Sergio Vázquez

Visual Studio 2005 Web Developer Express

Este artículo describe brevemente la nueva herramienta Visual Web Developer (VWD) de desarrollo de aplicaciones y servicios Web con ASP.NET 2.0 orien- tada a estudiantes y a profesionales en fase de aprendizaje.

< < Por fin Microsoft ha sacado una versión de Visual Studio de bajo coste destinada a la comunidad de desarrolladores que sin duda va a facilitar su uso y expansión a nivel mun- dial. Son muchos los programadores que echaban en fal- ta una herramienta de este tipo para iniciarse fácilmen- te en ASP.NET. Se prevé que costará unos 49$, aunque inicialmente y de forma indefinida podrá descargarse de forma gratuita (es posible que nunca se cobre su coste). Esta herramienta sustituye y mejora a Web Matrix, el primer entorno de desarrollo gratuito en ASP.NET 1.1 que publicó Microsoft y que no tiene soporte aun- que sí una comunidad de usuarios que la usan. Existen importantes diferencias entre WebMatrix y Visual Studio .NET que serán menores entre las versiones Express y Professional de Visual Studio facilitando así la transición Figura 1. Vista general del entorno. entre ambas versiones. Entre ellas cabe destacar que WebMatrix no tiene Intellisense ni opciones de depura- ción paso a paso, cualidades muy deseables en un entor- Aquí podemos encontrar un tutorial: no integrado de desarrollo y que sí tienen las versiones http://beta.asp.net/QUICKSTART/aspnet/default.aspx Express de Visual Studio. Y una visita guiada con un ejemplo de un sitio Web Es importante indicar que esta herramienta, VWD que usa la base de datos pubs con un control GridView no soporta ASP.NET 1.1 pues está diseñada para la y un ejemplo de Master Pages: http://beta.asp.net/ versión 2.0 del Framework y está pensada para desa- GuidedTour. rrollar en Visual Basic, C# y J#. En la figura 1 podemos ver una imagen general del Diferencias con otras versiones nuevo entorno donde se aprecia la similitud con versio- nes anteriores. Después de instalar Visual Web Developer 2005 Para poder descargarnos la beta 2 podemos acudir Express con SQL 2005 Express Edition vemos las Sergio Vázquez a: http://msdn.microsoft.com/asp.net/getvwd. En castellano siguientes novedades destacables: Sergio trabaja de Consultor E- business en Pangeaes.com. Es ya tenemos muchos recursos: http://www.microsoft.com/ • El entorno de desarrollo trae su propio motor de Ingeniero Superior en spanish/msdn/vstudio/express. base de datos gratuito SQL Server 2005. Informática, MCP y Webmaster Recordemos que la beta 2 es gratuita y no está sopor- • Tiene Intellisense mejorado tanto en el código del sitio Web tada por Microsoft aunque sí existen foros de discusión HTML como en el código ASP.NET en el len- http://www.mutisdotnet.com sobre tecnologías .net.También es sobre el producto (http://forums.asp.net/175/ guaje elegido (Visual Basic, C#, C++ o J#) facili- Vicepresidente del GUSE.NET. ShowForum.aspx). tando así el desarrollo. << dnm.laboratorio.net

Creando nuestro primer sitio Web con ASP.NET 2.0 Este producto es ideal para iniciarse en Una vez que instalamos Visual Studio Web Developer la programacion de aplicaciones Web Express notamos que es bastante similar a Visual Studio con ASP.NET 2.0 y desarrollar rapida- NET y las diferencias son más bien estéticas. Cuando empezamos un nuevo proyecto en el menú “Archivo > mente nuestras webs aprovechando los Nuevo” nos pregunta si crear un nuevo sitio Web, un nuevo servicio Web, un nuevo sitio Web vacío o un sitio nuevos componentes que incluye Web a partir de uno de ejemplo.

• Trae su propio servidor Web incorporado por si no tenemos IIS instalado para ejecutar y probar las páginas Web desarrolladas. • VWD te fuerza a usar el modelo de programación de código subyacente alejándose así más de la for- ma de programar con ASP clásico. • Tiene una utilidad FTP para actualizar y navegar sitios Web de forma remota. • Es una versión de 30 días que requiere registro gratuito que nos permite descargar libros elec- Figura 2. Creacion de un nuevo proyecto Web. trónicos. • Dispone de un asistente para la conversión de pro- yectos de las versiones anteriores de Visual Studio 2002 y 2003. En la ventana de diálogo del nuevo sitio Web pue- • Permite crear Starter Kits o “soluciones predefi- des especificar la localización del sitio Web que pue- nidas” que servirán de esqueleto a nuevas aplica- de ser: ciones pudiendo contener las clases habituales y • Un directorio local de tu PC. componentes con las que trabajamos. • Un sitio Web remoto conectado con las extensio- • Las Master Pages nos permiten crear una nueva nes de servidor de FrontPage. página dentro de nuestro sitio Web que tenga la • Un sitio Web remoto conectado vía FTP. misma estructura con los mismos apartados que las demás como si fueran plantillas. Cuando ejecutas una página, Visual Web • Los skins o temas permiten dar una apariencia a Developer lanza el servidor interno de desarrollo que nuestro sitio web y cambiarla con hojas de estilo acepta solo peticiones HTTP del propio equipo pero de forma sencilla. se puede configurar para que use este mini servidor • Tiene más de una docena de nuevos controles de Web o bien IIS. servidor muy interesantes como: o Password Recovery: recupera su clave de un usua- rio en caso de perderla. o Login: autentifica a un usuario contra la base de datos.

Con respecto a versiones superiores se diferencia en lo siguiente: • Está pensado para estudiantes y desarrolladores noveles. • Las versiones superiores están destinadas a equi- pos de desarrollo grandes para coordinar y dirigir proyectos. • Pueden verse las diferencias con más detalle en la siguiente URL de la Web de Microsoft: Manía http://lab.msdn.microsoft.com/vs2005/productinfo/pro- Figura 3. Ejecución de una página Web. ductline. dotNet < < 31 << dnm.laboratorio.net

EdicionesVisual Studio 2005 Team System1 Professional Standard Express2 Con las versiones superiores de este Coloreo de código e Sí Sí Sí Sí Intellisense producto se puede coordinar un equipo de

Lenguajes:Visual Basic, C#, Individualmente. Sí Sí Sí desarrollo completo asignando tareas a sus C++, J# VWD:VB, C# y J# Excepto con Visual miembros y trabajando en equipo Proyectos Windows Sí Sí Sí Web Dev Únicamente con Proyectos Web Sí Sí Sí Visual Web Dev Proyectos Mobile Sí Sí Sí Preguntas frecuentes acerca de Visual SQL Server Studio Express 2005 Desarrollo con SQL Server Sí Sí Sí Express Edition SQL Server Reporting Services Tools Sí Sí Sí 1.- ¿Puedo tener a la vez en la misma máquina Express Edition Visual Interdev, VS2003 y VS2005 sin problemas? Acceso a Datos Remotos Sí Sí Sí Sí. Diseñadores visuales de 2- ¿Puedo desarrollar aplicaciones para la versión Sí Sí datos 1.1 de ASP.NET? Depuración Remota Sí Sí No, pues cada versión de Visual Studio está desti- Visual Studio SDK Sí Sí nada a una versión diferente del Framework. La version 2005 sólo puede ser usada para crear aplicaciones que se Proyectos Excel,Word e VSTMOS Sí InfoPath 20053 ejecutan en la versión 2.0 del Framework. Si abrimos un Requerirá proyecto de la versión 2003 de Visual Studio, se con- Modelado con Visio Sí MSDN vertirá en otro nuevo con la versión 2005 y permite guar- Premium dar copia de seguridad de la versión anterior. Análisis de Código Sí 3.- ¿Donde puedo encontrar una lista de cambios Herramientas para arqui- que hay entre las versiones 1.1 y 2.0 del Framework? Sí tectos Aquí: http://www.gotdotnet.com/team/changeinfo/ Herramientas para testers Sí Backwards1.1to2.0. 4.- ¿Donde puedo encontrar ayuda y soporte? Administración de proyectos Sí En los foros de ASP.NET en la Web de Microsoft VS 2005 Team Foundation Sí en castellano y en http://forums.asp.net. Server 5.- ¿Qué tipo de aplicaciones puedo construir con SQL Server 2005 Sí la edición Express? Developer Edition Aplicaciones Web con formularios y servicios Web. 6.- ¿Qué beneficios obtengo si registro el producto? 1 Existen variaciones según la edición específica de Team System. 2 Existen variaciones entre los distintos productos Express. Te puedes descargar libros electrónicos gratuitos 3 Visual Studio Tools for MS Office System es un producto independiente. en inglés que puedes ver aquí: http://lab.msdn.micro- soft.com/express/register. Requisitos del Sistema Podéis encontrar más preguntas frecuentes en inglés aquí: http://lab.msdn.microsoft.com/express/faq. Hardware Software Procesador Sistema Operativo Conclusiones Mínimo Windows 2000 SP4 Procesador de tipo Pentium a 600 MHz Windows 2003 Server Recomendado Windows XP SP2 En este artículo hemos visto que con este entorno Procesador de tipo Pentium a 1 GHz Windows Vista integrado que incluye motor de base de datos gratuito, herramienta de desarrollo Web, servidor Web y ejem- Espacio en disco Microsoft ASP.NET 2.0 plos de pruebas, no necesitamos mucho más para poder 500 Mb La instalación completa ocupa 1.3Gb empezar a desarrollar aplicaciones Web con ASP.NET 2.0 que no requieren equipos de desarrollo con rapidez. RAM Si queréis más detalles sobre los Skins, Master Pages Mínimo 128Mb Recomendado 256 Mb y los nuevos controles podéis consultar el artículo de José M. Alarcón. Para desarrollar aplicaciones más gran- Pantalla des y complejas que requieran alta disponibilidad y ren- Mínimo dimiento se encuentran las versiones Standard, Professional 800 x 600, 256 colores Manía Recomendado: y Team System que se describen en el artículo de Javier 1024 x 768, color de alta densidad de 16 bits Izquierdo, responsable de producto en Microsoft. dotNet < < 32

dnm.directo.entrevistas

Marino Posadas

Entrevista a Mike Hernández y Donald Drake Equipo de desarrollo de Visual Studio Tools for Office 2005

Mike Hernández, Community Program Manager de VSTO 2005, y Donald D. Drake,Director del equipo de desarrollo también de VSTO 2005,pasaron por Madrid, con motivo del VSTO Tour 2005,y dotNetManía tuvo la ocasión de entrevistar- les, para pulsar sus opiniones acerca de esta nueva versión.

< < La primera cuestión es si Office se está moviendo en el sentido de pasar a ser una aplicación a integrarse con otras, a ser una plataforma propia con modelos de programación vin- culados con ella. En un cierto sentido podría decirse así. En el sentido de que Office permite hacer la mayor par- te de las cosas que pueden hacerse hoy día en las aplicaciones Windows, dispone de acceso a datos, de mode- los de objetos, de posible conexión a servicios Web, podría decirse que es una plataforma de desarrollo. Sería como una nueva “façade” de cara a ciertos desarrollos corporati- vos. La integración de los nuevos diseñadores de Visual Studio es un Donald D. Drake y Mike Hernández paso más en ese sentido. Al estar basada esta versión en el nuevo CLR 2.0, ¿Puedes explicarnos la diferencia entre Proyectos ¿en qué forma ha afectado a Visual Studio Tools for Orientados a Documentos y Proyectos Orientados a Office (VSTO a partir de ahora) las nuevas caracte- Aplicaciones? rísticas de lenguajes y las extensiones a las librerías Podría decirse que depende de si se trata de per- existentes? sonalizaciones para un documento dado o de proyec- Aprovechamos muchas cosas y ninguna en par- tos genéricos que van producir nuevos documentos, ticular. Existen nuevos tipos y los usamos en gene- o manipular información a partir del código fuente ral, pero nada en particular. Hay un nuevo tipo de interno y las peticiones del usuario. Por ejemplo, los documento, y tenemos extensiones de las Smart proyectos de Outlook, tendrían más que ver con el Tags, pero nada específico que venga de la versión nivel de aplicación. Marino Posadas es asesor técnico y 2.0 del CLR. La tecnología ClickOnce va a ser una de las gran- redactor de ¿Hay algunos tipos de proyectos nuevos, además des innovaciones en el nuevo visual Studio. ¿Existen dotNetManía, MVP de de los ya existentes de Word y Excel? cambios en ese sentido para VSTO? C# y formador de Sí, ahora existen proyectos de tipo InfoPath y No. Hay diferencias en la forma en que funcio- Alhambra-Eidos Outlook. nan los proyectos de VSTO y los de Visual Studio. << dnm.directo.entrevistas

Quizá en la próxima versión, la tecno- Los usuarios mu- logía se integre de forma más clara, pero chas veces son reti- no en la actual versión. centes hacia las nuevas La forma de distribución de las apli- versiones debido a caciones se ha visto extendida de algu- problemas con las na otra forma, para incluir característi- migraciones y las difi- cas de seguridad, por ejemplo utilizan- cultades que surgen de do Active Directory, o sigue usándose los estos procesos. ¿Po- Servidores de Ficheros? déis decir algunas Básicamente, se siguen usando los palabras de esperanza servidores de ficheros para distribuir para aquellos que documentos y DLL a los clientes. Pero quieran realizar mi- se integran con la seguridad de los ser- graciones? Mike Hernández, Community Program Manager de VSTO vidores directamente. Lo mejor que po- Ahora que la seguridad está siendo demos decir es que no se necesita ningún ¿Respecto a Office 12, qué es lo un tema prioritario para la mayoría de tipo de migración. Todo el código crea- que podéis aportar de cara al desarro- empresas y desarrolladores, ¿en qué for- do para la versión anterior, compilará per- llo? ¿Seguirá siendo compatible hacia ma se ha mejorado la seguridad en esta fectamente en esta nueva versión. Hay atrás? versión? cosas que han cambiado para aprovechar Pensamos sacar una nueva beta de VSTO utiliza la seguridad vincu- las nuevas características. Muchas veces, VSTO con la beta de Office 12. Y tras lada al código (CAS: Code access secu- asociadas a novedades del propio Visual eso, tendremos la versión final, con rity) igual que cualquier otro código Studio 2005. Orcas (o Visual Studio 9). De hecho en de .NET Framework. De forma que, ¿Estarán disponibles todas las carac- el PDC mostramos una versión de en ese aspecto, funciona exactamen- terísticas del modelo de objetos de cada Visual Studio Orcas que soportaba te igual a la versión anterior. La segu- aplicación para los distintos proyectos, Office 12. ridad se encuentra vinculada a los de forma sencilla? En conclusión, ¿cuáles diríais que ensamblados y estos necesitan per- Sí todo lo que se presenta en el son los mejores argumentos para ani- misos FullTrust para garantizar los modelo de objetos estará disponible marse a dar el paso a esta nueva ver- accesos. también para los desarrolladores de sión? aplicaciones VSTO, Supongo que todas las novedades de sin limitaciones, a cara al desarrollador vinculadas a Visual través de los PIA Studio 2005, por un lado, y otras carac- (Primary Interop terísticas como la seguridad, producti- Assemblies). Pero van vidad, nuevos controles y entorno mejo- a poderse utilizar rado. Además del soporte de proyectos también los nuevos Outlook, que es una de las cosas que los controles presenta- clientes más nos habían solicitado. dos por esta versión, También habría que citar el nuevo y y también hemos mejorado Modelo de Programación, las añadido un mejor mejoras de los Action Panes, y nuevas modelo de progra- características del los mecanismos de mación vinculado enlace a datos. Donald D. Drake, Director del equipo de desarrollo de VSTO con los Action Panes Digamos que ahora, cualquier pro- y los Smart Tags. gramador que sepa hacer algo con ¿Dispondremos , será capaz de escribir ¿Qué es exactamente el Editor de de facilidades para utilizar las macros aplicaciones VSTO con extrema faci- Manifiestos de Aplicación, del que de tipo VBA? lidad. Además, todos nuestros con- hemos oído hablar? Existe un soporte de macros, pero si troles se comportan como controles La información de metadatos de la pregunta es en el sentido de si se elimi- estándar, con sus propiedades, méto- ensamblado no era sencilla de modifi- na VBA, te diré que no, que VBA estará dos, eventos, etc. car y con este editor permitimos que el disponible bastante tiempo todavía. Lo ¿Se espera nuevo soporte para programador la modifique más fácil y que no se va a hacer es mejorarlo en nin- otras aplicaciones de Office, en el sencillamente. Es información que con- guna forma, eso no tiene sentido. Será futuro? tiene datos como, por ejemplo, a qué posible, eso sí, utilizar los nuevos objetos Sí, en el PDC se anunció el futu- ensamblados está vinculada la aplica- del modelo desde el VBA existente, pero ro soporte para todas las aplicaciones ción, características de distribución, ver- eso es todo. El lenguaje, el entorno, y el de Office, dentro de la siguiente ver- Manía siones, etc. runtime no cambian. sión de VSTO. dotNet < < 35 dnm.lenguajes.csharp

Octavio Hernández

Novedades en el estándar de C#

Este artículo presenta de manera concisa las novedades fundamentales que ofre- ce al desarrollador la nueva versión del lenguaje C#, características que ya estaban implementadas casi completamente en las diferentes versiones beta de Visual Studio 2005 que hemos ido probando hasta la fecha, y que ahora reciben el espaldarazo natural que representa su estandarización.

< < Durante su última reunión, en el pasado mes de junio, la Las nuevas características incorporadas en C# 2.0 Asamblea General de la organización estandarizado- y que se describen en este artículo son: ra ECMA aprobó dos documentos que deberán con- • Genericidad vertirse en referencia obligada para todos aquellos que • Iteradores desarrollamos nuestra actividad profesional alrededor • Tipos valor anulables de .NET: las terceras ediciones de los estándares rela- • Métodos anónimos e inferencia de tipos dele- tivos al lenguaje de programación C# (ECMA-334) y de gados la Infraestructura Común de .NET (ECMA-335) [1,2]. Estos • Declaraciones parciales documentos, que pueden ser descargados gratuita- • Clases estáticas mente del sitio Web de la organización, • Distinta visibilidad de métodos de acceso de http://www.ecma-international.org, constituyen las bases propiedades sobre las que se cimentan las implementaciones de • Calificación mediante aliases estas dos tecnologías incluidas en la versión 2.0 de • Directivas pragma .NET Framework. Genericidad Introducción Sin duda alguna, la más importante de todas las La aparición del lenguaje C# como parte de la novedades presentes en C# 2.0 es la genericidad. Por plataforma .NET representó un hito muy signifi- ello la tratamos más en profundidad en este mono- cativo en lo relativo a la generalización del uso de gráfico con el artículo “Reflexionando” y haciendo las tecnologías de programación más avanzadas de “Reflexión” sobre la genericidad de .NET 2.0, de Miguel la actualidad, y especialmente de las centradas alre- Katrib y Mario del Valle. dedor del desarrollo rápido basado en objetos-com- No es una característica exclusiva de C#; el ponentes. C# logró integrar de una manera armo- hecho de que está implementada a nivel del CLR niosa los principales conceptos que hicieron tan ha hecho posible que Visual Basic 2005 la incluya importantes a lenguajes anteriores como C++, también, al igual que seguramente harán en el futu- Delphi o Java con otros aportes realmente nove- ro otros lenguajes para .NET 2.0. dosos. Superada con creces la prueba de acepta- Se conoce como genericidad (algunas fuentes uti- Octavio Hernández ción que representa cualquier versión 1, la nueva lizan el término genericidad paramétrica) a la posibili- es colaborador habitual versión de C# (que estará implementada al 100% dad de parametrizar clases, estructuras, interfaces o de dotNetManía, Ingeniero en Informática en Visual Studio 2005) nos presenta un lenguaje incluso métodos en función de los tipos de los datos de Sistemas y MVP de mucho más maduro, que ha incorporado a su reper- que estos almacenan y/o manipulan. Por ejemplo, a C#.Actualmente es torio de características toda una serie de noveda- continuación se muestra una posible implementación Director Técnico de des importantes que harán el desarrollo mucho más de una lista enlazada de elementos pertenecientes a Danysoft productivo. un mismo tipo T, el parámetro genérico, que en prin- << dnm.lenguajes.csharp

cipio no se especifica. El código asume Aunque un análisis en profundidad de Iteradores la existencia de otro tipo genérico la implementación de la genericidad en Nodo: C# y el CLR rebasa los límites de este artí- Un iterador es un mecanismo que culo, hay que destacar que se trata de un se define para permitir recorrer los ele- mecanismo diferente de las plantillas (tem- mentos de un tipo contenedor, de for- public class Lista { plates) de C++. De hecho, en Visual C++ ma que un cliente del tipo pueda obte- private Nodo raíz = null; 2005 coexistirán ambas tecnologías. ner una secuencia ordenada de estos. Por supuesto, no será necesario No describiremos en detalle las posibi- public bool EstáVacía() desarrollar desde cero estructuras de lidades que ofrece esta característica, ya { return raíz == null; } public void AgregarAlInicio(T dato) datos como la mostrada anteriormen- que publicamos recientemente un exce- { te para empezar a aprovechar las ven- lente artículo sobre el tema [6]. A modo raíz = new Nodo(dato, raíz); tajas de la genericidad. La librería de de ejemplo, el fuente 3 muestra la pro- } clases de .NET 2.0 añade a los conte- gramación de un iterador para nuestra // otros miembros… } nedores “tradicionales” una amplia lista enlazada genérica. Con una imple- gama de contenedores genéricos, todos mentación como ésa, una aplicación Fuente 1. Fragmento de definición de un ellos dentro del nuevo espacio de nom- cliente podría recorrer los elementos de tipo genérico. bres System.Collections.Generic. una lista del modo que se muestra en el fuente 4. Genericidad restringida La potencia de la genericidad radica Lista listaEnteros = en que permite describir de una manera Una característica adicional de la new Lista(); general estructuras de datos y algoritmos, genericidad que no podemos dejar de dejando sin concretar los tipos de datos mencionar es la posibilidad de establecer // Adición de elementos a la lista… // iterar sobre los elementos de la lista subyacentes para que sean especificados restricciones sobre los tipos parámetros foreach (int i in listaEnteros) más adelante por el usuario del código de los tipos genéricos que definamos. Esto MessageBox.Show(i.ToString()); genérico. Por ejemplo, a partir de la defi- permite garantizar de forma estática que nición anterior, es posible crear y mani- los tipos que se utilicen como argumen- Fuente 4. Iteración sobre los elementos de pular una lista de enteros de la siguiente tos de un tipo genérico satisfagan ciertos una lista. forma: requisitos, o más concretamente, que implementen una interfaz determinada. Tipos valor anulables Por ejemplo, el fragmento de código que { Lista listaEnteros = se muestra en el fuente 3 establece que el Otra de las novedades realmente new Lista(); tipo de los nodos de nuestra lista enlaza- importantes de C# 2.0 es la que abre la da debe implementar IComparable. posibilidad de utilizar el valor null listaEnteros.AgregarAlInicio(4); (Nothing en Visual Basic, nil en Delphi listaEnteros.AgregarAlInicio(3); listaEnteros.AgregarAlInicio(2); class Nodo where T: IComparable .NET, etc.) no sólo para los tipos refe- { rencia, sino también para los tipos valor. // más código… // implementación de la clase… Tradicionalmente, los lenguajes de pro- } } pósito general no han ofrecido ningún soporte en ese aspecto, y se ha hecho Fuente 2. Consumo de un tipo genérico. public class Lista : IEnumerable where T : IComparable necesario utilizar trucos más o menos { “sucios” para indicar un valor nulo o El código cliente del tipo genérico es // implementación de la clase… indefinido para los tipos valor, tales // enumerador quien indica al compilador en la declara- public IEnumerator GetEnumerator() como utilizar un elemento “especial” ción que su lista sólo contendrá elemen- { del dominio (por ejemplo, -1 ó 0 para tos de un tipo de datos concreto, enteros Nodo n = raíz; tipos enteros) o mantener señalizadores en el ejemplo. Gracias a esto, la seguridad while (n != null) booleanos en variables independientes; { de la programación aumenta sensible- yield return n.Dato; técnicas todas que adolecen de incon- mente ya que ahora el compilador es capaz n = n.Siguiente; venientes importantes. Los tipos valor de detectar cualquier intento de manipu- } anulables (la traducción que hemos dado lación incorrecta del tipo genérico. Por } al término inglés nullable types) resuel- IEnumerator IEnumerable.GetEnumerator() otra parte, el rendimiento mejora tam- { ven definitivamente este problema tan bién, ya que se evitan las verificaciones de return GetEnumerator(); antiguo, ofreciendo soporte integrado tipos en tiempo de ejecución y, en el caso } en el lenguaje para la utilización del de los tipos valor, se evita completamen- } valor null con todos los tipos valor. te la necesidad de realizar operaciones de Los tipos valor anulables son real- Manía boxing y unboxing. Fuente 3. Ejemplo de genericidad restringida mente una aplicación sutil de la generi- e implementación de iterador. dotNet < < 37 << dnm.lenguajes.csharp

cidad: se apoyan en el tipo genérico predefinido Métodos anónimos e inferencia de tipos System.Nullable. Internamente, un tipo valor anu- delegados lable combina un señalizador booleano, al que se acce- de mediante la propiedad de sólo lectura HasValue, Los métodos anónimos de C# 2.0 permiten defi- con un campo del tipo valor subyacente, que puede nir delegados “en línea”, en el lugar en que se nece- leerse mediante la propiedad Value. Si HasValue tiene sitan, eliminando así la necesidad de crear un méto- valor false, se considera que el valor de la variable es do o incluso una clase por el simple hecho de que se null. Cuando HasValue es true, la propiedad Value desea crear un delegado. El fuente 6 muestra tres ins- devuelve el valor almacenado. trucciones en las que se agrega un delegado a un even- C# 2.0 incorpora una buena dosis de “azúcar sin- to de tres maneras distintas. táctico” para facilitar la utilización de estos tipos. Un De las tres vías que se utilizan en el fuente 6 para tipo valor anulable se declara añadiendo al nombre agregar un delegado al evento Click de un botón, la del tipo “base” el modificador ?. Por ejemplo, int ? primera es la vía “tradicional” (la única válida en la es la variante del tipo predefinido int que acepta el versión 1 de C#). A continuación, la segunda senten- valor nulo. El lenguaje provee conversiones implíci- cia muestra otra manera de lograr el mismo efecto, tas del literal null y del tipo valor correspondiente a pero evitando la creación explícita de un método gra- un tipo valor anulable. Eso hace perfectamente váli- cias a un método anónimo. Por último, la tercera sen- das las instrucciones que conforman el fragmento de tencia de código muestra un ejemplo de la otra nove- código que se muestra en el fuente 5. dad que se describe en este epígrafe: la inferencia de tipos delegados. En principio, ahora ya no es necesa- { rio crear explícitamente el delegado, sino que el com- int? n = null; pilador se encarga de generarlo automáticamente int? m = 275; cuando le indicamos el método a invocar.

if (m.HasValue) MessageBox.Show("m vale: " + m.Value.ToString()); Declaraciones parciales else MessageBox.Show("m no tiene valor"); En C# 2.0 es posible dividir la implementación de } una clase, estructura o interfaz a lo largo de varios fiche- ros de código fuente. Esta característica puede ser útil Fuente 5. Utilización de tipos valor anulables. de cara a la división del trabajo de programación entre varios miembros de un equipo o a lograr una mejor orga- De entre las diversas aplicaciones posibles de los nización del código fuente. El propio Visual Studio 2005 tipos valor anulables, mencionaremos que pueden ser hace uso de esta característica, separando en dos fiche- especialmente útiles a la hora de encapsular los cam- ros el código generado automáticamente por el diseña- pos de bases de datos SQL que admiten el valor null dor del código y el código introducido por el desarro- durante el desarrollo de la capa de acceso a datos de llador, como puede verse en la figura 1. las aplicaciones corporativas.

private void Form1_Load(object sender, EventArgs e) { // vía "tradicional" this.button3.Click += new System.EventHandler(this.GestorBotón);

// mediante método anónimo this.button3.Click += delegate { MessageBox.Show("¡Hola!"); };

// vía "tradicional", usando la inferencia de tipos delegados this.button3.Click += this.GestorBotón; }

private void GestorBotón(object source, EventArgs e) { Figura 1. El diseñador de Visual Studio 2005 separa en dos MessageBox.Show("¡Hola!"); ficheros el código de los formularios. }

Manía Cada parte de un tipo parcial debe incluir el modi- Fuente 6. Métodos anónimos. ficador partial; éste indica al compilador simplemente dotNet < < 38 << dnm.lenguajes.csharp que pueden existir otras partes del tipo mente el método get, pero limitar la Directivas pragma que deberán ser combinadas. Todas esas visibilidad del método set. La sintaxis partes deberán ser compiladas conjun- necesaria para lograr esto puede verse Por último, #pragma es una nueva tamente, de manera que el compilador también en el fuente 7. directiva del preprocesador de C# 2.0, genere la implementación completa del que puede ser utilizada para indicar tipo. De esto se desprende que las cla- Calificación mediante aliases información contextual al compilador. ses parciales no permiten “extender” Por ejemplo, mediante directivas prag- tipos que ya estén compilados. La posibilidad de definir aliases para ma es posible: espacios de nombres que incorporaba • Activar o desactivar la generación de Clases estáticas C# 1.0 adolecía de ciertas limitaciones diferentes advertencias del compi- a la hora de ayudar a resolver las ambi- lador para el código fuente que sigue Las clases estáticas son una adición güedades potenciales entre identifica- a la directiva. pequeña pero útil al lenguaje C#. Su obje- dores. C# 2.0 añade ahora un nuevo • Indicar optimizaciones a aplicar al tivo es permitir “marcar” explícitamente mecanismo para permitirnos calificar código fuente que sigue a la directiva. (mediante la palabra reservada static) los nombres que usamos en nuestro • Suministrar información que pueda aquellas clases cuyo objetivo es contener código e indicar explícitamente en qué ser utilizada por un depurador. únicamente entidades estáticas (de clase), espacio de nombres debe buscar el com- para que el compilador impida que se le pilador. La sintaxis, que parece inspira- Conclusión añadan por descuido o error miembros de da en C++, es la siguiente: instancia. Ejemplos clásicos de clases de En este artículo hemos descrito las la librería de .NET Framework que sólo :: principales novedades que incluye la ofrecen al programador recursos estáti- 3ª Edición del estándar ECMA del cos son Math y Monitor. puede ser un nombre de alias lenguaje de programación C#, imple- El fuente 7 muestra un fragmento o el identificador global, que indica que mentadas completamente en el com- de código en el que se define una clase el nombre debe ser buscado en el espa- pilador de este lenguaje integrado en estática. cio de nombres global. Hay que seña- .NET 2.0. Agradecimientos public static class Matematicas { El autor desea expresar su agrade- private static double epsilon = 0.1E-6; public static double Epsilon cimiento a Richard Blewett, de { DevelopMentor, por sus útiles acla- get { return epsilon; } // público raciones sobre temas tratados en este private set { artículo. if (value > 0.1E-2 || value < 0.1E-8) throw new Exception("Value out of range"); epsilon = value; Bibliografía } } Estándar ECMA-334, “C# Language 1 public static double Sqrt(double src) [ ] Specification”, 3ra. Edición, Junio 2005 { // cálculo de raíz mediante algoritmo de Newton… Estándar ECMA-335,“Common Language } [2] } Infrastructure (CLI)” 3ra.Edición,Junio 2005

Fuente 7. Clases estáticas y visibilidad de métodos de acceso de propiedades. Lowy J.“Create elegant code with anony- [3] mous methods,iterators and partial classes”, publicado en MSDN Magazine,Mayo de 2004 lar aquí que global no es una nueva pala- Distinta visibilidad de métodos bra reservada del lenguaje, sino un iden- Clark,J.“Introducing Generics in the CLR”, de acceso de propiedades tificador normal, que sólo toma un sig- [4] publicado en MSDN Magazine,Septiembre nificado especial cuando aparece a la de 2003 C# 2.0 permite especificar diferen- izquierda de los ::. Lo mismo ocurre con tes niveles de visibilidad para los méto- partial, yield y otros términos presen- Clark, J.“More on Generics in the CLR”, dos de acceso de lectura y escritura aso- tados en este artículo, que sólo adquie- [5] publicado en MSDN Magazine, Octubre ciados a una propiedad o indizador (pro- ren su significado especial en el contex- de 2003 piedad vectorial). Con esto se satisface to adecuado. El objetivo de esta medi- Katrib M., Del Valle M.,“Enumeradores e una petición de muchos desarrollado- da es mantener la compatibilidad con [6] iteradores en C# 2.0”, publicado en res, puesto que es relativamente fre- C# 2.0 del código desarrollado para la dotNetManía Nº 7, Septiembre de 2004 Manía cuente que se desee exponer pública- versión anterior del lenguaje. dotNet < < 39 dnm.plataforma.net

Mario del Valle Miguel Katrib

“Reflexionando” y haciendo “reflexión” sobre la genericidad de .NET 2.0

La genericidad es un recurso importante de factorización y reusabilidad en la progra- mación y un soporte para estar más protegidos de cometer errores por inconsisten- cia en el uso de los tipos. La inclusión de la genericidad es una de las más atractivas y clamadas novedades del venidero .NET Framework 2.0.

< < La genericidad estará presente en los lenguajes C# y VB y esta- en el uso del tipo comodín object. Así los métodos de rá integrada en el CLR en .NET 2.0. A diferencia de la clases como Stack eran consumidores de parámetros implementación de la genericidad en otros lenguajes y de tipo object y/o tenían a object como tipo de retor- plataformas, el CLR se encargará, durante el proceso de no (fuente 1). compilación JIT, de crear las clases concretas a partir de clases que han sido parametrizadas con tipos. De este modo la genericidad no implica ninguna pérdida de ren- public class Stack { dimiento en ejecución porque el código final ejecutará public void Push(object x) {…} public object Pop() {…} según las especificidades de cada tipo. public object Peek() {…} Los ensamblados en la versión 2.0 del Framework ... han sido enriquecidos con nuevos metadatos para per- } mitir la representación de los tipos genéricos. Consecuentemente las clases de System.Reflection y Fuente 1 System.Reflection.Emit fueron adaptadas para ins- peccionar y generar tales clases. El tema de la genericidad en los lenguajes de pro- Aunque el tipo object resulta ser una buena alter- gramación ha sido ya tratado en la literatura (ver muy nativa para agrupar y definir estructuras que sirvan buen ejemplo en lenguaje Eiffel [1]): La genericidad para objetos de diferentes tipos, beneficiado además en .NET ya fue abordada en un trabajo previo de por la capacidad de boxing-unboxing de .NET que per- dotNetManía [2]. De modo que no es la intención mite de manera transparente tratar a los tipos por object Mario del Valle de este trabajo dar una introducción a la genericidad. valor en la jerarquía de , lo cierto es que por su Es desarrollador del grupo Lo que vamos es a ilustrar cómo usando la reflexión condición de clase base de toda jerarquía provoca el WEBOO e instructor del (reflection) podemos hacer convivir las clases genéri- uso excesivo de casts con la degradación de rendimiento Departamento de Ciencia de la cas, o las clases concretas resultado de la instancia- y la aparición de errores cuando estos casts se hacen Computación de la Universidad de la Habana ción de las clases genéricas, con clases ya existentes inadecuadamente. que no son genéricas, así como reflexionar sobre algu- Por ejemplo, en la línea 4 del fuente 2 se hace un Miguel Katrib nos aspectos de la genericidad que han sido incluidos cast a int del valor que se extrae de la pila para pro- Es Dr.y Catedrático del Depar- tamento de Ciencia de la en el .NET Framework 2.0. vocar una división entera entre 2. Como sólo se adi- Computación de la Universidad cionaron valores enteros (línea 3) el cast es correcto y de La Habana y jefe del grupo El comodín object y la genericidad la división se efectúa correctamente. Sin embargo, en WEBOO. Es un especialista en la línea 5 ocurre un error de cast inválido con el tipo lenguajes de programación y entusiasta de la tecnología .NET y En las versiones previas a la 2.0 la forma más float, pues aunque la asignación de un entero a flo- el lenguaje C#. común de implementar “tipos genéricos” se basaba at es permitida, el fragmento de código (float) << dnm.plataforma.net

stack.Pop() indica al compilador que debe generar en IL código para hacer unboxing a un supuesto obje- to de tipo Single devuelto por el método Pop, pero como el objeto devuelto no es Single sino Int32, el cast no se puede efectuar. El principal problema aquí es que estos errores aparecerán durante la ejecución de la aplicación y no son detectables por el compila- dor de C#.

Stack stack = new Stack(); for (int i = 0; i < 10; i++) stack.Push(i); Console.WriteLine("División entera: {0}",(int) stack.Pop() / 2); Console.WriteLine("División real: {0}", (float) stack.Pop() / 2);

Fuente 2

Si por el contrario usáramos ahora la nueva cla- se genérica System.Collection.Generic.Stack del Framework 2.0 (fuente 3), los resultados serían los siguientes: 1. El compilador no permitirá un código que pase al método Push del objeto asociado a la varia- ble stack ningún parámetro que no sea int. 2. El método Pop devuelve int, luego el cast de la línea 4 es innecesario. 3. El cast a float de la línea 5 no provoca errores, delegate void MouseEventHandler( object sender, pues ahora sólo indica que debe efectuarse una MouseEventArgs args) división real entre el entero devuelto por Pop y o el valor 2. delegate void KeyEventHandler( object sender, KeyEventArgs args)

Stack stack = new Stack(); La única diferencia entre ambos delegates es el tipo for (int i = 0; i < 10; i++) del parámetro args. En el nuevo .NET Framework stack.Push(i); 2.0 se incluye un único delegate genérico Console.WriteLine("División entera: {0}",(int) stack.Pop() / 2); Console.WriteLine("División real: {0}", (float) stack.Pop() / 2); EventHandler donde T debe ser un tipo de herede- ro EventArgs y representa al segundo parámetro (args) que se usa de manera convencional en los eventos de Fuente 3 los controles. Ahora en vez de definir un evento MouseUp como: Por lo que disponer ahora de clases genéricas para public event MouseEventHandler MouseUp; toda esta familia de contenedores reduce la aparición de errores y mejora el rendimiento de las aplicacio- Lo que se hace es: nes con la eliminación de casts innecesarios, además public event EventHandler MouseUp; de aportar mayor claridad al código. Sin necesidad de definir un tipo delegate especí- Replicación de código por falta de gene- fico. Como resultado se tendrá un evento al que se ricidad le podrán anotar métodos como el siguiente: private void MyControl_MouseUp(object sender, Las versiones anteriores del NET Framework MouseEventArgs args) {...} están plagadas de clases que se han tenido que implementar sólo para cambiar el tipo general Además de los casos para eventos como el ejempli- object por tipos específicos. Entre los ejemplos ficado anteriormente, nos encontramos en el .NET más notables podemos mencionar los delegates Framework 1.1 clases como ControlCollection here-

manejadores de eventos (*EventHandler) de los con- deras de CollectionBase y que han definido sus propios Manía troles. Por ejemplo: métodos Add, Remove, etc., sólo para poder lidiar con un dotNet

© Caricatura por Yamil Hernández < < 41 << dnm.plataforma.net

Sin embargo, en C# 2.0, asignacio- nes como las de los dos ejemplos ante- riores no son permitidas, ni se tienen Con el nuevo .NET Framework 2.0 tenemos toda la jerarquía herramientas en el Framework que faci- liten lograr tal efecto. de Collection genérica, de modo que se puede disponer Al menos convendría tener una clase que nos permitiera hacer algo de la clase deseada con toda la eficiencia de usar el tipo como:

directo y sin necesidad de replicar la programación IList controls = Converters.TypeConvert> (button.ControlsCollection);

o tipo específico que represente al tipo de podremos usar en contextos no gené- Control ControlsCollection controls = contenido ( en el caso de ricos, objetos provenientes de la gene- Converters.TypeConvert ControlsCollection) y de este modo no ricidad y lo contrario usar en contex- (new List()); tener que basarse en los contendores gene- tos genéricos objetos provenientes del rales que usan el comodín object. La mundo no genérico? Para de este modo tratar en un con- implementación de todos estos métodos Si ahora disponemos de genericidad texto genérico a los objetos formados se basa de manera similar en delegar en entonces sería deseable poder hacer algo en un contexto no genérico y viceversa. un ArrayList (que sí se basa en object) como: En la siguiente sección veremos cómo toda su implementación y hacer interna- implementar tales conversores. IList controls = mente los cast correspondientes. button.ControlsCollection; Con el nuevo .NET Framework 2.0 De no genérico a genérico y tenemos toda la jerarquía de Collection Si realmente conocemos que viceversa genérica, de modo que se puede dispo- ambas clases ofrecen la misma fun- ner de la clase deseada con toda la efi- cionalidad pero que una basa sus Una forma de resolver la asigna- ciencia de usar el tipo directo y sin nece- métodos en el tipo object y la otra en ción de objetos no genéricos basados sidad de replicar la programación. Sin un tipo genérico. en el uso de object o de algún tipo embargo, el espacio de nombres Por el contrario, también podríamos específico como Control en el caso de System.Windows.Form no ha sido adapta- querer usar objetos de tipos genéricos ControlsCollection a variables defini- do a estas nuevas clases genéricas y sigue adaptados a contextos no genéricos ya das a partir de un tipo genérico es cre- usando tipos como los delegates antes des- existentes haciendo algo como: ando una clase que haga de interme- critos, y otros como ControlsCollection diaria (proxy), como por ejemplo la cla- TapPageCollection ControlsCollection controls = new ControlList y que representan List(); se del fuente 4. colecciones de tipos específicos.

La coexistencia y la transición public class ControlList : IList { private ControlsCollection collection; Disponer ahora de clases genéricas public ControlList(ControlsCollection collection){ aporta mucho, sobre todo en claridad, Debug.Assert(collection != null, "Parameter collection cannot be null"); this.collection = collection; confiabilidad y productividad porque } reduce considerablemente la cantidad public void Add(Control control){ de clases a implementar. Sin embargo, collection.Add(control); la transición al mundo genérico de las } public void Remove(Control control){ clases concebidas sin genericidad no collection.Remove(control); se puede aplicar inmediatamente. Las } aplicaciones desarrolladas en el nuevo public Control this[int index]{ .NET Framework 2.0 tendrán que get { return collection[index]; poder convivir con la existencia de } código anterior a la genericidad. set { Incluso muchas clases no genéricas de collection[index] = value; los anteriores espacios de nombres, } } como el caso ya mencionado de ... System.Windows.Form, aún no tienen un }

Manía nuevo representante genérico en el Framework. ¿Significa esto que no Fuente 4 dotNet < < 42 << dnm.plataforma.net

Note que los métodos delegan su implementación en un objeto de tipo ControlsCollection. De esta forma la asignación puede realizarse de la siguiente manera:

IList controls = new ControlList(button.ControlsCollection);

Análogamente, la asignación en sentido contrario (de un genérico a un no genérico) puede resolverse también usando una clase intermediaria como la del fuente 5. Figura 1. Conversión de objetos de tipos no genéricos a objetos definidos a partir de tipos genéricos. public class ControlList : ControlsCollection { private IList collection; public ControlList(IList collection){ Debug.Assert(collection != null, "Parameter collection cannot be null"); class Converters this.collection = collection; { } ... public override void Add(Control control){ public static T TypeConvert(object source) collection.Add(control); { } TypeBuilder proxyBuilder = CreateType(typeof(T)); public override void Remove(Control control){ FieldInfo sourceField = AddSourceField(proxyBuilder, source); collection.Remove(control); EmitCtor(proxyBuilder, sourceField); } EmitMethods(proxyBuilder, sourceField); public override Control this[int index]{ Type proxyType = proxyBuilder.CreateType(); get { ContructorInfo ctor = return collection[index]; proxyType.GetConstructor(new Type[] {source.GetType()}); } return (T) ctor.Invoke(new object[] { source }); set { } collection[index] = value; } } } ... Fuente 6 }

Fuente 5 Framework 2.0 permite la inspección y emisión de tipos genéricos. El método TypeConvert de la clase Converters pudiera quedar entonces como se muestra Note que la implementación de los métodos es en el fuente 6. exactamente la misma en ambos fuentes, sólo difieren Note cómo aquí se aplica el operador typeof al pará- en el tipo de la variable collection en la que delegan metro genérico T para obtener un objeto de tipo Type (ControlsCollection en el fuente 4 y IList en que se corresponde con el tipo utilizado estáticamente el fuente 5). para instanciar la llamada a TypeConvert (como cuando Siguiendo el patrón de delegación que aplican se hizo Converters.TypeConvert>(b); en estos dos fuentes se puede implementar una clase la figura 1). Usando reflexión el método CreateType crea Converters cuyo método TypeConvert cree dinámi- el AssemblyBuider, ModuleBuilder y TypeBuilder corres- camente el tipo que hará de intermediario entre pondiente a dicho tipo (fuente 7). ambos tipos y que herede del tipo indicado en el parámetro genérico del método TypeConvert. Este método debe devolver un objeto del tipo interme- class Converters diario para asignarlo a la variable correspondiente. { El método TypeConvert es genérico y el tipo de lo ... static TypeBuilder CreateType(Type target) que devuelve es el mismo de su parámetro genéri- { co (fuente 6 y figura 1). AssemblyBuilder assBuilder = new AssemblyBuilder("…"); En un artículo previo en dotNetManía “El Poder ModuleBuilder modBuilder = assBuilder.DefineModule(); de la Reflexión en .NET” [3] ilustramos una forma de TypeBuilder result = modBuilder.DefineType(baseType.Name + "Proxy", target); factorizar clases usando intermediarios emitidos diná- return result; micamente. La implementación de Converters es bas- } tante similar. La diferencia radica en que hay que ins- } peccionar y emitir tipos basados en la genericidad, lo Manía cual será posible gracias a que la reflexión en el Fuente 7 dotNet < < 43 << dnm.plataforma.net

La estrategia que se sigue en la implementación class Converters de EmitMethods para emitir cada método es buscar cada { método abstract o virtual de la clase que se de como ... target static MethodInfo FindImplementation(MethodInfo tipo y por cada uno se busca en la clase que method, Type sourceType) define al tipo del objeto a convertir, algún método que { coincida en nombre y signatura. Si tal método existe, foreach (MethodInfo sourceMethod in sourceType) entonces se emite en la clase Proxy un método que if (method.ToString() == sourceMethod.ToString()) return sourceMethod; redefine al método de la clase target y cuya imple- return null; mentación delega en el método correspondiente del } objeto a convertir (fuente 8). }

Fuente 9 class Converters { ... static void EmitMethods(TypeBuilder proxyBuilder, FieldInfo source) El fuente 10 muestra la implementación del méto- { do EmitMethod. foreach (MethodInfo method in proxyBuilder.BaseType) { MethodInfo sourceMethod = FindImplementation(method, source.FieldType); class Converters if (sourceMethod != null) { EmitMethod(sourceMethod, source) ... } static MethodInfo EmitMethod( MethodInfo mi, } FieldInfo sourceField) } { Type[] argsTypes = getTypesOf(mi.GetParameters()); MethodBuilder methodBuilder = Fuente 8 proxyTypeBuilder.DefineMethod(sourceMethod.Name, MethodAttributes.Public | MethodAttributes.Override, mi.ReturnType, No hay ningún problema porque los parámetros argsTypes); genéricos son completamente sustituidos por el JIT- ILGenerator generator = compiler cuando se instancian con algún tipo especí- methodBuilder.GetILGenerator(); fico. Por ejemplo, el método Add de la interfaz IList generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldfld, realTarget); definido como: for (int i=0; i < argsTypes.Length; i++) generator.Emit(OpCodes.Ldarg, i+1); void Add(T element); OpCode callCode = OpCodes.Call; if (coreMethod.IsVirtual) callCode = OpCodes.Callvirt; Al ser inspeccionado aplicando reflexión sobre el generator.EmitCall(callCode, mi, null); tipo IList será como si originalmente se generator.Emit(OpCodes.Ret); hubiera sido definido: } } void Add(Control element); Fuente 10 Es decir, que si por reflexión se le pide al MethodInfo de este Add su primer parámetro: En el artículo “El Poder de la Reflexión” [3] se explica detalladamente el algoritmo de emisión utili- Type listType = typeof(IList); zado por el método EmitMethod. MethodInfo addMethod = listType.GetMethod("Add"); ParameterInfo[] args = (ParameterInfo[]) Como se puede notar el mecanismo de conver- addMethod.GetParameters(); sión anterior también es aplicable al proceso inver- Type firstArgType = args[0].ParameterType; so, es decir, cuando se va a asignar un objeto de un tipo obtenido por una instanciación genérica a una Se obtiene como resultado en firstArgType el obje- variable de tipo que no se ha basado en la generici- to Type correspondiente a Control. dad. Es decir, el mismo método TypeConvert puede Note que en las líneas anteriores se ha inspeccio- usarse para hacer: nado el método de la misma forma que se hace con ControlsCollection collection a = un tipo no genérico. Por todo esto, la implementa- Converters.TypeConvert(b); ción del método FindImplementation del fuente 8 no tiene que hacer consideraciones especiales respecto

Manía de la genericidad para encontrar los métodos coinci- En este caso es el tipo del objeto b el que sería dentes en signatura (fuente 9). IList. dotNet < < 44 << dnm.plataforma.net

Simulando herencia múltiple class C : A En este caso lo que hay que hacer aho- { mediante la genericidad ra es heredar de A instanciando el pará- protected InnerB b; metro genérico T con el otro tipo del cual public C(...){ A this.b = new InnerB(this); La herencia múltiple es un recurso se quería heredar además de . } ausente en .NET y sus lenguajes. Existen ... diferentes métodos para simular la heren- class C : A {...} public virtual void F(...){ cia múltiple. A continuación mostramos ... A A } cómo podemos simular la herencia múl- Como hereda de podemos public static implicit operator InnerB (C c){ tiple con ayuda de la genericidad y las hacer A unA = new C(); y, por el opera- return c.b; capacidades de reflexión y emisión de dor de conversión implícito, podemos } código. hacer B unB = new C(); class InnerB : B { Supongamos que queremos que una Pero lamentablemente con esto no C c; 1 clase C heredase de dos clases A y B . Una basta como veremos en la sección public InnerB(C c){ forma de simular la herencia múltiple siguiente. this.c = c; es que C heredase de A y que simule la } B public override voif F(...){ herencia de delegando internamente c.F(...); en un objeto de tipo B (fuente 11). La } variable interna b reproduce la funcio- } nalidad de B que C hubiese querido here- La herencia múltiple es un } dar. El operador de conversión implíci- Fuente 13 ta nos permite hacer asignaciones de la recurso ausente en .NET forma B unB = new C(); como si C here- dase de B. y sus lenguajes, pero InnerB tenga redefinido el método F de B delegando su implementación en el méto- podemos simularla con la do F que se defina en C. class C : A Lo que ocurre ahora por detrás del { ayuda de la genericidad protected B b; telón cuando se hace: public C(...){ this.b = new B(...); B unB = new C(...); } ... public static implicit operator B (C c){ Simulando la redefinición de es que se aplica el conversor implí- return c.b; métodos cito que lo que hace es devolver el obje- } to interno b que es de tipo InnerB (que } En una situación de herencia múlti- hereda de B) y que por tanto se puede ple real en la que C heredase de A y B, un asignar a unB que es de tipo B. Fuente 11 método virtual F definido en B puede ser Si ahora se hace entonces unB.F(...) redefinido en C de forma que al hacer: lo que ocurre es que se llama al F defi- Con la genericidad podemos “gene- nido en InnerB que lo que hace a su vez rizar” el patrón anterior. Podemos defi- B unB = new C(); es llamar al c.F(...) lográndose el efec- nir una clase genérica A que sirva para ... to del polimorfismo. todo aquel que quiera heredar de A y de unB.F(...); ¿Podemos llevar esta solución al alguien más (fuente 12) patrón genérico visto anteriormente? se aplique el polimorfismo y se lla- Note (fuente 13) que al redefinir F en me al F redefinido en C. Pero como en C es porque sabemos quién es la clase de class A : A where T : new() el patrón de simulación seguido en el la cual queríamos simular herencia múl- { fuente 11, la variable en la que se dele- tiple (B en este caso) y que sabemos que protected T t; B F F public A(){ ga es de tipo , el al que se seguiría lla- esta clase tiene un . ¿Cómo saber si el this.t = new T(); mando es al de B. tipo con el que vamos a instanciar al pará- } Un patrón de solución es el que se metro genérico T tiene un método F? El public static implicit operator T muestra en el fuente 13. En lugar de dele- recurso de genericidad restringida where (A source){ B return source.t; gar en una variable de tipo lo que se hace de C# 2.0 parece ayudarnos a acercarnos } es definir una clase interna InnerB. El a una solución La idea es no permitir que } método F de C puede ser llamado a partir cualquier tipo pueda usarse para instan- de la llamada al F de B si hacemos que la ciar a la clase genérica sino sólo aquellos Fuente 12 variable b refiera a un objeto de otra cla- que cumplan con las restricciones indica-

se InnerB heredera de B, de modo que das (fuente 14). Manía dotNet 1 El mismo patrón se podría seguir si quisiéramos que heredase de más de dos clases < < 45 << dnm.plataforma.net

class baseType:baseType where T : interface IHasF class A : A constrainType { where T : HasF, new() void F(...); { } Es decir, que si ejecutamos: protected T t; public A(){ class A : A where T : IHasF, new() MultipleInheritance.EmitGenericSubtype( this.t=Converters.TypeConvert(this); { } typeof(A), typeof(HasF)) protected T t; public virtual void F(...) {} public A(){ se generaría una clase genérica equiva- } this.t = new T(); lente a la que se muestra en el fuente 16. } Afortunadamente con la reflexión del ... Fuente 16 } .NET Framework 2.0 podemos emitir clases genéricas a partir de cambios que Fuente 14 Emitiendo tipos genéricos se hicieron en algunas clases como TypeBuilder, que fue enriquecida con De este modo si B implementa IHasF, Aplicar patrones genéricos, como el métodos como: y tiene un constructor por defecto, para que se ha visto en la sección anterior para this.t = new T() GenericParameterBuilder[] que valga hacer el , se simular la herencia múltiple, nos ilustra DefineGenericParameters(string[] names); puede hacer: lo que ahora podemos explotar con la genericidad de .NET 2.0. Sin embargo, Este método permite indicar los class C: A{...} para un desarrollador no avezado esto nombres de los parámetros genéricos del puede resultar difícil y propenso a come- tipo emitido por TypeBuilder. A su vez Se podría ahora intentar completar ter errores. el tipo GenericTypeParameterBuilder, que el resto del patrón genérico que segui- Podría pensarse entonces en desa- hereda de TypeBuilder, permite emitir mos en el fuente 13 para hacer algo rrollar alguna herramienta que auto- cada parámetro genérico. Con su méto- como lo que se indica en el fuente 15. matice la labor de “generar una clase do SetBaseTypeConstrains se pueden Pero lamentablemente esto no es posi- genérica” permitiendo hacer cosas especificar los tipos a los que está res- ble porque en la genericidad del .NET como esta de “multiplicar” nuestra tringido cada parámetro y con el méto- 2.0 no se puede heredar de un tipo que herencia. Digamos que pudiéramos do SetGenericParameterAttributes se pue- sea parámetro genérico2. tener un método: de indicar que el tipo tiene que tener cons- tructor por defecto explícito. class A : A Por razones de espacio no se puede where T : IHasF, new() dar aquí la implementación de este gene- { protected InnerT t; rador de tipos genéricos (el lector inte- public A(){ resado puede descargárselo del sitio de this.t = new InnerT(this); dotNetManía). } public virtual void F(...) {} class InnerT : T { // Error: No se puede heredar de T porque es un parámetro genérico Conclusiones A at; public InnerT(A at){ Invitamos a los lectores de dotNet- this.at = at; Manía a disfrutar de la genericidad que } public override void F(...){ viene con Visual Studio 2005 y el .NET at.F(...); Framework 2.0, a la vez que con ello } puedan potenciar su capacidad de desa- } rrollo. Esperamos con este artículo haber } develado algunos secretos de lo que pue- Fuente 15 de lograrse, otros trabajos deben estar por venir. ¿Y tanto nadar para ahogarse en la ori- class MultipleInheritance lla? podrá preguntarse con razón el lector. { Referencias Lo que nos hace falta es un tipo que here- ... public static Type EmitGenericSubtype( Meyer Bertrand, “EIFFEL The Language”, de de T y que delegue la implementación 1 Type baseType, Type constrainType) [ ] Prentice Hall 1992, ISBN 0-13-247925-7 de sus métodos virtuales en los métodos {...} correspondientes de A. Esto lo podría- } Som Guillermo,“Generics y Visual Basic”, [2] dotNetmanía No 8, Octubre 2004, Ed Netalia, mos solucionar si podemos convertir un España M-3.075-2004 objeto de tipo A en T, que es precisa- que genera dinámicamente y devuel- mente lo que hace el método TypeConvert ve el tipo genérico equivalente a haber del Valle Mario, Katrib Miguel,“El poder de la refle- [3] xión en .NET”, dotNetmanía No 3,Abril 2004, Ed Manía de nuestra clase Converters: definido estáticamente algo como: Netalia, España M-3.075-2004 dotNet 2 < Realmente no conocemos ningún lenguaje que permita algo como esto y debemos reconocer que es C#2.0 quien ha llegado más lejos en términos de genericidad. < 46 Aunque bien que pudiera implementarse permitir algo así ya que a fin de cuentas toda la información está disponible en tiempos de compilación. Suscríbase y llévese el CD Volumen 1 GRATIS Aún está a tiempo

AGOTADO ❑ Nº6 ❑ Nº 7 ❑ Nº8 ❑ Nº9 ❑ Nº10 ❑ Nº11 ❑ Nº12

AGOTADO ❑ Nº13 ❑ Nº14 ❑ Nº15 Nº16 Nº17 ❑ Nº18 ❑ N19

Oferta válida hasta el 31 de diciembre de 2005 o hasta agotar existencias

✃❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 60,00€ IVA incluido y recibir el CD Volumen 1 con los 11 primeros ejemplares en formato PDF de alta calidad de forma gratuita. Si su dirección está fuera de España el precio es de 60,00€ transporte incluido (más información sobre envíos internacionales en www.dotnetmania.com) ❑ Deseo que me envíen los números atrasados marcados por un precio de 6,00€ cada uno. Otros: DATOS DE ENVÍO CIF/NIF...... Empresa ...... Nombre y apellidos ...... Dirección ...... Población ...... Código Postal ...... Provincia ...... Teléfono ...... Fax ...... email ......

DATOS DE FACTURACIÓN (sólo si son distintos a los datos de envío) CIF/NIF...... Empresa ...... Nombre y apellidos ...... Dirección ...... Población ...... Código Postal ...... Provincia ...... Teléfono ...... Fax ...... email ......

FORMA DE PAGO ❑ Usted autoriza a la mecanización Talón nominativo a nombre NETALIA, S.L. de estos datos. El responsable y ❑ Transferencia bancaria a nombre de NETALIA, S.L. a: destinatario de éstos es Netalia, La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia) S.L. Usted tiene derecho a acce- ❑ Domiciliación Bancaria (con renovación automática, previo aviso) der a sus datos, modificarlos y Indique su número de cuenta: cancelarlos cuando lo desee. Sus ❑ Tarjeta de crédito datos no serán cedidos en ningu- ❑ VISA ❑ MASTERCARD na de las formas posibles a terce- ras partes y no se utilizarán más Número de su tarjeta: que para el buen funcionamien- Fecha de caducidad: / (imprescindible) to de su suscripción a la revista dotNetManía y para informar- Firma y/o sello le de las actividades comerciales que realice la editorial Netalia, S.L. Si no desea recibir informa- a de de 2005 ción comercial de dotNetManía ❑ Puede enviar sus datos por Fax al 91 499 13 64, o por teléfono al 91 666 74 77, Netalia, S.L. marque la casilla siguiente o por email a la dirección [email protected], o también puede C/ Robledal, 135 enviarlos por correo postal a la siguiente dirección: 28529- Rivas Vaciamadrid (Madrid) dnm.inicio.dnm.fundamentoslenguajes.vb

Guillermo “Guille” Som Novedades de Visual Basic 2005

Visual Basic 2005 es, sin lugar a dudas, el lenguaje de los incluidos en la nueva versión de Visual Studio que más novedades presenta, tanto en novedades del propio lengua- je como en las características ofrecidas por el entorno de desarrollo. En este artículo comentaremos esas novedades de la forma más clara posible, con idea de que el lec- tor comprenda por qué Visual Basic 2005 se convierte en la elección más productiva de todas las ofrecidas por Visual Studio 2005.

< < Las novedades que encontraremos en la nueva versión de menú “Herramientas>Opciones>Proyectos y Visual Basic, (que a partir de esta versión deja de lla- Soluciones> Valores predeterminados de VB”, tal como marse .NET para pasar a usar la versión de Visual se muestra en la figura 1. Studio), las podemos dividir en tres partes: • Las novedades ofrecidas por el propio lenguaje. • Las novedades ofrecidas por .NET Framework 2.0. • Las novedades ofrecidas por el entorno de desa- rrollo (o editor).

Veamos cada una de estas novedades, aunque en algunas no profundizaremos demasiado, entre otras cosas porque necesitaríamos algo más de las páginas de este especial, y porque otras se tratan en este mismo núme- ro o han sido comentadas en números anteriores. Figura 1.Seleccionar la comprobación estricta del código. Consideraciones previas

Antes de comentar las novedades propias del len- ¿Dónde están mis ficheros? guaje y del entorno de desarrollo de Visual Basic 2005, quisiéramos indicar unas recomendaciones que cual- La segunda es indicar que, debido a cómo se mane- quier desarrollador que quiera tomarse en serio la jan los proyectos y las configuraciones de los mismos en escritura de código con Visual Basic. Visual Studio 2005, hay ciertos ficheros, que aparente- mente han desaparecido, entre ellos el fichero Option Strict On:Ayuda a escribir mejor código AssemblyInfo, las declaraciones de los controles añadi- dos a los formularios y las referencias a los ensamblados La primera de ellas es que seleccione la opción de externos: referencias y referencias Web. comprobación estricta del código, (Option Strict On), Realmente estos ficheros no han desaparecido. En Guillermo “Guille” Som ya que esta opción, a pesar de lo que muchos pien- el caso de la definición de los controles de los for- es Microsoft MVP de Visual Basic san, nos ayudará a evitar muchos errores antes de mularios, estos están en un fichero aparte, de forma desde 1997. Es redactor de dotNetManía, miembro de Ineta compilar el código, ya que aprovecha una de las carac- que aprovecha una de las novedades de VB2005: las Speakers Bureau Latin America, terísticas exclusivas del entorno de desarrollo (o edi- clases parciales. mentor de Solid Quality Learning tor) de Visual Basic: la compilación en segundo pla- Para poder mostrar todos estos elementos que antes Iberoamérica y autor del libro no mientras escribimos. teníamos en el explorador de soluciones, tendremos que Manual Imprescindible de Visual Basic .NET. Para que esta opción esté activada en todos los pro- pulsar en el segundo botón de la barra de herramientas http://www.elguille.info yectos que creemos, debemos seleccionarla mediante el del explorador de soluciones, (ver figura 2). << dnm.lenguajes.vb

ro AssemblyInfo, cosa que antes siempre ocurría, debido a que el código generado por todas las ver- siones anteriores a la 2005 eran totalmente compati- bles con las especificacio- nes comunes del lenguaje, por la sencilla razón de que no disponía características Figura 2. Mostrar todos los archivos Figura 3. Propiedades del proyecto e información que lo hicieran incompati- de un proyecto de VB2005. del ensamblado. ble. Por tanto, si queremos que el compilador com- pruebe dicha compatibili- Como vemos en la figura 2, ese botón “My Project” del explorador de solu- dad con el CLS, debemos añadir la tiene también la misma funcionalidad de ciones (ver figura 2). siguiente línea de código al menciona- las versiones anteriores de mostrar todos do fichero: los ficheros y directorios de la carpeta en Novedades en el lenguaje la que tenemos nuestro proyecto. Además nos muestra algunos de los ficheros con Para poder ofrecer mayor funcio- un símbolo más (+) que nos indica que hay nalidad, el propio lenguaje de Visual Esto hará que el compilador nos algo más. Aunque ese “algo más” que hay Basic se ha visto mejorado con nuevas advierta de esa incompatibilidad en nues- oculto normalmente está generado por el instrucciones, de forma que no sea nece- tro código. Aunque no debemos asus- propio entorno, por tanto, no deberíamos sario acudir a la librería de clases de tarnos por ser “incompatibles”, ya que modificarlos directamente. .NET para poder disfrutar de nuevas esto solamente afectará a los proyectos características. Para ser justos, debemos de tipo Librería de clases (DLL) que que- Propiedades del proyecto: Mejor orga- decir que muchas de las novedades ramos usar con otros lenguajes de .NET, nizado y más asequible incluidas en el propio lenguaje de Visual y si ese lenguaje es C#, podemos tener la Basic 2005 son características que ya certeza de que nuestra DLL será com- Como hemos comentado, muchas de incluía su compañero de viaje C#; esto patible, ya que las características del len- las opciones que el IDE de Visual Basic lo pone a un nivel que antes no tenía, y guaje que hacen a VB2005 incompatible 2005 nos oculta es porque podemos asig- por lo que ha sido muy criticado e inclu- con el CLS son las que han tomado narlas mediante ventanas de propieda- so etiquetado como “lenguaje de jugue- “prestadas” de C#. des, como puede ser la de las propieda- te”. A partir de esta versión de Visual des del proyecto, que ahora tiene una Basic, si bien aún no incluye todas las Tipos numéricos sin signo nueva presentación por fichas que son características que muchos hemos soli- más fáciles de manejar y que recopila citado, podemos afirmar que quién no En toda su historia, el lenguaje otras configuraciones que anteriormen- saque el máximo rendimiento a este len- BASIC nunca ha tenido tipos numéricos te estaban disponibles en otros menús o guaje, no será un problema propio del sin signo, salvo el tipo Byte. En esta ver- en ficheros de configuración. lenguaje, sino una falta de visión de los sión se incluyen todos los que actual- Por ejemplo, los valores contenidos desarrolladores de versiones anteriores mente existen en la plataforma .NET: en el fichero AssemblyInfo están ase- que aún no acaban de adaptarse. Uint16, UInt32 y UInt64. Lo novedoso es quibles desde un cuadro de diálogo que Confiamos que este artículo motive a que se han añadido palabras clave al len- se accede desde la ficha “Aplicación”, aquellos que no se deciden a dar el sal- guaje para representar a esos tipos de tal como podemos ver en la figura 3, en to final. datos: UShort, UInteger y ULong respecti- la que además podemos ver el resto de vamente. También se ha incluido el tipo fichas de configuración, entre ellas la de Compatibilidad con el CLS SByte que es un tipo de datos entero de referencias. 8 bits “con signo”. Para acceder a esta ventana de con- Debido a que algunas de las nove- Todos estos tipos de datos no son figuración, podemos hacerlo de la mis- dades que incluye Visual Basic 2005 compatibles con las especificaciones de ma forma que en versiones anteriores, son características que no están defini- .NET, por tanto, debemos tener cuida- seleccionando el proyecto y bien usan- das en el CLS (Common Language do a la hora de usarlos como valor do el botón secundario del ratón o Specifications), en esta versión el atri- devuelto por una función o propiedad bien desde el menú “Proyecto”, selec- buto que indica que el código usado en o como tipo de datos usado como pará- cionaremos la opción “Propiedades”, nuestra aplicación es compatible con metro de cualquier método. con Visual Basic 2005 también pode- esas especificaciones (CLSCompliant) Para mejorar la lectura, sobre todo Manía mos hacer doble clic en el elemento ya no se incluye por defecto en el fiche- cuando trabajamos con constantes dotNet < < 49 << dnm.lenguajes.vb

numéricas de estos nuevos tipos de datos, podemos usar los nuevos sufijos numéricos (o caracteres de tipos) que se han añadido para dar soporte a estos Visual Basic se ha visto mejorado con nuevas instrucciones, de nuevos tipos. Estos sufijos empiezan con la letra U y pueden ser: US para el tipo forma que no sea necesario acudir a la librería de UShort, UI para el tipo UInteger y UL para el tipo ULong. clases de .NET para poder disfrutar de nuevas características La forma de usarlo sería como se muestra a continuación:

Dim us1 As UShort = 3US Dim ui1 As UInteger = 4UI Dim ul1 As ULong = 5UL La instrucción Continue se puede to u objetos indicados después de Using. usar con cualquiera de los bucles sopor- Esto nos garantiza que siempre se llama- Instrucción Continue tados por Visual Basic: Do/Loop, While y rá al método Dispose, con la ventaja aña- For/Next, usándose de la misma forma dida de que esa llamada al método que Esta instrucción nos permitirá que la instrucción Exit, es decir, para liberará los recursos se hará incluso si se continuar un bucle sin necesidad de continuar un bucle Do/Loop usaremos produce algún error que no tengamos tener que alcanzar el código que hace Continue Do, y para continuar uno del controlado. Using sería equivalente a usar que se repita. Y su utilidad está en que tipo While usaremos Continue While. un Try/Finally, de forma que en el blo- nos evitará usar condiciones para que que Finally llamemos al método Dispose en la repetición del bucle no “pase” El operador IsNot del objeto. Por tanto, los objetos que por una parte del código. Por ejem- podemos usar con esta instrucción deben plo, si tenemos un bucle For y parte Con este operador las condiciones usa- implementar la interfaz IDisposable, que del código contenido en dicho bucle das para comprobar si un tipo por refe- es la que garantiza que dicho objeto ten- no siempre debe ejecutarse, lo que rencia no es de un tipo determinado resul- ga ese método. hasta ahora hacemos es algo como tarán más fáciles de escribir y consecuen- La forma de usar esta instrucción es: esto: temente el código resultante será más legi- Using variable As New Recurso ble. Hasta ahora si, por ejemplo, quería- For... Código a ejecutar Código que siempre se ejecuta mos comprobar si una variable no conte- End Using If Then nía un valor nulo, lo hacíamos así: Código a ejecutar solo si se El ámbito de la variable declarada If Not variable Is Nothing Then ... cumple la condición con la instrucción Using será el propio End If bloque de código. Next Usando este operador, el código En caso de que indiquemos más de Si usamos la instrucción Continue, anterior quedaría de esta forma: un objeto con la misma instrucción, los el seudo-código quedaría de esta forma: tendremos que separa con comas: If variable IsNot Nothing Then... For... Using variable As Recurso, variable2 Código que siempre se ejecuta As Recurso2, variable3 If Not Then Continue For Como podemos comprobar, resulta Código a ejecutar Código a ejecutar solo si se más legible esta segunda forma. End Using cumple la condición Este operador sólo podemos usarlo Next con variables y tipos por referencia. Ya En este caso, definimos dos variables que para los tipos por valor podemos junto a la instrucción Using, además de usar NOTA usar el operador distinto de (<>), que otra variable definida anteriormente. sería el equivalente. Esto mismo, en los viejos Declaración explícita del índice infe- tiempos del GoTo, se solucionaba La instrucción Using rior de los arrays dando un salto desde el IF a la línea en la que está el Next,pero... Esta es una instrucción de bloque, es Los arrays de .NET, y por extensión ¿quién usa ya el GoTo? Nadie,pero decir, el contenido estará definido por la los arrays de Visual Basic 2005, a diferen- Using End Using aún así, en Visual Basic 2005 se instrucción y acabará con . cia de lo que ocurría en Visual Basic 6,0 y Using sigue soportando esta instrucción Después de indicaremos uno o anteriores, siempre tienen el valor cero e incluso utilizando IntelliSense varios objetos que utilizarán algún recur- como índice inferior. Esto en principio no para mostrar la línea a la que se so del sistema. Cuando acabe el código supone ningún problema, al menos si Manía realizará el salto. ¡Así nos va! contenido en el bloque, ese recurso se libe- hemos “cambiado el chip” que teníamos []rará llamando al método Dispose del obje- al usar los arrays de VB6, ya que en esa dotNet < < 50 << dnm.lenguajes.vb

versión podíamos indicar un rango de con la sobrecarga y conversiones, también La decisión de qué es lo que ocurre índices de la forma To se indican algunos consejos de “buen uso”. cuando se suman dos valores de este tipo, . Pero al igual que ocu- Y cómo no tenemos todo el espacio que la tomamos nosotros y es el código que rría en VB6, también podemos declarar sería necesario, veremos sólo unos ejem- utilizaremos dentro de la declaración del arrays sin indicar ese rango de valores, el plos de cómo hacer eso mismo desde operador. En este caso, creamos un nue- problema es que al usar esa forma de Visual Basic 2005. vo objeto a partir del resultado de sumar declarar, en la que sólo se indica un valor, los valores de las propiedades X e Y, y es es que dicho valor representa el índice Definir una sobrecarga ese nuevo objeto el que devolvemos. superior del array, de forma que si tene- Con el resto de operadores haría- mos esta declaración: Lo primero que debemos saber es que mos lo mismo. los operadores que nosotros podemos Y para usar este operador sobrecar- Dim nombres(5) As String definir en realidad son funciones estáticas gado, lo haríamos igual que con cual- o compartidas, es decir, son métodos que quier otro tipo de datos definido pre- Aparentemente estamos declarando siempre están disponibles en el tipo en el viamente en las clases de punto NET, un array con cinco elementos, pero en que lo definimos y siempre devuelven un tal como vemos en el fuente 2. realidad son seis los elementos: desde 0 valor. Pero, en lugar de usar la instrucción Function hasta 5, ambos inclusive. para definirlas, usaremos la nue- Dim p1 As New Punto(10, 15) Para solventar este tipo de declara- va instrucción Operator seguida del ope- Dim p2 As New Punto(22, 33) ciones, que puede ser confusa para los rador que queremos sobrecargar. En el Dim p3 As Punto desarrolladores de C++ o C#, en esta fuente 1 tenemos la declaración de una p3 = p1 + p2 nueva versión de Visual Basic se ha aña- estructura en la que hemos sobrecargado Fuente 2. Uso del operador sobrecargado dido la instrucción (por llamarla de algu- el operador de la suma. del tipo Punto na forma), 0 To, la cual se podrá usar en la declaración de los arrays para que Public Structure Punto Public X As Integer quede más claro que realmente estamos Public Y As Integer definiendo un array con elementos des- de cero hasta el valor indicado después Public Sub New(ByVal x As Integer, ByVal y As Integer) To Me.X = x de , usando el ejemplo anterior, aho- Me.Y = y ra quedaría de esta forma: End Sub

Dim nombres(0 To 5) As String ' Sobrecarga del operador + Public Shared Operator +(ByVal p1 As Punto, ByVal p2 As Punto) As Punto Return New Punto(p1.X + p2.X, p1.Y + p2.Y) Con lo que podemos comprobar que End Operator se consigue mayor claridad. End Structure Fuente 1. Definición de la estructura Punto con sobrecarga del operador + Sobrecarga de operadores aritméti- cos y conversiones personalizadas Como podemos comprobar, la sin- Una cosa importante que debemos taxis usada es: saber es que solamente podremos usar las Esta es otra de las características que sobrecargas que hemos definido, en este Public Shared Operator + Visual Basic ha heredado de los lenguajes (expresión izquierda, caso solo tenemos creada una sobrecarga de la familia C. Con la primera podemos expresión derecha) As Punto de la suma de dos valores de tipo Punto, crear nuestras propias versiones de los por tanto si pretendemos hacer esto: operadores aritméticos y lógicos, de for- Public Shared es porque los operado- p3 = p1 + 15 ma que podamos definir el comporta- res siempre estarán disponibles y deben miento que tendrá, por ejemplo, el ope- pertenecer al propio tipo de datos. Se producirá un error, por la senci- rador suma (+) en una clase o estructura Operator + indica que estamos sobre- lla razón de que no hemos definido qué que nosotros definamos; la segunda nos cargando un operador, en este caso el de es lo que tenemos que hacer para sumar permite indicar cómo se realizarán las con- la suma. un Punto con un entero. versiones de nuestros tipos con respecto Los dos parámetros usados represen- La primera solución será definir esa a otros tipos de datos, ya sean definidos tarán a la expresión izquierda y derecha sobrecarga, es decir, el argumento de la en la propia librería de clases de .NET respectivamente; dichas expresiones pue- izquierda de tipo Punto y el de la dere- Framework o con otros tipos. Del tema den ser de cualquier tipo, pero siempre cha de tipo Integer: de la sobrecarga de operadores y conver- deben representar a un valor de tipo Punto. Punto Public Shared Operator + siones, desde el punto de vista de un desa- El valor devuelto es del tipo , de (ByVal p1 As Punto, rrollador de C#, ya lo vimos en el núme- forma que se genera un nuevo Punto con ByVal i As Integer) As Punto ro 9 de dotNetManía, en ese artículo, el resultado de sumar los dos indicados Return New Punto(p1.X + i, p1.Y) Manía además de explicar todo lo relacionado como argumentos del operador. End Operator dotNet < < 51 << dnm.lenguajes.vb

Pero si lo que pretendemos es con- vertir un tipo Punto a entero, podíamos Mediante la sobrecarga de operadores podemos definir devolver el contenido de la propiedad X; en este caso es conveniente definirla como el comportamiento de nuestros tipos al usar los una conversión explícita, ya que perdere- operadores aritméticos y lógicos mos parte del contenido del punto. La declaración quedaría de esta forma –en el que usamos la instrucción Narrowing, para indicar que estamos “reduciendo” el valor El problema es que con esta sobre- nuestro o del nuestro a otro tipo. de un tipo Punto a uno entero–: carga sólo podemos hacer que el códi- Como sabemos, existen dos tipos de Public Shared Narrowing Operator CType( go anterior funcione, pero este otro vol- conversiones: las implícitas, también lla- ByVal p1 As Punto) As Integer verá a fallar: madas de expansión o promoción, es decir, Return p1.X '+ p1.Y las que usamos sin necesidad de hacer nin- End Operator p3 = 25 + p1 guna conversión de datos, por ejemplo, cuando convertimos un valor Short en uno Y podemos usarla haciendo una con- Porque no hemos definido la sobre- de tipo Integer, estamos “promocionan- versión explícita: carga de la suma de un entero y un tipo do” el valor entero de 16 bits en otro de Punto Dim i As Integer = CType(p3, Integer) (en ese orden). Por tanto, la solu- 32 bits; el otro tipo de conversión es la lla- Console.WriteLine( ción será crear una nueva sobrecarga del mada de reducción y es el tipo de conver- “valor de CType(p3, Integer) = {0}”, i) operador en la que se indiquen los pará- sión que hay que hacer explícitamente, es metros en ese mismo orden. decir, debemos indicar que queremos con- Como lo que estamos haciendo con ¿Y si quisiéramos definir sobrecar- vertir un tipo en otro diferente. Este segun- ese CType es convertir la variable p3 en gas para más tipos de datos? Pues lo mis- do tipo de conversiones se usan cuando se un entero, podemos usar la función de mo... tendríamos que definir dos sobre- puede producir una pérdida de informa- conversión CInt en su lugar, obtenien- cargas para cada uno de los tipos de ción, por ejemplo, si queremos guardar en do el mismo resultado: datos que queramos soportar, cada una una variable de 16 bits el contenido de una Dim i As Integer = CInt(p3) de ellas definiendo el tipo en el “lado” de 32 bits, es muy posible que se produz- correcto de la operación. ca pérdida de información, ya que el valor Tedioso ¿verdad? Efectivamente hacer de 32 bits posiblemente no pueda con- esto sería muy “cansado”, pero afortuna- vertirse en otro de menos capacidad. damente podemos aprovechar una carac- Sabiendo esto, podemos afirmar NOTA terística del compilador de Visual Basic que las conversiones implícitas se harán conocida como promoción de tipos. La pro- siempre que esa conversión no pro- Cuando hacemos sobrecargas de ope- moción de tipos no es ni más ni menos duzca pérdida de información y para radores o conversiones en nuestros pro- que la conversión “automática” de un tipo realizarla no tenemos que indicar nin- pios tipos, al menos uno de los paráme- en otro diferente. Por ejemplo, si tene- guna conversión. Por otra parte, las tros o el tipo devuelto debe ser del mis- mos una variable de tipo Short (entero de conversiones explícitas, que son las que mo que el tipo en el que se declaran,esto 16 bits) y queremos guardar su valor en tenemos que indicar expresamente que es para que no podamos definir operado- otra de tipo Integer (entero de 32 bits), nuestra intención es hacer una con- res o conversiones de tipos de los que no no tenemos que hacer ningún tipo de con- versión entre dos tipos de datos, las tengamos la declaración. versión, ya que el compilador “sabe” cómo usaremos cuando se pueda producir [] convertir un valor Short en un Integer. Y alguna pérdida de información y/o se esta sabiduría la podemos aprovechar pueda producir alguna excepción. nosotros usando otra de las nuevas carac- En Visual Basic las conversiones Conversiones automáticas terísticas de Visual Basic 2005: la conver- implícitas se definen usando la instruc- sión personalizada de tipos. ción Widening en la declaración del ope- Como hemos comentado anterior- rador CType: mente, el compilador de Visual Basic ya sabe cómo hacer ciertas conversiones Definir conversiones de datos Public Shared Widening Operator CType( ByVal x As Integer) As Punto implícitas, por tanto, si le “enseñamos” De la misma forma que podemos Return New Punto(x, 0) cómo hacer una conversión del tipo Punto sobrecargar un operador, podemos End Operator a un entero de 32 bits, Visual Basic sabrá sobrecargar la conversión de datos, par- cómo convertir “automáticamente” un ticularmente la instrucción CType, de En este caso estamos declarando una Punto a un entero de menor capacidad: forma que podamos indicar cómo actua- conversión implícita de Integer a Punto, Dim s As Short = 12 Manía rá el compilador cuando se encuentre con lo cual podemos hacer algo como esto: Dim p5 As Punto = s con una conversión de cualquier tipo al Console.WriteLine(“valor de p5 = {0}”, p5) Dim p4 As Punto = 15 dotNet < < 52 << dnm.lenguajes.vb

Pero si queremos asignar un valor de tipo Long, tendremos que indicarlo explí- citamente, y el compilador lo que hará será convertir ese valor de Long a Integer y pos- Los tipos generics nos permiten crear colecciones teriormente utilizar la sobrecarga que asig- fuertemente tipadas en las que el tipo “real” es na un Integer a un Punto. El código que tendríamos que usar (tal y como tenemos el indicado en el constructor las sobrecargas) sería el siguiente:

Dim l As Long = 12345678901234567890L Dim p6 As Punto = CType(l, Punto) Console.WriteLine(“valor de p6 = {0}”, p6) Debido a esta dualidad de los operado- El problema surgirá, como en este res lógicos, cuando sobrecargamos uno NOTA caso, si el contenido de la variable l es de ellos, debemos sobrecargar también mayor de la capacidad de un entero de el complementario, y en el caso del ope- Es recomendable que siempre que 32 bits, lo que producirá un error de rador igual (y distinto) deberíamos cre- sobrecarguemos los operadores igual y desbordamiento (overflow) en tiempo de ar una sobrecarga del método Equals, distinto, sobrecarguemos el método ejecución. La solución sería, por un lado de forma que también devuelva un valor Equal,aunque,a diferencia de C#,Visual cambiar las opciones de compilación que se ajuste a la forma de comprobar Basic no nos avisará de que no hemos para que no se tengan en cuenta las la igualdad de dos objetos de nuestro realizado esta sobrecarga. En estos excepciones causadas por desborda- tipo de datos. casos, también se recomienda sobre- miento de enteros, o bien, definir la La forma de declarar estos opera- cargar el método GetHashCode. sobrecarga de conversión para que uti- dores es similar a la que ya hemos vis- lice un valor Long en lugar de uno ente- to, aunque, en estos casos, el valor [] ro. Por supuesto, el valor Long indica- devuelto debe ser un valor de tipo do en la declaración del operador lo ten- Boolean, ya que eso es lo que se espe- Operadores IsFalse y IsTrue dríamos que convertir en uno entero, y ra cuando hacemos algún tipo de com- deberíamos hacer nuestras comproba- paración. Estas dos nuevas instrucciones de ciones por si se produce un error de des- Por ejemplo, podríamos definir los Visual Basic 2005 sólo se pueden usar bordamiento. Pero con esta nueva defi- operadores igual y distinto de nuestro para crear sobrecargas, en este caso para nición del operador de conversión nos tipo Punto tal como se muestra en el lis- sobrecargar el comportamiento de nues- aseguramos de que podemos indicar tado del fuente 3. tro tipo cuando debe devolver un valor cualquier tipo entero con signo para que se asigne automáticamente a un valor ' Sobrecarga de los operadores igual, distinto y sobrecarga de Equals de tipo Punto. Lo mismo es aplicable a Public Shared Operator =(ByVal p1 As Punto, ByVal p2 As Punto) As Boolean las conversiones entre tipos Double y Return (p1.X = p2.X AndAlso p1.Y = p2.Y) End Operator Single, si definimos la conversión de Double, el compilador de VB se encar- Public Shared Operator <>(ByVal p1 As Punto, ByVal p2 As Punto) As Boolean gará de hacer la otra conversión. ' Podemos llamar a la sobrecarga de la igualdad Return Not (p1 = p2) End Operator Sobrecarga de operadores lógicos ' Equals nunca debe producir una excepción, ' por tanto, si el argumento no es de tipo Punto, devolvemos False Además de los operadores aritméti- Public Overrides Function Equals(ByVal obj As Object) As Boolean cos, podemos sobrecargar los operado- If TypeOf obj Is Punto Then res lógicos, los que utilizamos para hacer Return Me = CType(obj, Punto) Else comparaciones y, como veremos, tam- Return False bién podemos sobrecargar el comporta- End If miento de nuestro tipo en los casos que End Function tenga que devolver un valor verdadero o Fuente 3. Definición de los operadores igual y distinto falso. Empecemos con los operadores lógicos. Como sabemos, siempre que hace- Como podemos observar en el fuen- verdadero o falso. Estas dos instrucciones mos una comparación, ésta se puede te 3, sólo hemos codificado el operador equivaldrían a sobrecargar los valores hacer de dos formas distintas, por ejem- igual, para el operador distinto, y la True y False para que se adecuen a nues- plo, podemos comprobar si dos valores sobrecarga del método Equals utiliza- tro tipo. Al igual que ocurre con los ope- son iguales, y también podemos hacer mos la definición de la sobrecarga de radores de comparaciones, se deben Manía la comprobación de si son distintos. igualdad. sobrecargar los dos operadores. dotNet < < 53 << 54 dnm. <,>,>=,<,<=, binarios CType Operadores NOTA +, -,*,/,\,&,^,>>, +, -,IsFalse,IsTrue,Not sobrecargar en Visual Basic. p1.X =0 p1.X <>0 , porotraparte,reci- AndAlso OrElse unarios IsTrue Punto signi- p1.Y =0 p1.Y <>0 ( ByVal ( ByVal . y IsFalse p1 Dim col(1).Nombre = col.Add( col.Add(c) Dim qué sonlostipos lidades delavida,elqueleeaúnnosabe todos loslectores.Ysi,poresascasua- mencionar lostipos poradas enelpropio.NETFramework. Basic, sinotambiéndeC#,sonlasincor- que sóloaceptetiposdedatos te 5enelquedeclaramosunacolección Basic, portanto,veamoselcódigofuen- comprender cómoutilizarlosenVisual como recordatorioytambiéndepasopara usar lostipos que seabrevemente. Basic, trataremosesasnovedades,aun- lidad paralosdesarrolladoresdeVisual y comosehaañadidonuevafunciona- anterior sebasabaenlaversiónbeta1, ra hanpasadounosmesesyelartículo culo paraVisual Basic2005hastaaho- revista, perodesdequesepublicóelartí- mismo númeroyenel8deesta tado, estáampliamentetratadoeneste poco, yaque,talcomohemoscomen- rrollador deVisual Basic. generics dotNetManía cargar gratuitamenteelnúmero8de datos enVisual Basic2005,puededes- quiere sabercómousarestostiposde de vistadeldesarrolladorC#,perosi Framework 2.0,aunquedesdeelpunto nueva incorporaciónde.NET artículo quetrataenprofundidadesta WEBOO) hanescritounestupendo Miguel Katrib la manode te, yaqueenestemismonúmeroyde p1 une5 Ejemplodecolección Fuente 5. parausarnuestros tiposencomparaciones , As ¿Quién aestasalturasnohaoído Pero primeroveamoscómopodemos De lostipos As col c Punto) As New Punto) ] desde laperspectivadeldesa- As New New Cliente) generics Mario delValle As Boolean Cliente( As Boolean generics en elquetratamoslos List( valores detipo "Pepe" generics (ambos delgrupo generics , paraquenossirva Of hablaremos muy "Juan" , estádesuer- Cliente) Cliente ? Seguroque generic Cliente , 33) . con y de dos en gado aconvertirlosvaloresalmacena- rendimiento, yaque.NETnoseveobli- valores almacenados. IntelliSense por tanto,nospermiteelusode de datosquealmacenalacoleccióny, ra 4,elcompilador“sabe”cuálestipo zarlos, talcomopodemosverenlafigu- hacer conversionesalahoradeutili- mente lainterfaz tipo usadoseaporreferenciaeimple- generics conrestriccionesparaqueel 6, hemosdefinidounaclasequeutiliza de que sepublicóelartículodelnúmero8 las diferenciasquehansurgidodesde generic nes quepodemoshacerennuestrostipos tricciones lasinstrucciones estos casos,usaremosenlalistaderes- por valorountiporeferencia;para puede indicarsieltiposerun Class mos hacer Los tiposderestricciones quepode- de tipo lizado porlacoleccióncolrealmentees colecciones esqueeltipodedatosuti- compañeros, laventajadeestetipo Public Class ' referenciaeimplementarIComparable ' eltipoindicadodebeserun por ' TipoGenericconrestricciones Figura 4. dotNetManía En elcódigomostradoenfuente En Visual Basic2005,lasrestriccio- Como yahanexplicadonuestros almacenados enlascolecciones une6 Definicióndeunaclase Fuente 6. respectivamente. pueden sercomoenC#,yentre Object Cliente IntelliSense a lahoradeaccederlos y tampocotenemosque , conlocualganamosen UnGeneric( IComparable , tenemosqueyase nos muestra lostipos { Class con restricciones Structure , IComparable}) Of . generic. T generic As _ y << dnm.lenguajes.vb

Dim nBool As Nullable(Of Boolean) Si en lugar de asignar un valor (en este NOTA caso el 15), queremos que devuelva el valor La variable nBool puede contener tres predeterminado para el tipo entero (que Las restricciones las podemos valores: Nothing (o nulo, que indica que es el 0), la asignación anterior la tendre- usar tanto en las declaraciones de no está asignado), True o False (que son mos que hacer así: clases generic como en los métodos los dos valores válidos para los tipos Dim i As Integer = nInt.GetValueOrDefault() que reciban parámetros genéricos Boolean). Como vemos, esto difiere de una variable declarada con el tipo Boolean, la [ ]cual, por defecto, tendrá un valor False, Debido a que la variable nInt en el mientras que al definir la variable con fondo es un tipo entero, podremos usar- Tipos por valor con valores indefinidos Nullable(Of Boolean) tenemos la opción la en las mismas situaciones que el resto (Nullable types) de aceptar un valor indefinido (nulo). Pero de variables Integer, incluso podemos asig- aquí no acaba todo, ya que podemos usar narle valores resultantes de una expresión En este mismo número, en el artícu- las propiedades y métodos de esta estruc- que de cómo resultado un valor entero. lo de nuestro compañero Octavio tura para averiguar si tiene un valor váli- Pero debido a que en realidad no es una Hernández sobre las novedades de C#, do e incluso para asignar un valor por variable Integer sino del tipo Nullable(Of habla sobre estos tipos de datos, y para no defecto en el caso de que aún no tenga un Integer), también podemos asignarle un confundir mucho las cosas, utilizaré la mis- valor válido. valor Nothing con lo que conseguiríamos ma traducción que él le ha dado al origi- Para saber si una variable de tipo ponerla en un estado “anulable”. nal inglés Nullable types: tipos por valor anu- Nullable contiene un valor, podemos usar lables, ya que el uso de tipos por valor con la propiedad HasValue, esta devolverá ver- Conclusiones valores indefinidos resulta un poco largo. dadero si contiene un valor válido para el A diferencia de C#, Visual Basic 2005 no tipo de datos con el que la hemos defini- Realmente son muchas las novedades incluye instrucciones o palabras propias do o un falso si no lo tiene. que incorpora Visual Basic 2005, pero del lenguaje para tratar estos nuevos tipos También podemos usar el método lamentablemente es imposible explicarlas de datos, para ello tendremos que espe- GetValueOrDefault para obtener el valor todas en el espacio dedicado a un artícu- rar a la nueva versión, en la que se incor- contenido en la variable (si no es nulo) o el lo. Afortunadamente en otros artículos de pora una sintaxis parecida a la de C#. que indiquemos. Y debido a que todos los este monográfico sobre la nueva versión Pero como no estamos hablando de tipos por valor siempre tienen un valor pre- de Visual Studio se han tratado otros temas lo que se incluirá en VB, sino lo que se determinado, al usar este método tenemos que de alguna forma también son válidos incluye en la versión que este mismo mes dos sobrecargas, una en la que no se indi- para Visual Basic, como son los distintos se lanza, veremos cómo usar este tipo de ca ningún argumento, en cuyo caso devol- niveles de accesibilidad para los bloques datos, ya que nos resultarán muy útiles verá el valor predeterminado y la otra en Get y Set de las propiedades o las clases particularmente en las aplicaciones con la que indicamos el valor que se utilizará parciales que se ha tratado en el artículo las que accedemos a bases de datos. en el caso de que no esté definido el valor. de las novedades de C#, o las novedades La definición que encontramos en la documentación de Visual Studio nos dice: “Los tipos por valor anulables representan un tipo cuyo valor subyacente es un tipo por valor Los tipos por valor anulables que utilizaremos en Visual Basic al que también podemos asignar un valor nulo como a los tipos por referencia.” será el tipo generic Nullable(Of T),es decir,siempre Los tipos por valor anulables que utiliza- remos en Visual Basic será el tipo generic indicaremos el tipo por valor que queremos que contenga Nullable(Of T), es decir, siempre indica- remos el tipo por valor que queremos que contenga, de forma que, si el valor conte- nido es un valor nulo, indicará que dicho Por ejemplo, si declaramos una varia- en el acceso a datos, que podemos ver en tipo no contiene un valor válido. Y esa es ble de tipo anulable que sea de tipo ente- el artículo de Jorge Serrano, en el que la verdadera validez de este tipo de datos. ro, y en el caso de que el valor que con- nos cuenta las novedades de las aplicacio- Como hemos comentado anterior- tiene sea nulo podríamos indicar en el nes Maestro-Detalle, donde podemos mente esta circunstancia es muy útil cuan- método GetValueIrDefault que devuelva “saborear” algunas de esas novedades y de do trabajamos con valores contenidos en el valor 15, y si tiene un valor válido, que los nuevos asistentes del entorno integra- bases de datos, ya que uno de los estados devuelva dicho valor. Esto lo podemos do. Otro de los temas que tampoco hemos de esos datos puede ser el “indefinido”, es hacer con el siguiente código: tratado es sobre un “objeto” especial y decir, un valor nulo. Dicho valor nulo no exclusivo para los desarrolladores de Visual Dim nInt As Nullable(Of Integer) Manía representa un valor real. Por ejemplo, si ... Basic: My, el cual fue tratado en el núme- tenemos esta declaración: Dim i As Integer= nInt.GetValueOrDefault(15) ro 8 de esta revista. dotNet

En el código de este artículo se incluyen ejemplos de algunas de las novedades que no hemos tenido oportunidad de tratar. < < 55 dnm.lenguajes.vb

Jorge Serrano ¿Maestro-detalle con Visual Basic 2005? ¡Chupado!

Los programadores y usuarios de los entornos de desarrollo de Microsoft están acostumbrados a que los empleados de Microsoft integren en estos entornos,cier- tas funciones que faciliten la tarea del desarrollo a los programadores. Una de esas funciones es la que tiene que ver con la autogeneración de código, algo que a muchos les gusta, y a otros muchos también, les asusta.

< < En mi caso, debo levantar la mano cuando se pregunta en to pertenecerá sólo a 1 familia de productos. voz alta a quien no le gusta estas formas de auto- Extendamos pues esto, a una aplicación genérica generación de código, ya que yo soy de esos cabe- y tendremos la mecánica normal de una aplicación zotas a los que le gusta casi de forma enfermiza, de tipo maestro-detalle. controlar el código que escribe para dotarlo de la Visual Studio 2005 y en su caso Visual Basic calidad y control que quiero que tenga mi código, 2005 Express Edition, nos facilita las herramien- por eso, pienso que no me hace ninguna gracia que tas a través de las cuales podemos generar rápida- un entorno por muy bueno que sea, como efecti- mente una aplicación completa de gestión maes- vamente lo es Visual Studio 2005, me autogenere tro-detalle. cierta parte de código… como que no me da con- fianza, para qué engañarnos. Pero muchas veces, Preparando la base de datos nos podemos sorprender, y eso es lo que me ha pasado a mí con el asistente para la generación de Supongamos que tenemos nuestra base de datos aplicaciones de tipo maestro-detalle en Visual Basic ya preparada. Para no dar muchas vueltas y a modo 2005 Express Edition, motivo por el cuál me he de ejemplo, crearemos dos tablas denominadas decidido a escribir este artículo. tbl_FAMILIAS y tbl_PRODUCTOS. La estructura de estas tablas son las que se muestran en la figura 1 ¿Maestro qué? y figura 2.

Casi todos saben lo que digo cuando hablo de una aplicación maestro-detalle. Si hemos progra- mado en versiones anteriores de Visual Basic, ya sea para la plataforma .NET o no, sabremos que hacer este tipo de aplicaciones nos consume una Figura 1. Estructura de la tabla tbl_FAMILIAS. gran parte de tiempo, recursos, y lo que es más Jorge Serrano importante, dinero. es redactor de dotNetManía. Es Las aplicaciones maestro-detalle buscan rela- Ingeniero Informático y MVP de VB y de .NET.Es Webmaster de cionar unos datos maestros con un conjunto de PortalVB.com y autor de datos detalle. Algo obvio ¿verdad? Imaginemos por diferentes libros y artículos ejemplo, una tabla de familias de productos y su técnicos. Jorge está entre los correspondiente tabla de productos. Induda- mejores profesores y Figura 2. Estructura de la tabla tbl_PRODUCTOS. conferenciantes sobre la blemente, una familia de productos determinada, tecnología .NET de nuestro país. tendrá 1 ó más productos de detalle, y un produc- << dnm.lenguajes.vb

Estas dos tablas, estarán relaciona- Seleccionaremos el origen de los das como por ejemplo, como se mues- datos, que para nosotros será “Base de tra en la figura 3. datos”, y pulsaremos a continuación el botón “Siguiente” dentro del asis- tente. De esta manera, el asistente nos presentará la información relativa a la conexión de datos, como se muestra en la figura 5.

Figura 7. Objetos seleccionados de la base de datos.

Figura 3. Relación de las tablas de tbl_FAMILIAS y tbl_PRODUCTOS. En esta ventana, pulsaremos el botón “Finalizar”. Lo único que tenemos que hacer aho- Nuestra nueva conexión, aparecerá ra, es añadir algunas filas de datos a nues- ahora añadida a la ventana “Orígenes de tras tablas, y así, estaremos ya listos de pre- datos” como se muestra en la figura 8. parar nuestra aplicación maestro-detalle con Visual Basic 2005 Express Edition. Figura 5. Opción de conexión de datos. Primer paso, configuración de la fuente de datos Aquí, podremos seleccionar el botón “Nueva conexión…” para establecer una La primera tarea que deberemos nueva conexión en el caso de no tener- realizar en el entorno de desarrollo, es la creada. En mi caso, tengo creada ya la de configurar la fuente de datos. Para una conexión, por lo que la utilizaré y Figura 8. Origen de datos añadido al entorno. ello, he iniciado una nueva aplicación pulsaré el botón “Siguiente” y pondré Windows con Visual Basic 2005 Express un nombre a esa conexión de la aplica- Edition, y he seleccionado la opción ción con la base de datos como se indi- Nuestra tarea ahora, será la de pre- “Datos > Mostrar orígenes de datos”. ca en la figura 6. parar las tablas del origen de datos con De esta manera, iniciaremos la ven- el objetivo principal, de que éstas se tana de orígenes de datos del entorno, comporten como datos de tipo maes- que será el lugar dentro del cuál confi- tro-detalle. guraremos la fuente de datos con la que vamos a trabajar para crear nuestra apli- Segundo paso, preparación del cación maestro-detalle. origen de datos Dentro de esta ventana, haremos clic con el ratón sobre la opción “Agregar” Hasta ahora, hemos añadido como nuevo origen de datos. De esta forma, origen de datos, una nueva conexión se abrirá el asistente de configuración con la tabla o tablas que queremos que del origen de datos como se muestra en formen parte de nuestra aplicación la figura 4. maestro-detalle, pero todavía no hemos indicado que tabla actuará como tabla Figura 6. Conexión establecida con la maestra y que tabla actuará como deta- base de datos. lle. Eso es justamente lo que haremos a continuación. La tabla maestra para nosotros, En esta ventana, pulsaremos nueva- será la tabla tbl_FAMILIAS, mientras mente el botón “Siguiente”. De esta que la tabla detalle será la tabla manera, accederemos a la ventana que tbl_PRODUCTOS. contiene los objetos de la base de datos, Inicialmente nos centraremos en la y dentro de la cuál desplegaremos las tabla tbl_FAMILIAS, para ello y acudien- tablas y seleccionaremos las tablas que do a la ventana “Orígenes de datos”, Manía Figura 4.Asistente para la configuración hemos creado anteriormente, tal y como desplegaremos los campos de esta tabla de orígenes de datos. se indica en la figura 7. como se muestra en la figura 9. dotNet < < 57 << dnm.lenguajes.vb

Representa los datos volcados den- Windows, la tabla maestra. Para ello, tro de un control DataGrid. arrastraremos y soltaremos la tabla Representa los datos volcados den- tbl_FAMILIAS en el formulario Windows tro de un control estándar como por como se muestra en la figura 12. ejemplo un control TextBox y que reflejaría los datos detalle de la infor- mación. No representa ningún control como tipo de objeto de volcado de los Figura 9.Tabla tbl_FAMILIAS datos. desplegada en el origen de datos. Dentro del menú contextual ante- Figura 12. Insertando los datos rior, seleccionaremos la opción de vol- maestros en el formulario. Observaremos en nuestro caso, no cado de datos dentro de controles están- sólo los campos de la tabla tbl_FAMI- dar o Detalles. LIAS, sino los campos que de otra tabla, De esta manera, tenemos lista nues- Nuestra tabla maestra quedará que por algún tipo de relación están tra tabla o datos maestros, ahora pasa- entonces insertada en nuestro formula- enlazados con esta tabla. remos entonces, a preparar los datos de rio como se muestra en la figura 13. Haremos clic entonces sobre el detalle. Para realizar esta acción, modi- campo FAMILIA_ID primero y sobre el ficaremos en primer lugar y si lo dese- campo DESCRIPCION después, para abrir amos, el tipo de controles que quere- la lista desplegable y seleccionar la mos que se utilicen para mostrar los opción Label como se indica en la campos de las tablas como se indicaba figura 10. en la figura 10 y que es el resultado que puede verse en la figura 11. Figura 13.Tabla maestra insertada en nuestro formulario.

Si observamos el entorno de desa- rrollo, veremos que no sólo se han inser- tado los campos de la tabla tbl_FAMI- LIAS, sino que además, se han añadido varios componentes y controles a nues- tra aplicación. Lógicamente, podemos Figura 11. Modificación de los campos para la tabla de detalle. personalizar y manipular los controles y componentes insertados en el formu- lario, pero ahora mismo, lo que nos inte- A continuación prepararemos esta resa una vez insertada la tabla maestra, tabla para que actúe como tabla detalle. es insertar la tabla detalles. Figura 10. Campos de tipo Label. Para ello, deberíamos seleccionar esta Para ello, arrastraremos y soltare- tabla y seleccionar de la lista desplega- mos ahora, la tabla tbl_PRODUCTOS al for- ble la opción “DataGrid”, que es la mulario de nuestra aplicación. De esta De esta manera, habremos cambia- opción que se utiliza en el entorno de manera, aparecerá en nuestro formula- do el tipo de estos campos, de tipo desarrollo por defecto. rio un control DataGrid que correspon- TextBox a tipo Label. Es decir, serán Una vez que hemos finalizado esto, de con los datos de detalle de nuestra campos que no podremos editar. Al ser deberemos incrustar o insertar los datos aplicación tal y como se muestra en la la tabla maestra, no nos interesa en prin- de las tablas maestro-detalle en nuestra figura 14. cipio que se cambien sus valores, por lo aplicación, que es lo que veremos a con- que hemos optado para que se muestren tinuación. como tipo Label. A continuación, haremos clic sobre Tercer paso, insertando en la tabla tbl_FAMILIAS abriendo nueva- nuestra aplicación los datos mente la lista desplegable que aparece a su costado. Una vez hecho esto, obser- maestro-detalle varemos un menú contextual dentro del Figura 14. Control DataGrid insertado Manía cuál, encontraremos las siguientes Lo primero que haremos será inser- en el formulario de la aplicación. opciones: tar en nuestra aplicación o formulario dotNet < < 58 << dnm.lenguajes.vb

DataSource y dentro de la lista desplega- Ahora bien, el control de navegación ble que aparecerá, deberemos seleccionar de datos BindingNavigator –uno de los la opción correspondiente al campo de controles nuevos del .NET 2.0– contie- Si observamos el código relación entre la tabla maestra y la tabla ne diferentes opciones que nos permiti- detalle, y que en mi caso es el campo rán añadir, modificar y actualizar, borrar generado por el asistente, FK_tbl_PRODUCTOS_tbl_FAMILIAS como se y guardar datos. El control DataGrid tam- indica en la figura 16. bién nos facilitará estas tareas. veremos que se trata de un Aunque nuestra tarea podría haber código bastante limpio concluido aquí, podemos personalizar nuestra aplicación hasta el nivel que deseemos. Por eso, nuestro trabajo pue- de continuar desde aquí, sabiendo que el asistente nos ha ahorrado una gran Lo que Visual Basic 2005 Express cantidad de trabajo. Edition genera en todo esto, es un DataSet tipado con el cuál podremos trabajar en nuestra aplicación maestro-detalle. En nuestro ejemplo, este DataSet tipado lo el control de navegación de encontraremos en la ventana del explora- dor de soluciones con el nombre PRUE- datos BindingNavigator BAS_maestro_detalle.xsd. Figura 16. Seleccionando la De todos los modos, si ejecutamos relación de las tablas maestro- contiene diferentes opciones nuestra aplicación ([F5]), observaremos detalle en el control DataGrid. que los datos maestro-detalle no están aún que nos permitirán añadir, relacionados entre sí como se muestra en Una vez asignada la relación, volve- modificar y actualizar,borrar la figura 15. ¿Qué es lo que falta? remos a ejecutar la aplicación ([F5]) y observaremos que ahora sí, nuestras tablas y guardar datos maestro-detalle están relacionadas entre sí como se indica en la figura 17. Conclusiones

El asistente de generación de aplica- Figura 15.Aplicación en ejecución ciones maestro-detalle nos aporta una mostrando que los datos no están herramienta “amiga” que nos facilita enor- relacionados. memente el tiempo de desarrollo y pues- ta en marcha inicial de una aplicación tipo Evidentemente, relacionar los datos Figura 17. Ejecución final de nuestra maestro-detalle. de ambas tablas. Esto es lo que veremos aplicación maestro-detalle. Aunque el asistente nos proporciona en el siguiente punto. la base de este tipo de aplicaciones, no es menos cierto que a partir de aquí, comien- Cuarto paso, creando la rela- Los detalles finales de nuestra za nuestra tarea real en el desarrollo, pues ción de los datos maestro- es muy común que queramos personali- aplicación maestro-detalle zar el comportamiento de nuestra aplica- detalle ción para realizar diferentes acciones. Ya hemos concluido el trabajo de la Lo que está claro es que hay dos fac- Esta es quizás la tarea más sencilla preparación y programación de nuestra tores a tener en cuenta a la hora de usar de todo el proceso, pero a la vez es la aplicación maestro-detalle, aunque como este asistente. El primero es que nos aho- más importante, ya que nos permitirá hemos podido observar, mucha, mucha rra tiempo, recursos y dinero. El segun- relacionar los datos maestro-detalle para programación no ha habido que digamos. do por si no fuera ya importante el pri- mostrarlos con cierta lógica. Si observamos el código generado mero, es que el código generado por este Accederemos a los datos de detalle por el asistente, veremos que el código asistente es limpio, y los retoques que de la tabla PRODUCTOS haciendo clic sobre insertado no contiene instrucciones o habría que hacer no son pesados pues el el control DataGrid y desplegando la acciones fuera de lugar de lo que sería código creado por el asistente a mi modo ventana de “Propiedades” ([F4]). una aplicación maestro-detalle realiza- de ver, es un código muy ordenado, lo cuál

Dentro de la ventana de “Propie- da por nosotros mismos. Se trata de un se relaciona nuevamente con el primer Manía dades”, deberemos acudir a la propiedad código bastante limpio. factor de tiempo, recursos y dinero. dotNet < < 59 dnm.plataforma.net

Luis Miguel Blanco

El IDE de Visual Studio 2005

El advenimiento de Visual Studio 2005 trae de la mano, como ya es habitual en este producto, un notable conjunto de novedades y mejoras, encaminadas como siempre, a simplificar el desarrollo de aplicaciones y aumentar la productividad del programa- dor.En este artículo hacemos una revisión de las más destacadas.

< < La renovación de nuestro banco de trabajo Y cuando decimos las más destacadas, además hemos de puntualizar que realmente vamos a abor- dar sólo aquellas características que efectivamente despuntan como novedad o mejora relevante, ya que tal es el cúmulo de innovaciones, que posible- mente nos harían falta varios artículos para deta- llarlas todas. Dado que podemos abordar este tema desde dife- rentes perspectivas, nos hemos decidido a detallar los Figura 1 nuevos aspectos del IDE de Visual Studio 2005 (VS2005 en adelante) siguiendo aproximadamente el ritmo que nos marcaría el trabajo con un proyecto vo reside en que ahora VS2005 separa totalmente Visual Basic de tipo Windows, es decir: creación del este tipo de proyectos del resto. Si queremos crear proyecto, diseño del interfaz visual, escritura del códi- una aplicación ASP.NET, tendremos que elegir la go y depuración. opción de menú “File > New > Web Site”, apare- Y ya sin más dilación vamos a entrar en materia, ciéndonos el diálogo específico para la creación de que hay muchas cosas que contar. proyectos Web: “ASP.NET Web Site”, “Web Service”, etc. En este diálogo también seleccionare- Creación de proyectos, configuración y mos el lenguaje de programación a utilizar, e inclu- ajustes del IDE so si queremos que el sitio Web sea creado al modo clásico, usando IIS, o en una ruta de archivos, con El modo de creación de un proyecto ha variado lo cual se hará uso de un servidor Web virtual, lo que ligeramente en VS2005. Ahora, el cuadro de diálogo nos libera de la obligación de tener instalado IIS en de “nuevo proyecto” agrupa dentro de cada lenguaje la máquina de desarrollo. diversas categorías de plantillas de proyecto en fun- Una vez creado el proyecto, debemos detener- ción de las aplicaciones que tengamos instaladas en nos en su mejorado acceso y manipulación de pro- nuestra máquina, pudiendo elegir desde la clásica apli- piedades, las cuales se muestran en una completísi- Luis Miguel Blanco cación Windows, hasta la novedosa Windows ma ventana que las organiza en una serie de pesta- es redactor de dotNetManía. Es Presentation Foundation (más conocida como Avalon). ñas, desde las que podemos configurar todos los consultor en Alhambra-Eidos.Ha escrito varios libros y decenas de Ver la figura 1. aspectos necesarios: nombre de ensamblado, for- artículos sobre la plataforma El lector se preguntará a buen seguro dónde han mulario inicial y de presentación, referencias, recur- .NET (lalibreriadigital.com) ido a parar las plantillas para proyectos Web. El moti- sos, etc. Ver la figura 2. << dnm.plataforma.net

mitiéndonos tener desplegada más de a revestir problema, puesto que al mover una categoría al mismo tiempo. una ventana aparecerán los indicadores de Por otro lado, a la hora de alinear los posicionamiento que vemos en la figura controles en la superficie del formulario, 5; simplemente con situar la ventana sobre contamos con unas estupendas guías visua- uno de ellos, quedará colocada en su nue- les, que facilitan en gran medida su orga- vo emplazamiento. nización, y evitarán en muchos casos el uso de las opciones del menú “Format”. Mejoras en el editor de código También se van a ver reducidos nues- tros “viajes” a la ventana de propiedades Son las más importantes con dife- gracias a los Smart Tags (Etiquetas rencia, ya que el trabajo que dedicamos Inteligentes) que acompañan a muchos de a la escritura de código, normalmente Figura 2 los controles, y que vienen representados representa el porcentaje más alto de por un pequeño icono en forma de flecha, nuestro tiempo global de desarrollo. en la parte superior derecha del control. En primer lugar, si abrimos el edi- Una de las novedades importantes a Al pulsar dicha etiqueta, aparecerá un tor para ver el código de la clase del for- nivel de configuración del IDE, consiste pequeño diálogo con las operaciones más mulario, notaremos la falta del código en la capacidad de poder guardar todos frecuentes que se realizan sobre el con- generado por el diseñador, el cual se los ajustes establecidos en el entorno de trol, pudiendo efectuarlas “in situ”. La encuentra ahora dentro de una clase par- trabajo dentro de un archivo en formato figura 4 muestra un ejemplo del diseña- cial, en un archivo aparte con una deno- XML con extensión .VSSETTINGS. dor de formularios. minación del estilo NombreFormulario. Empleando el menú “Tools > Import and Designer.VB, lo cual nos Export Settings” realizaremos esta ope- proporciona una mayor ración mediante un sencillo asistente, con claridad y limpieza de lo que podremos llevar nuestra configu- código. Este archivo se ración favorita a otra máquina, evitando encuentra oculto en el el tedioso trabajo de tener que volver a explorador de soluciones, configurar todo manualmente. La figura por lo que debemos pul- 3 muestra este asistente. sar el botón para mostrar todos los archivos de la solución. Una característica Figura 4 largamente demandada en Visual Basic ha sido la Otro de los aspectos incómodos en el posibilidad de incluir comentarios trabajo con el IDE, residía en el cambio XML, al estilo de C#, que nos permi- de posición y acoplamiento de las dife- tan documentar adecuadamente el códi- rentes ventanas que lo componen, ya que go. Pues bien, nuestro deseo se ha hecho en algunos casos era realmente difícil realidad, ya que ahora, al escribir tres depositar una ventana en el lugar desea- comillas simples en la cabecera de una do. A partir de ahora, esta tarea ya no va clase, método o propiedad, se creará el esqueleto básico para documentarlo, y al hacer uso de ese elemento de código, los comentarios introducidos se visua- Figura 3 lizarán en el ToolTip correspondiente, como vemos en la figura 6. Diseñadores y ventanas adicio- Entre las incorporaciones realizadas a la tecnología Intellisense podemos des- nales tacar las opciones de auto corrección, que subrayan una palabra clave mal Cuando vamos a diseñar un formu- escrita, ofreciéndonos una lista de posi- lario, la caja de herramientas es el pri- bles correcciones. Igualmente será mer elemento al que solemos recurrir subrayado un identificador que perte- para arrastrar y soltar los controles que nezca a un tipo que se intente utilizar compondrán el interfaz de usuario; en antes de haber sido instanciado. Por otra esta versión, la ventana “Toolbox” con- parte, para que de un rápido vistazo Manía tiene más categorías de controles, per- Figura 5 podamos comprobar cuáles son las nue- dotNet < < 61 << dnm.plataforma.net

ciones, pero además, contamos con la posibilidad de crear nuestros propios recortes personalizados median- te el administrador de snippets. Para agregar un code snippet hemos de hacer clic derecho sobre el editor y elegir la opción “Insert Snippet”, que abrirá una lista de carpetas contenien- do todos los diferentes bloques de código organiza- dos por categorías, como vemos en la figura 8.

Figura 6

vas líneas de código que hemos escrito, en el margen del editor se muestran unos indicadores de color ver- de y amarillo, avisándonos de las líneas grabadas y las pendientes respectivamente. Veamos unos ejemplos en la figura 7.

Figura 8

A través del diagrama de clases, podemos diseñar visualmente el esqueleto de una clase, con la particu- laridad de que el editor de código y el diagrama se encuentran sincronizados, es decir, cualquier cambio que hagamos sobre una clase, por ejemplo en el editor, se propagará inmediatamente al diagrama y viceversa. Figura 7 La figura 9 nos muestra esta ventana del diagrama.

Existen ciertas operaciones cuyo código normal- mente repetimos hasta la saciedad en todas nuestras sesiones de trabajo. Para ahorrar tiempo en la escri- tura de dicho código, ahora disponemos de los Code Snippets (Recortes de Código), que consisten en bloques de código “prefabricados”, almacenados en VS2005, y que pegamos directamente sobre el editor, ahorrando gran cantidad de tiempo de escritura.

Figura 9

A través del diagrama de clases, Otro de los mecanismos que nos puede ayudar podemos diseñar visualmente el a agilizar la escritura es Refactoring, que nos per- mite reestructurar nuestro código de una manera esqueleto de una clase, con la rápida y fácil. Por ejemplo, supongamos que estamos escribien- particularidad de que el editor de do un fragmento de código y estimamos que puede ser candidato a convertirse en un método independiente; código y el diagrama se lo que tenemos que hacer es seleccionar dichas líneas de código, y con un clic derecho sobre las mismas, ele- encuentran sincronizados giremos la opción “Refactoring > Extract method”, que abrirá un cuadro de diálogo en el que introduciremos el nombre de un nuevo método para las líneas selec- cionadas, y Refactoring nos creará el método con dichas

Manía El IDE nos proporciona una enorme cantidad de líneas, situando una llamada al mismo en el emplaza- estas piezas de código para resolver multitud de situa- miento original, como vemos en la figura 10. dotNet < < 62 << dnm.plataforma.net

Figura 11

Cuando se produce un error en tiempo de ejecu- ción, entra en acción el “Asistente de Excepciones”, Figura 10 una estupenda herramienta que muestra un cuadro de diálogo con la descripción de la excepción, una lista de posibles soluciones, y acceso a un completo deta- lle del problema, a la documentación de .NET, etc. En algunas ocasiones, para realizar pruebas, Ver la figura 12. comenzamos a codificar usando los nombres por defec- to que genera el IDE: Form1, Class1, etc., y al termi- nar, si la prueba es satisfactoria y queremos mantener el código escrito, nos vemos obligados a recorrerlo para cambiar dichos nombres por otros más signifi- cativos, lo cual resulta muy tedioso, sobre todo si hemos escrito bastante código. Esta operación podemos realizarla ahora en un único paso, seleccionando el nombre a cambiar, haciendo clic derecho y eligiendo la opción “Rename”, la cual se encargará de propagar los cambios necesa- rios a lo largo de todo el código.

Novedades del depurador Figura 12

En primer lugar tenemos que anunciar la vuel- ta al depurador de una de las características clási- cas de Visual Basic: Editar y Continuar, ahora tam- Cerrando el IDE bién disponible para C#. Sí en efecto, volvemos a contar en el IDE con la posibilidad de modificar el Y esta ha sido la relación de primicias más remar- código al mismo tiempo que lo estamos depuran- cables con las que desembarca el nuevo y flamante do, lo que supone un importante aumento de pro- Visual Studio 2005. Como hemos comentado al ductividad, evitando en muchas ocasiones tener que comienzo de este artículo, hay muchas más, entre cancelar la ejecución, modificar y volver a ejecutar, las que podríamos mencionar de forma breve, la con el retraso que ello supone en el tiempo global capacidad de la ventana “Inmediato” para evaluar de desarrollo. expresiones en tiempo de diseño; la nueva ventana Respecto a la consulta de información en tiempo “Error List”, que muestra los errores producidos, de depuración, tenemos como novedad los Data Tips, por lo que ya no se usa la ventana “Task List” para consistentes en una viñeta flotante que visualiza los valo- este menester; los atributos del depurador, que per- res contenidos en los miembros de una clase propia o miten personalizar el modo en el que el depurador de la plataforma .NET. Tan sólo hemos de situar el visualiza la información; el nuevo sistema de ayu- ratón sobre la variable que alberga el objeto, y el data da, con capacidades mejoradas de búsqueda, alma- tip con su contenido será visualizado. Adicionalmente, cenamiento para entradas favoritas de la documen- también tenemos visualizadores en diferentes forma- tación, etc. tos para estos valores, dependiendo de cuál sea el valor En definitiva, una nueva versión de un gran que estamos consultando; si hay un visualizador dispo- entorno de desarrollo de aplicaciones, que poten- nible lo sabremos porque a su lado aparece un icono de cia nuestra capacidad de trabajo al tiempo que la Manía lupa. Ver la figura 11. simplifica. dotNet < < 63 dnm.plataforma.net

Carlos Quintero Novedades en la extensibilidad de Visual Studio 2005

Como no podía ser menos,Visual Studio 2005 introduce muchas mejoras en su mode- lo de extensibilidad que permiten crear complementos de forma mucho más sencilla, sin las complicaciones innecesarias de antaño.

< < Es evidente que Microsoft ha escuchado a los desarrolla- idéntica funcionalidad al anterior EnvDTE.dll ver- dores de complementos (add-ins) que hemos esta- sión 7.0.3300.0. do “quejándonos” durante los últimos tres años de • El ensamblado EnvDTE80.dll, nuevo en esta ver- las complicaciones, a nuestro juicio innecesarias, sión, contiene toda la funcionalidad nueva que que tenían los complementos de Visual Studio Microsoft ha añadido en Visual Studio 2005. .NET 2002/2003 y, por fin, en esta nueva versión Han preferido hacerlo así, con dos ensambla- de Visual Studio la creación de complementos se dos, para no correr riesgos de romper la com- ha simplificado notablemente y se han introducido patibilidad hace atrás modificando el ensam- interesantes mejoras. Estas complicaciones eran blado EnvDTE.dll. consecuencia de la tecnología COM (ActiveX) que • El ensamblado Office.dll, que contenía la funcio- hereda el IDE de Visual Studio actual de sus ver- nalidad de barras de botones prestada de Microsoft siones 5.0 y 6.0 de finales de los 90 (recordemos Office, ha sido reemplazado por el nuevo ensam- que Visual Studio 2005 sigue sin ser una aplicación blado Microsoft.VisualStudio.CommandBars.dll. Han .NET). No sólo eso, sino que los bugs más indese- hecho esto para tener un ensamblado más pequeño ables del modelo de extensibilidad han sido corre- que contenga sólo lo necesario para las barras de gidos. Para los lectores que no lo sepan, el nuevo botones de Visual Studio, sin elementos innecesa- sitio Web “MSDN Product Feedback Center” rios que contenía la DLL de Microsoft Office. (http://lab.msdn.microsoft.com/productfeedback) per- mite enviar sugerencias y bugs a los equipos de desa- Aparte de estos ensamblados que el asistente aña- rrollo de los productos de Microsoft (no a todos de como referencias, existen otros dos que, depen- todavía), y funciona realmente bien, con respues- diendo de la funcionalidad de nuestro complemento, tas rápidas (al menos durante las fases beta de los necesitaremos añadir: productos). • El ensamblado VSLangProj80.dll, que contiene la extensibilidad específica de los proyectos de Nuevo IDE, nuevos ensamblados Visual Basic .NET y C# (Visual Studio .NET 2002 proporcionaba el ensamblado VSLangProj.dll, Lo primero que llama la atención del proyecto gene- y Visual Studio .NET 2003 proporcionaba Carlos J. Quintero rado por el asistente para la creación de complemen- VSLangProj2.dll). es Microsoft MVP de .NET desde principios del año 2004. Es autor tos (menú “Nuevo proyecto”, nodo “Otros tipos de • El ensamblado VsWebSite.Interop.dll, nuevo en del popular complemento MZ- proyectos”, “Extensibilidad”) es que algunas de las refe- esta versión, proporciona la extensibilidad espe- Tools 3.0 para VB6,VB5 y VBA, y rencias han cambiado de nombre y de versión: cífica para el nuevo modelo ASP.NET 2.0, que eli- de MZ-Tools 4.0 para Visual • El ensamblado EnvDTE.dll, que contiene la mayor mina la necesidad de archivos de proyecto para Studio .NET 2002/ 2003, ambos disponibles en parte del modelo de extensibilidad de Visual Studio aplicaciones Web y considera como sitio Web todo http://www.mztools.com ahora tiene la versión 8.0.0.0, aunque contiene el contenido de un directorio. << dnm.plataforma.net

y otras son para todos los usuarios (por ejemplo, las se pueden seguir usando las formas que comienzan con %ALLUSERSPROFILE% o %VSCOMMO- NAPPDATA%). Habrá que tener esto en cuenta a la hora anteriores de registrar un de crear el setup para nuestro complemento.

complemento, pero la nueva forma Microsoft Visual Studio 8.0 Nuevo registro de complementos Entre los archivos generados por el asistente, hay MyAddin MyAddin otro que llamará nuestra atención: el que tiene la exten- MyAddin.dll sión .addin. Como explicamos en el número 18 de MyAddin.Connect dotNetManía, los complementos de Visual Studio .NET 0 2002 o 2003 tenían que ser registrados de dos maneras: 0 0 • Como componente ActiveX, usando COM Interop (regasm.exe o equivalente): por fin, este paso ya no es necesario, y es que no tenía mucho sentido que, siendo un ensamblado .NET, hubiera que registrar Fuente 1 la DLL del complemento como componente ActiveX para que Visual Studio la pudiera encontrar y cargar. Por supuesto, se pueden seguir usando las formas • Como complemento de Visual Studio, para que aparez- anteriores de registrar un complemento, pero la nue- ca en el Administrador de Complementos: esto se va forma de registro es mucho más fácil. El archivo hacía añadiendo unas entradas en el registro de con la extensión .addin es un archivo XML cuyo con- Windows (HKEY_CURRENT_USER\Software\Microsoft\ tenido es como el que se muestra en el fuente 1. VisualStudio\7.1\AddIns para Visual Studio .NET Como podemos ver, las etiquetas XML dentro de la 2003) pero ahora se puede hacer a través de un archi- etiqueta son similares a las entradas que tenía- vo XML con extensión .addin ubicado en unas car- mos que añadir al registro de Windows para registrar petas determinadas. Visual Studio 2005 busca archi- nuestra DLL como complemento de Visual Studio, vos con la extensión .addin en las carpetas que apa- excepto la etiqueta , que permite especificar recen en el diálogo que se muestra pulsado el menú el nombre de la DLL, y la etiqueta , que “Herramientas”, “Opciones”, nodo “Seguridad de permite especificar la clase del complemento que imple- complementos/macros”. La figura 1 muestra dicho menta el interfaz IDTExtensibility2, necesario para car- diálogo (tomado de la versión inglesa de Visual Studio gar un complemento. Esta información antes se obtenía 2005). Como podemos observar, hay varias carpetas registrando el complemento como componente COM. donde Visual Studio 2005 buscará los archivos con Las etiquetas dentro de la etiqueta la extensión .addin. Unas carpetas son específicas son las que permiten saber cuál es el host para el que está para el usuario de la sesión de Windows (las que pensado el complemento, que en nuestro caso será comienzan por %USERPROFILE% o %VSAPPDATA%), por lo Microsoft Visual Studio, versión 2005 (8.0). que un archivo .addin en dicha carpeta hará que el En realidad hay dos archivos con la extensión .addin: complemento sólo esté disponible para ese usuario, uno reside en la propia carpeta del código fuente, y está ahí para que siempre acompañe al código fuente cuan- do se mueva la carpeta del proyecto a otra ubicación u ordenador, o se introduzca el proyecto en un sistema de control de código fuente como SourceSafe; el otro resi- de en la carpeta C:\Documents and Settings\\Mis documentos\Visual Studio 2005\Addins y es el que se emplea durante el desarrollo para que el Administrador de Complementos de Visual Studio lo muestre. Nuevas clases del modelo de objetos

Como hemos dicho, toda la nueva funcionalidad de Figura 1 la extensibilidad de Visual Studio 2005 reside en el ensam- Manía blado EnvDTE80.dll. Si examinamos este ensamblado con dotNet < < 65 << dnm.plataforma.net

el Examinador de Objetos, veremos que tiene muchas clases y métodos que ter- minan en “2”, para diferenciarlos de los Otra de las novedades más interesante son los nuevos del ensamblado anterior EnvDTE.dll. La clase más importante es EnvDTE80.DTE2, y eventos TextDocumentKeyPressEvents.BeforeKeyPress y es que ahora el parámetro application del método OnConnection del complemento, TextDocumentKeyPressEvents.AfterKeyPress del tipo Object, se puede convertir al tipo EnvDTE80.DTE2 que tiene los mismos méto- dos y propiedades del antiguo EnvDTE.DTE, y otros nuevos que se han añadido en esta pero ahora podemos hacerlo a nivel de pul- mientras que antes estábamos limitados a versión. Algunos métodos han cambiado sación de tecla. Y por fin parece que el los botones de pulsar solamente. Por ejem- de “firma” (signature), en especial los rela- modelo de código (FileCodeModel) es más plo, ahora podemos crear controles del cionados con botones y barras de boto- consistente entre los distintos lenguajes de tipo ComboBox o TextBox en nuestras barras nes. Por ejemplo, la propiedad DTE2. programación (Visual Basic, C#, Visual J#) de botones, o usar botones desplegables CommandBars ya no devuelve un objeto del y los métodos para añadir código (funcio- como las listas Most Recently Used (MRU). tipo Microsoft.Office.Core.CommandBars nes, parámetros, etc.) ya funcionan en Para ello se emplea el nuevo método como ocurría antes, ni siquiera del tipo todos los lenguajes, tal vez porque los use EnvDTE80.Commands2.AddNamedCommand2, Microsoft.VisualStudio.CommandBars.Com el nuevo diseñador de clases de algunas que proporciona nuevos parámetros para mandBars del nuevo ensamblado para las versiones de Visual Studio 2005. especificar el tipo de control que se crea- barras de comandos como cabría esperar, rá en las barras de botones a partir del sino que devuelve el tipo Object. Según Nuevos tipos de botones comando. Microsoft, esto es necesario para algunas Por otro lado, la nueva clase optimizaciones internas de Visual Studio. Como se aprecia inmediatamente al EnvDTE80.Window2 expone una nueva pro- El caso es que deberemos hacer una con- ver Visual Studio 2005 por primera vez, piedad CommandBars que da acceso a las versión de tipos que antes no era necesaria. sus botones son ahora “más bonitos”, barras de botones de las toolwindows de La lista de nuevas clases y métodos es como los de Microsoft Office 2003, ya que Visual Studio 2005, algo que antes no era bastante larga, por lo que no la vamos a usan bitmaps TrueColor y no los bitmaps posible. El fuente 3 muestra el código detallar aquí. Baste mencionar que otra de de 16 colores de las versiones anteriores. fuente de un complemento que añade un las novedades más interesante son los nue- Esto significa que si no queremos que botón a la barra de botones del Explorador vos eventos TextDocumentKeyPressEvents. nuestro complemento “desentone”, ten- de Soluciones. Este botón podría realizar BeforeKeyPress y TextDocumentKeyPressEvents. drá que usar unos bitmaps que sean igual alguna función útil dentro de dicha ven- AfterKeyPress, también muy demandados, de vistosos, usando TrueColor. Aparte de tana, por ejemplo, contraer los proyectos ya antes sólo era posible detectar cambios esta mejora estética, en Visual Studio 2005 de la solución (esto se deja como ejercicio en el código fuente al cambiar de línea, podemos crear nuevos tipos de botones, al lector).

Private Const m_NOMBRE_COMANDO As String = "MiComando"

Private m_objDTE2 As DTE2 Private m_objAddIn As AddIn Private m_objCommandBarControl As CommandBarControl

Public Sub OnConnection(ByVal application As Object, _ ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _ ByRef custom As Array) Implements IDTExtensibility2.OnConnection

Dim objWindow2 As Window2 Dim colCommandBars As CommandBars Dim objCommandBar As CommandBar Dim objCommand As Command = Nothing

m_objDTE2 = CType(application, DTE2) m_objAddIn = CType(addInInst, AddIn)

Select Case connectMode Case ext_ConnectMode.ext_cm_AfterStartup, ext_ConnectMode.ext_cm_Startup Try ' Intenta recuperar el comando del add-in, por si ya está creado Manía objCommand = m_objDTE2.Commands.Item(m_objAddIn.ProgID & "." & m_NOMBRE_COMANDO) Catch dotNet

< Fuente 2 (Continua...) < 66 End Sub Public SubExec(ByValCmdNameAsString,_ End Sub Public SubQueryStatus(ByValCmdNameAsString,_ End Sub Public SubOnDisconnection(ByValdisconnectModeAsext_DisconnectMode,_ End Sub End Try Catch exAsException Try ByRef handledAsBoolean)ImplementsEnvDTE.IDTCommandTarget.Exec ByRef VariantInAsObject,VariantOut_ ByVal ExecuteOptionAsEnvDTE.vsCommandExecOption,_ End Try Catch exAsException Try ByRef CommandTextAsObject)ImplementsEnvDTE.IDTCommandTarget.QueryStatus ByRef StatusOptionAsEnvDTE.vsCommandStatus,_ ByVal NeededTextAsEnvDTE.vsCommandStatusTextWanted,_ End Try Catch exAsException Try ByRef customAsArray)ImplementsIDTExtensibility2.OnDisconnection End Select MessageBox.Show(ex.ToString) End If If CmdName=m_objAddIn.ProgID&"."m_NOMBRE_COMANDOThen MessageBox.Show(ex.ToString) End If If CmdName=m_objAddIn.ProgID&"."m_NOMBRE_COMANDOThen MessageBox.Show(ex.ToString) End If If Not(m_objCommandBarControlIsNothing)Then MessageBox.Show(CmdName &"ejecutado.") StatusOption =vsCommandStatus.vsCommandStatusSupportedOrvsCommandStatus.vsCommandStatusEnabled m_objCommandBarControl.Delete() End Try Catch exAsException Try End Try m_objCommandBarControl =CType(objCommand.AddControl(objCommandBar),CommandBarControl) objCommandBar =colCommandBars.Item("Explorer") colCommandBars =DirectCast(objWindow2.CommandBars,CommandBars) ' Obtienesubarradecomandos objWindow2 =CType(m_objDTE2.Windows.Item(EnvDTE.Constants.vsWindowKindSolutionExplorer),Window2) ' ObtienelaventanadelExploradordesoluciones End If System.Windows.Forms.MessageBox.Show(ex.ToString) If objCommandIsNothingThen ' Sielcomandodeladd-innoestácreado,locrea objCommand =m_objDTE2.Commands.AddNamedCommand(m_objAddIn,_ m_NOMBRE_COMANDO, "Micomando",True,59) (...continuación )Fuente2 << dnm. plataforma.net 67 <

También se ha eliminado la necesi- hace falta el shim control ni ActiveX. Para dad de tener que usar Visual C++ para ello, se emplea la nueva función crear la DLL satélite que proporciona Otra buena noticia: ahora EnvDTE80.Windows2.CreateToolwindow2. los bitmaps para los comandos de nues- Esta función, como la antigua, recibe tro complemento. Aunque sigue siendo crear toolwindows es muy como parámetros la instancia del com- necesaria una DLL satélite (parece que plemento, un GUID identificador, el cap- no, Microsoft no ha escuchado aún la fácil, ya no hace falta el shim tion de la ventana, y como nuevos pará- sugerencia de eliminarla o hacerla metros, el ensamblado y la clase del con- opcional), ahora se puede usar una DLL control ni ActiveX trol de usuario .NET que queremos alo- “manejada” (no nativa Win32) creada jar en la ventana. El fuente 4 muestra usando Visual Basic .NET o C# a la que cómo crear una toolwindow en nuestro añadiremos nuestros recursos de tipo complemento que aloja un control de bitmap. función que había que llamar para alojar usuario llamado UserControl1. nuestro control de usuario .NET. Este Con esto finalizamos este artículo No más shim control para tool- shim control ha sido causa de innumera- sobre las novedades en la extensibilidad windows bles quebraderos de cabeza para los desa- de Visual Studio 2005. Como siempre, rrolladores de complementos, ya que el Examinador de Objetos nos ayudará a Aunque habíamos hablado en algún Microsoft liberó 3 versiones del mismo, explorar todas sus posibilidades, aunque artículo anterior de las toolwindows, esas algunas no oficiales, que corregían pro- conviene indicar que la documentación ventanas que se adhieren a los bordes de blemas con los aceleradores de teclado de Microsoft en MSDN sobre este tema Visual Studio (como la Lista de Tareas o (la tecla [&] en una etiqueta para acce- [1] ha mejorado mucho y ahora es más el Explorador de Soluciones), no había- der a un control) y requería que cada detallada que antes, por lo que conviene mos explicado cómo crear nuestras pro- desarrollador cambiase los diversos empezar por ahí. pias toolwindows para nuestro comple- ProgID y CLSID que empleaba este con- mento, y por una buena razón: era tre- trol ActiveX para que no entrase en con- Bibliografía mendamente complicado. La forma de flicto con los controles shim de otros crear toolwindows era usando la función complementos. Después de esta compli- “Automation and Extensibility for Visual DTE.Windows.CreateToolwindow, que reci- cada explicación, otra buena noticia: aho- [1] Studio”,http://msdn2.microsoft.com/ be como parámetros la instancia del com- ra crear toolwindows es muy fácil: ya no library/xc52cke4(en-us,vs.80).aspx plemento, el ProgID del control ActiveX que se alojará en la ventana (el conteni- do de estas ventanas se proporciona Public Sub OnConnection(ByVal application As Object, _ mediante un control de usuario), un GUID ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _ que identificará la toolwindow, y el cap- ByRef custom As Array) _ Implements IDTExtensibility2.OnConnection tion de la ventana. Haciendo un poco de historia, en Visual Basic 5.0 o 6.0, don- Dim colWindows2 As Windows2 de todo era ActiveX, no había problema: Dim objWindow As Window nuestro complemento podía tener un Dim objUserControl As Object Dim objAssembly As System.Reflection.Assembly control de usuario que era registrado como componente ActiveX, y se pasaba _applicationObject = CType(application, DTE2) su ProgID a esa función. Pero en Visual _addInInstance = CType(addInInst, AddIn) Studio .NET 2002 y 2003 surgió el pro- Select Case connectMode blema: mientras que nuestros comple- Case ext_ConnectMode.ext_cm_AfterStartup, ext_ConnectMode.ext_cm_Startup mentos eran DLL .NET con controles Try de usuario que no eran ActiveX, la fun- colWindows2 = DirectCast(_applicationObject.Windows, Windows2) ción CreateToolWindow exigía que se pasa- objAssembly = System.Reflection.Assembly.GetExecutingAssembly() objWindow = colWindows2.CreateToolWindow2(_addInInstance, _ ra un control ActiveX. La “solución” de objAssembly.Location, _ Microsoft, un tanto peculiar, fue pro- "MiAddin.UserControl1", "Mi ventana", _ porcionar a través de uno de los ejem- "{5FD1A8D8-26B1-4ed2-97D9-9CB8160CD8D3}", objUserControl) plos de su sitio Web (ni siquiera era pro- objWindow.Visible = True Catch ex As Exception porcionado por Visual Studio .NET) un System.Windows.Forms.MessageBox.Show(ex.ToString) control ActiveX llamado shim control que End Try era el que se le pasaba a dicha función. End Select Dicho control, escrito en C++ con tec- End Sub nología ATL ininteligible para el desa-

Manía rrollador típico de Visual Basic, tenía una Fuente 4

dotNet Este artículo se ha escrito usando la versión Visual Studio 2005 Community Technology Preview (CTP) de Junio de 2005,que es posterior a la Beta 2.Es posible que algunas <

< cosas explicadas en el artículo, así como la documentación, varíen en la versión final. 68

dnm.laboratorio.net

José Miguel Torres

.NET Compact Framework 2.0

Con la aparición de Visual Studio .NET, y con él .NET Compact Framework surgió un nuevo conjunto de herramientas, bajo código administrado, para el desarrollo de dispositivos móviles. Si bien es cierto que con la aparición de .NET Compact Framework 1.1 SP3 se consiguió un marco más trabajado, aho- ra con .NET Compact Framework 2.0, además se amplia.

< < Novedades .NET Compact Framework 2.0 desarrollados de versiones anteriores o bien utilizá- bamos de componentes de otro tipo (por ejemplo, el .NET Compact Framework (.NET CF a partir acceso a Pocket Outlook Object Model), nos veíamos obli- de ahora) forma parte de .NET Framework con lo gados a crear una librería de “llamada puente” o wrap- que muchas de las mejoras ofrecidas en .NET per como se conoce en inglés, que interactuara con Framework también están disponibles para .NET CF. los componentes COM para la llamada desde código Obviamente, la limitaciones de este modelo de desa- administrado. Pues bien, COM Interop es una de las rrollo hace que ciertas clases o métodos, propiedades novedades de .NET CF 2.0, aunque no estará tan o eventos de las mismas no estén disponibles. Pese a extendida como en .NET Framework y entre otras ello, tanto la cantidad de nuevas características, como mejoras se han extendido los Type Marshaling, con la mejora del rendimiento, son notables. nuevos tipos y tipos “embebidos”. .NET CF ocupa 1,55 Mb (ROM) en Pocket PC De la misma forma, el simple acceso al registro 2002 y anteriores y 1,35 Mb (ROM) en Pocket PC del sistema o a los puertos COM derivaban en una 2003 y superiores. Los requisitos de memoria en el llamada P/Invoke a la API, ahora, .NET CF 2.0 pro- terminal son de 0,5 Mb RAM, con un tamaño de apli- vee la clase RegistryKey para el acceso al registro, y cación que oscila entre los 5Kb y los 100 Kb, en la puede utilizar las clases de .NET Framework para el mayoría de los casos. Es compatible con dispositivos acceso a los puertos serie. Pocket PC y Smartphone con Windows Mobile 2003 La seriación es también una de las gratas noveda- Second Edition, Windows CE .NET 4.x y 5.0, que- des, así como el pleno soporte a las nuevas caracterís- dando para próximas versiones la edición Phone ticas de Microsoft SQL Server 2005 Mobile Edition e Edition. La velocidad del motor de ejecución del CLR incluso a la seguridad, transaccionalidad y eficacia de es mayor, así como de las librerías más utilizadas como los servicios de mensajería MSQS (Message Queuing). XML o ADO.NET. A nivel de seguridad, también remarcar el soporte a la En la versión anterior –y quien haya desarrollado criptografía y a los certificados X509, la relación entre sobre la misma lo sabe– muchas de las ventajas de ensamblados a través del atributo Friend Assembly y .NET Framework no estaban disponibles y eran muy soporte a la autenticación NTLM e IPv6, la próxima frecuentes las llamadas mediante Platform Invoke generación de protocolos para Internet. José Miguel Torres (P/Invoke) directamente a las API del sistema opera- Para las aplicaciones desarrolladas con .NET CF colabora habitualmente con dotNetManía. Es técnico tivo. La interoperabilidad COM o COM Interop, que 1.x, podremos ejecutarlas en dispositivos con .NET superior en desarrollo de tan grandes ventajas hemos obtenido desde .NET CF 2.0 configurándolo de manera explícita, sin nece- aplicaciones informáticas y Framework, ya sea dentro de un marco de migración sidad de modificar código. Para migrar las aplicacio- trabaja como arquitecto de o de un contexto de interoperabilidad, desde .NET nes de .NET CF 1.x a .NET CF 2.0, Visual Studio software en el departamento de tecnologías de la CF 1.x no estaba disponible. Esto hacía que dichos 2005 ofrece una Upgrader, que permite migrar auto- información de MRW componentes COM que por un lado o bien teníamos máticamente mediante un asistente. << dnm.laboratorio.net

Visual Studio 2005

Visual Studio 2005 es también la evolución de eMbedded Visual C++ 4.0 (eVC++). De esta forma, den- tro del entorno de desarrollo de Visual Studio 2005 podremos trabajar tanto con nuestros antiguos pro- yectos de Visual Studio .NET 2003 como los desa- rrollados en eVC++ 4.0; además podremos tenerlos en una misma solución. La principal característica es que el desarrollo de dis- positivos móviles es independiente de .NET Framework, esto es, .NET CF 2.0 tiene su propio SDK y cualquier proyecto Mobile, puede ser compilado desde la línea de comandos de Visual Studio 2005. Incluye también, nue- vas características orientadas sobre todo a la productivi- Figura 2. Las posibilidades en tiempo de diseño de Visual dad. En resumen, aporta lo mejor de Visual Studio .NET Studio 2005 son extraordinarias. 2003 y eVC++ 4.0, todo en un mismo producto. Con Visual Studio 2005 podemos desarrollar para las PDAs pueden variar, así, podemos encontrarnos tres tipos de plataformas: SmartPhone, Pocket PC, con terminales con resoluciones de 240x320 hasta Windows CE, inicialmente puesto que con la instalación 480x640 pasando por 480x480. del SDK de PocketPC 5.0 y Smartphone 5.0 se añaden De esta manera, la importancia del alineamiento de Pocket PC Magneto y Smartphone Magneto respecti- los controles para la flexibilidad de aplicaciones que pue- vamente. En cada una de las plataformas podemos selec- dan ser utilizadas bajo distintas resoluciones se solucio- cionar el tipo de aplicación que deseemos, ya sea de na con el soporte conocido en .NET Framework como Windows Forms, de librería de clases, aplicación de con- anchoring y docking. El funcionamiento de estas dos pro- sola (o aplicación no gráfica). Sí, han leído bien, en esta piedades es exactamente igual que en .NET Framework. versión existe soporte integrado para Smartphone, sin Una de las curiosidades que más me ha llamado la necesidad de instalar ningún tipo de SDK. Además, pode- atención, es que en arrastrar un control originario de la mos cambiar el tipo de aplicación ya creada de Consola, plataforma PocketPC a una proyecto bajo plataforma por ejemplo, a Windows Forms, al menos, con mayor Smartphone, Visual Studio 2005, automáticamente, ofre- facilidad que antes. ce controles apropiados para Smartphone que lo sustitu- yan (si en Smartphone no existe o no está soportado dicho control) ajustándolo al tamaño de la pantalla. Existe un nuevo tipo de aplicación, el Control Library. Este tipo permite crear un control personalizado, agre- garlo a la barra de herramientas y hacer uso de él den- tro cualquier proyecto compatible. En versiones anteriores, la creación de un control personaliza- do era posible aunque no era visual. Otras novedades a remarcar son las que pode- mos encontrar en proyectos de Windows Forms o Web. Tanto las herramientas de testeo, conexión a Team Foundation Server así como al Snippets Code Manager. Podemos echar mano de los diagramas de sistemas distribuidos y mantener la documen- Figura 1. Plataformas y tipos de aplicación disponibles. tación del proyecto “al día” con los diagramas UML iniciales. Al crear un nuevo proyecto, lo que más llama la atención es que los formularios sobre los que se dise- Novedades en Windows Forms ña son, en cuanto a apariencia y funcionalidad, como los que se ejecutan en tiempo de ejecución, así, en un Entre las novedades, destacar que se ha mejo- proyecto Smartphone, podemos saber exactamente la rado significativamente el soporte gráfico de los apariencia y posición, de un ComboBox (figura 2), en formularios en cuanto a la seriación de bitmaps tiempo de diseño. Esto es lo que con el término inglés (como objeto), es decir la posibilidad de grabarlos Figura 3. .NET CF, ofrece la posibilidad de conocemos como what you see is what you get. Además en ficheros, soporte para iconos de alta resolución creación de controles de esta funcionalidad tiene un motivo extra, y es que con o soporte de degradado de color para fondo del usuarios.disponibles. Manía la aparición de Windows Mobile 5.0, la resolución de formulario. Se ha añadido la capacidad de que dotNet < < 71 << dnm.laboratorio.net

Clase Descripción hasta cuatro. Notification Muestra y responde a notificaciones de usuario. Los nuevos emula- DocumentList Muestra y gestiona documentos o archivos. dores podrán compar- HardwareButton Clase específica de Pocket PC,para la utilización de botones de hard- tir carpetas. Hasta aho- ware de dichos dispositivos. ra el intercambio de InputMethodCollection Permite el acceso a todos los tipos de acceso disponibles del dispo- ficheros se realizaba sitivos (InputPanel, Keyboard…) desde el ordenador InputMode Clase específica de SmartPhone,para tipo de acceso AlphaABC,T9,etc. escritorio compartien- LogFont Proporciona efectos de texto. do una carpeta y desde Mobile Device Permite manejar el evento Hibernar. el emulador obtenía- Figura 5. Device Emulator Manager ScreenOrientation A partir de Windows Mobile 2003 SE, esta clase permitirá la orien- mos los ficheros; en tación de la pantalla en grados (90-180-270). facilitará la configuración de los esta versión, la com- emuladores. Tabla 1.Nuevas clases en Microsoft.WindowsCE.Forms partición de carpetas y ficheros es bidireccio- .NET CF pueda destruir el formulario nal. Como comenté anteriormente, con Object Model bajo código administra- principal cuando éste se cierre. Soporte la introducción de Windows Mobile 5.0, do, pudiendo acceder a contactos, para DirectX y (aunque sólo la resolución de los dispositivos podrá correo electrónicos, mensajes SMS, sin estará disponible para versiones posterio- cambiar y, por tanto, los emuladores necesidad de COM Interop. Contendrá res de Windows Mobile). Se han añadi- harán lo mismo; podremos configurar librerías también administradas para do características específicas para las pla- tanto la resolución como la orientación telefonía, pudiendo tener el control de taformas Pocket PC y Smartphone, en de la pantalla. llamadas y tiempos, por ejemplo. Un cuanto a controles se refiere (ver tabla 1 Visual Studio 2005 y Windows administrador de dispositivo (Device y figura 3). Mobile 5.0 SDK suministrarán 15 emu- Management) que promete hacer apar- ladores distintos, por lo car el código nativo para el acceso a con- que además se incorpo- figuraciones del sistema sin tener que rará una nueva herra- echar mano de las API, mediante el mienta de administración objeto de configuración del sistema de emuladores conocida (Configuration System Object). como Device Emulator Manager (DEM). Ade- más DEM es una pieza fundamental para la comunicación entre ActiveSync y los emulado- res ya que en ella recae- Figura 4. La creación de nuevos controles se ha orientado a las necesidades reales y específicas de cada plataforma. rá la responsabilidad de conexión y desconexión entre ambos. Debido al la multi-resolución que ofre- cerá Windows Mobile 5.0, y además de las Visual Studio 2005 + Windows Figura 6. Nuevos Componentes propiedades anchoring y docking, comenta- Mobile 2005 + SQL Mobile administrados con Windows Mobile 5.0. das anteriormente, los formularios serán Auto-Scrollables. Además tendremos acce- 2005 = Un nuevo escenario so al portapapeles del sistema y a eventos del teclado de los dispositivos. .NET Compact Framework sigue Como ven se nos presenta un gran creciendo y ampliándose. Cada vez son abanico de posibilidades, en cuanto al Emuladores más los controles y clases que resuelven nuevo motor de acceso a datos, como o facilitan las tareas de su versión ante- de nuevas características del nuevo sis- Visual Studio2005, ofrece una mayor rior, y eso es de agradecer. Pero el autén- tema operativo, que hace que .NET CF cantidad de emuladores con unas carac- tico potencial de .NET CF 2.0 está liga- 2.0 no sea más que un importante mar- terísticas mejoradas y nuevas. Los emula- do tanto a SQL Mobile 2005 como a co de desarrollo hacía una nueva era dores ofrecerán soporte para ActiveSync, Windows Mobile 2005. .NET CF 2.0, orientada a la programación adminis- con lo que será posible conectarlos al escri- bajo sistemas operativos Windows trada en el desarrollo de dispositivos torio y sincronizándolos como si de un Mobile 2005, además de todo lo men- móviles en plataforma Microsoft. dispositivo físico se tratara, la cual cosa cionado (incluyendo el soporte para Más información: http://www.desa-

Manía facilitará las aplicaciones RAPI. Asimismo DirectX y Direct3D), contendrá libre- rrollomobile.net/dotNetMania/dotNETC la cantidad de puertos COM aumentará rías para el acceso a Pocket Outlook F2005 dotNet < < 72

dnm.ado.net

Pepe Hevia ADO.NET 2.0 Más y mejor acceso a datos

Ya está a la nueva versión de .NET Framework.Y no es una simple mejora de la anterior,sino que evoluciona de nuevo añadiendo más y mejores herramientas a la par que optimiza las ya existentes.Y es que se ve que ocurre una interac- ción perfecta entre comunidad de desarrolladores y Microsoft que nunca antes se había visto.

< < Muchas mejoras propuestas, implementadas; muchas del desarrollador, empaquetando aún más funcionalidad correcciones propuestas y realizadas; y muchas noveda- en los métodos y propiedades ya conocidos. Pero siem- des deseadas, e implementadas para dar soporte al futu- pre desde la perspectiva de no cambiar lo que ya fun- ro de los productos de Microsoft desarrollados sobre esta ciona. Es por esto que las migraciones a ADO.NET 2.0 plataforma. El resultado, un Framework más estable –si muchas veces pasarán por el mero hecho de recompilar cabe–, robusto –que ya lo era mucho– y potente –más con los nuevos compiladores y las nuevas versiones. Pero clases que nunca– que el anterior. a los que quieran aprovechar el nuevo Framework, eso Sincronizando la salida del Framework 2.0 con uno sí, avisarles de que hay muchas e interesantes herra- de los servidores .NET más esperado –Yukon o SQL mientas. Veámoslas poco a poco… Server 2005– vienen de serie con las BCL del sistema: las nuevas clases de acceso a datos, ya conocidas como Proveedores .NET y conexiones a datos ADO.NET 2.0. Ampliando lo que comentaba en el párrafo anterior, ADO.NET 2.0 incluye numerosas Esto ya os suena a todos. Pero recordemos que en el mejoras de las clases que ya conocemos del Framework Framework 1.1 existían unos pequeños flecos. Flecos 1.1; pero que también nos regala numerosas novedades que seguro a más de uno no os han afectado, pero a los que harán las delicias de los más fanáticos. Eso unido a que nos dedicamos a las arquitecturas de software nos cambios “estructurales” que no nos habían cuajado de la han supuesto en algunos casos –y aunque existían otras versión anterior, cierran un círculo que perfecciona aún alternativas– auténticos dolores de cabeza. Cosas como más esta tecnología de acceso a datos de Microsoft. información de metadatos del sistema, afinidad de las Se amplían aún más las máximas de Sencillez, pro- transacciones, carga dinámica de proveedores, abstrac- ductividad e integración. Con esto se quiere decir que ción de conexiones… y pocas cosas más, que se han las mejoras no se reducen a clases nuevas, sino a amplia- resuelto con éxito en esta nueva versión. ciones de las existentes. Y se reduce aún más el código Proveedores .NET: Interfaces, abstracción y factorí- as de clases NOTA En primer lugar a los proveedores .NET. ADO.NET 2.0 lejos de mantener el sta- Recordad que son el conjunto de “drivers” que nos Pepe Hevia tus quo,ha mejorado sus herramientas a la comunican con los sistemas gestores de datos de un colabora habitualmente con dotNetManía. Es arquitecto de par que ofrece multitud de novedades que determinado fabricante. De esta forma, SQL Server software senior en Alhambra- simplificarán el desarrollo de los sistemas cuenta con un proveedor nativo .NET encapsula- Eidos.Tiene las certificaciones de de n-capas.Y,como no, proporciona unas do en el espacio de nombres System.Data.SqlClient; MCAD, MCSD.NET y MCT en clases que aprovechan al máximo la poten- los conectores de compatibilidad con OleDb están .NET Framework. Ha escrito varios libros sobre la plataforma cia del nuevo SQL Server 2005 en System.Data.OleDb; en uno de los número ante- .NET (lalibreriadigital.com) [ ] riores de dotNetManía se hablaba de los recien- << dnm.ado.net

encontrado en el uso de proveedores .NET es el de NOTA la carga dinámica de proveedores. ¿Por qué? Porque las clases ADO se almacenan en el GAC y esto impi- de que podamos trabajar de forma directa con el car- En esta nueva versión,las factorías de cla- gador de clases de .NET. En segundo lugar, las pro- ses permitirán el desarrollo de aplicaciones pias cadenas de conexión están ligadas a sus provee- independientes del proveedor .NET dores, de forma que cada uno escribe estas cadenas [ ] como quiere. Entonces, ¿cómo podemos construir un objeto proveedor dinámicamente? Pues haciendo que una clase sea la responsable de ello. tes proveedores de MySQL… y así sucesivamente. Estos proveedores son nativos a .NET y facilitan su portabilidad. El problema, que para manejarlos es necesario conocer a priori con qué base de datos Public IDbConnection DameConexion(string fabricante,mCadConexion) queremos trabajar. Nuestro código dependerá de { IDbConnection conexion; con qué espacio de nombres trabajemos. Esto bien argumentado no debería ser ningún problema. Pero if (fabricante.equals("SqlServer")) qué ocurre si queremos que nuestro código de nego- conexion=new SqlConnection(mCadConexion); cio sea –hasta cierto punto– independiente del sis- else if(fabricante.equals("Oracle")) conexion=new OracleConnection(mCadConexion); tema gestor. Alternativas: XML, encapsular obje- tos en familias de clases más abstractas, usar inter- return conexion; faces o crear clases proxy… pero es un follón de } análisis y de código que ya no nos hace tan pro- Public IdbConnection DameComando(string fabricante,IdbConnexion conex, ductivos en determinadas situaciones. La solución string comandoSQL) a esto: los interfaces de ADO.NET y las factorías de { clases. IDbCommand comando; Los interfaces de ADO.NET son aquellas especifi- if (fabricante.equals("SqlServer")) caciones que los ingenieros de Microsoft establecen en comando=new SqlCommand(comandoSQL,conex); el espacio de nombres System.Data –y muchas de las else if(fabricante.equals("Oracle")) novedades en System.Data.Common– para que los fabri- comando=new OracleCommand(comandoSQL,conex); cantes de sistemas gestores puedan implementar sus return comando; proveedores. De esta forma, cualquiera que sepa cómo } funcionan estos interfaces podrá manejar cualquier proveedor .NET. Asimismo, todo un conjunto de cla- ses implementadas de serie en la BCL podrían usar //ejemplo de uso de este tipo de codigo... DbConnection conex=DameConexion("SqlServer"); código de terceros gracias a estos interfaces. De hecho, DbCommand comando=DameComando("SqlServer",conex, estos interfaces son IDbConnection, IDbTransaction, "select * from tabla"); IDbCommand, IDbParameter, e IDbDataReader así como la DbDataReader datos=Commando.ExecuteQuery(); clase adaptadora IDbDataAdapter. ¿Os suenan no? El ... problema es que, en muchos casos, estos interfaces son extendidos por fabricantes que ofrecen más funciona- lidad que la establecida. El problema es que el fabri- Fuente 1. Lo que hemos tenido que hacer con ADO.NET 1.1 cante entonces puede crear nuevos métodos o propie- –a grandes rasgos, claro– dades que difieren de este modelo, y esto es lo que nos obliga después a escribir código más específico. La solución: en el espacio de nombres System.Data.Common Toda la funcionalidad de la carga de los prove- se han ampliado los interfaces para hacerlos más ricos edores y la complejidad de su inicialización queda y abarcar más casos del estándar ANSI SQL. Esto cla- encapsulada en un método público y estático, de ro, sin perder la compatibilidad hacia atrás, ya que los forma que la podamos usar sin instanciar ninguna nuevos requisitos quedan recogidos en las clases abs- clase. De esta forma, empleando un interfaz de tipo tractas DbConnection, DbCommand… etc. Posibilitando DbConnection y una llamada al método “cargador” que la sobrecarga de interfaces ofrezcan más funcio- nos daría todo el problema resuelto. Esta forma de nalidad que antes. Y así, esta pequeña laguna se resuel- trabajar es a lo que se denomina factorías de clases. ve. Pero, ¿y qué pasa con la independencia del Son clases especiales que tienen constructores públi- SGBDR?... cos y estáticos cuya misión es la encapsular la cre-

Para solucionar esta otra laguna, existen las facto- ación de otras clases. Esto quiere decir que emple- Manía rías de clases. El problema que siempre nos hemos ando la clase DbProviderFactory y el cargador dotNet < < 75 << dnm.ado.net

CreateConnection DbProvidersFactory podremos des- DataTable t = conexion.GetSchema("Tables"); preocuparnos de todo esto y reducir CreateCommand t.WriteXml("tables.xml"); al máximo las líneas de código. La cosa CreateCommandBuilder está en que los nuevos proveedores Fuente 3. Metadatos en una línea de código ADO.NET deberán registrarse en una CreateConnection pequeña base de datos de drivers en CreateConnectionStringBuilder ejecución y dejar que las factorías hagan Enumeración de servidores el trabajo por nosotros. El enlace: la CreateDataAdapter cadena de conexión. Ese sencillo string Esta es una nueva utilidad que nos CreateDataSourceEnumerator que usábamos en VB6 y que gracias al permitirá poder explotar la detección de comando “provider=” nos daba todo CreateParameter servidores a lo largo y ancho de una red. hecho. En en este caso, el código que Debido a su utilidad puede que no todos CreatePermission hemos visto antes (fuente 1) quedaría los proveedores la soporten (por ejem- resumido en dos partes: una que afec- Tabla 1.Nuevos métodos de los interfaces plo, Oracle que solo cuenta con una base ta al fichero XML de configuración del para abstraernos de la creación de de datos). En el caso de clientes SQL ensamblado principal y una segunda objetos de datos. Server, esta utilidad nos dotará de la con el código operativo... posibilidad de poder recoger en un obje- to DataTable todos los servidores SQL Server registrados en una red. Sus uti- lidades, están claras. se DbEnumerator. Y será bueno que le preguntéis a la factoría si el provee- dor que cargáis la soporta o no… Constructor de cadenas de conexión

De siempre ha existido una utilidad en OLEDB que permitía a los entornos // Recogemos la cadena de connexion de un fichero de configuración de desarrollo abrir un cuadro de diálogo string provstring = que permitía al usuario seleccionar los ser- ConfigurationSettings.AppSettings.Get("DbProvider"); vidores y sus atributos para abrir una cone- string cadConexion= ConfigurationSettings.AppSettings.Get("ConnectionString"); xión –os recomiendo un artículo que escri- //La factoría de clases nos devuelve el proveedor bí del tema y que tenéis en mi Web DbProviderFactory prov = http://www.heviatec.net en la sección de DbProviderFactories.GetFactory(provstring); artículos–. Este diálogo se puede abrir //Y ya tenemos nuestra connexion disponible. IDbConnection conexion= fact.CreateConnection(); empleando interop utilizando las clases de conexión.ConnectionString=cadConexion; servicio de OLEDB. Pero para .NET no ... contamos con nada parecido, exceptuan- do una nueva utilidad de ADO: DbConnectionStringBuilder. Mediante esta Fuente 2. Las factorías de clases permiten la carga dinámica de proveedores .NET a partir de la cadena de conexión. interfaz podremos crear cadenas de cone- xión personalizadas por el usuario emple- ando propiedades y métodos, sin tener Puesto que el resto de los interfaces ¡Ah!, y esperad, que aún no acaba que preocuparnos por la sintaxis específi- han visto ampliada su funcionalidad, ya lo bueno relativo a conexiones. ca de cada proveedor. Esto quiere decir no tendremos que preocuparnos de cre- Gracias a las implementaciones de los que cada .NET Provider, heredando de ar las clases XxxCommand y sucesivas… ya últimos estándares ANSI SQL, las cla- esta clase, podrá proporcionar mecanis- que las mismas clases factoría ya nos pro- ses de conexión nos ofrecerán, en per- mos encapsulados de generación de cade- porcionarán sus propios mecanismos de fecto formato XML, los metadatos nas de conexión, reduciendo así los erro- creación de objetos de datos. obtenidos de las consultas a las vistas res derivados de la mala gestión de este Así de simple y así de abstracto. de esquema de los servidores de datos, “pequeño” detalle. No llega a ofrecer un Siento el trabajo que muchos de noso- conocidas como INFORMATION_SCHEMA. cuadro de diálogo, pero sÍ un potente

Manía tros hemos realizado para esto antaño, Imaginad la comodidad y potencia que mecanismo de creación de cadenas de pero así son las cosas. ¡Mejor! esto nos ofrece. conexión al igual que CommandBuilder dotNet < < 76 << dnm.ado.net

genera sentencias SQL DML a partir de una instrucción ra de trabajar, de forma que podamos trazar y depu- SELECT. Otra utilidad es la de parsear una cadena de cone- rar cualquier mínimo problema que se presente con xión, y permitir al desarrollador tratar cada elemento de la información adecuada para poder actuar en conse- forma individual. Lo dicho, una utilidad que a más de cuencia. Todo un esfuerzo por parte de los desarro- uno le vendrá bien. lladores de esta tecnología. Relativo a comandos y a recuperaciones de datos NOTA No sólo los procedimientos de conexión han Las utilidades de los proveedores .NET tenido cambios. Algunas mejoras en el lanzamien- se han ampliado para acoger las mejoras de to de comandos han sido introducidas en el inter- IDbCommand los estándares ANSI SQL como, por ejem- faz , responsable de que un cliente eje- plo, la recuperación de Metadatos. cute instrucciones SQL en el servidor. Estas mejo- ras se pueden ver examinando el nuevo conjunto de [ ] métodos que despliega esta clase, que agregan méto- dos que afectan a cómo se procesan los comandos en entornos multi-hilo, gracias a las ejecuciones asíncronas. Respecto a la ejecución asíncrona seguro que en Mejoras en el pool de objetos más de una situación nos hemos visto lanzando comandos SQL que conllevan un alto tiempo de En la versión anterior de ADO.NET, no todos ejecución de servidor o bien un tiempo de espera los proveedores soportan el pool de conexiones. superior a la media debido a la carga de la red. Para Unicamente los proveedores de SQL Server y evitar que un cliente se quedara “cuajado” en estas Oracle admitían esta funcionalidad –entre otros delicadas situaciones, nos hemos visto en la nece- pocos servidores más particulares–. Pero OLEDB sidad de meter estos tipos de operaciones en hilos y ODBC no eran capaces de soportar estas carac- de ejecución, de cuyo control hemos sido respon- terísticas tan beneficiosas para la optimización de sables nosotros –cayendo de nuevo en la falta de las conexiones. En esta versión se mantiene la mis- productividad y menor tolerancia a fallos–. Ahora, ma línea aumentando la granularidad de la genera- los métodos Execute principales cuentan con sus ción de las conexiones; la posibilidad de especificar hermanos BeginExecuteXxx de forma que mediante un tiempo de espera personalizado de espera al ini- delegados, ADO.NET nos avisará de cuando ha ter- ciar la conexión y una valiosa funcionalidad que nos minado una determinada ejecución sea del tipo que permitirá cerrar todas las conexiones abiertas de un sea y siendo la causa que sea. Lo cual, sí permitirá pool con un solo método del objeto DbConnection: entornos de alto rendimiento con el mínimo esfuer- ClearPool por el cual cerramos las conexiones abier- zo. Eso sí, no podemos abusar de estas cosas, pues- tas de un determinado pool o bien ClearPools, la cual to que el esfuerzo a nivel de sistema no es gratis en nos permite cerrar todas las conexiones del pool de entornos no preparados para este tipo de situacio- un determinado DomainApp. Sin duda, una solución nes (véase Windows Me, 98…etc, si es que aún que- a problemas específicos que seguro más de uno se dan en algún rescoldo de la humanidad). ha encontrado (ya que el cierre no siempre es auto- Pero no podemos dejar de lado las mejoras de mático, depende de otros factores). DbDataReader. Aunque luego se comentará, es bueno

Trazabilidad

Otra gran mejora de las clases ADO.NET es su capacidad de ser trazadas, esto es, de poder documentar en todo momento el estado en el que están y su infor- Otra gran mejora de las clases ADO.NET es su mación asociada. Esto nos será extremadamente útil capacidad de ser trazadas, esto es, de poder a la hora de poder investigar problemas relativos a problemas en las conexiones, problemas en la ejecu- documentar en todo momento el estado en el ción de consultas… dando mucha más información que la que sólo podíamos recuperar con los mensajes que están y su información asociada. OLEDB, que quedaban bastante limitados.

Tanto las clases de los proveedores como las uti- Manía lidades de ADO.NET comunes comparten esta mane- dotNet < < 77 << dnm.ado.net

MARS será el mecanismo por el cual los desarrolladores podrán reducir el número de conexiones abiertas ante el hecho de lanzar múltiples comandos y recuperar múltiples conjuntos de datos

anticipar que existen nuevos métodos de acceso a los Transacciones datos recuperados del servidor. De hecho, todas las mejoras están recogidas en los nuevos tipos de datos, No es que hayan cambiado mucho las cosas en este entre ellos el nuevo tipo XML. Sí, sí… poder recuperar sentido, pero lo que sí se ha hecho es integrar en el un XML empotrado en una columna empleando una cliente las funcionalidades del nuevo espacio de nom- sencilla función GetXxxx(). Y como esto, otros tantos bres System.Transactions por el cual se pueden obte- de tipos más… todo un lujo. ner transacciones promocionadas. Esto va de hacer posible que se puedan tener varias conexiones a varias Las mejoras del cliente de SQL Server instancias de SQL Server y conseguir que se activen 2005 de forma “automática” las transacciones distribuidas en el caso de participar del mismo objeto Transaction. Hasta aquí lo que son mejoras que afectan a Eso es toda una ventaja sobre todo en aplicaciones de todos los .NET providers. Pero hablando de uno en servidor o de grandes sistemas de información esca- particular, qué menos que comentar la estrella del lables donde la información puede estar distribuida momento: el .NET Provider de SQL Server 2005. en múltiples servidores. Este nuevo sistema gestor traerá consigo líneas y líneas de artículos por su nuevo look y comporta- Protección ante caídas miento. Es lógico pensar que muchos de los cam- bios de ADO.NET tienen que pasar por adaptarse Hablando de sistemas empresariales, es necesa- a las mejores de este sistema gestor. Centrándonos rio también tener en cuenta la alta disponibilidad en System.Data.SqlClient, se nos ofrece nuevo: de los servidores. Una cosa es que contemos con un cluster de SQL Server y eso ya de por sí nos MARS ofrezca una alta seguridad de forma transparente y otra muy distinta que nos pidan sistemas robustos No es que nos vayamos hasta Marte a descubrir en el caso de no disponer de estas tecnologías. Para nuevas cosas, no. Es el nuevo mecanismo de recu- eso SQL Server 2005 cuenta con unas herramien- peración de múltiples conjuntos de resultados tas de control de fallos basadas en tecnologías de empleando una sola conexión. En las versiones ante- mirroring de la base de datos, por los cuales si uno riores el problema que existía –aunque más bien de los espejos falla puede activarse el otro. Pero es oculto al desarrollador– era el de lanzar comandos en este momento cuando el cliente puede llegar a simultáneos sobre la misma conexión activa. Puesto perder la conexión y necesitar reconectarse, si no que la limitación impuesta es la de tener un cursor con la misma, con otra fuente. Para minimizar el por conexión ya sea por llamada a un procedimiento impacto de estas caidas, el cliente SQL Server pro- almacenado, ya sea por un comando directo, ya que porciona de forma transparente el control de estas en los servidores se generan cursores implícitos. situaciones, retomando el control al iniciarse sub- Intentar lanzar dos comandos seguidos falla en siguientes operaciones SQL tras la caída. Impre- ADO.NET 1.1 si los realizamos sobre el mismo sionante. Y todo controlado con un sencillo coman- objeto Connection, llevando a un desarrollador a do agregado a la cadena de conexión. abrir más objetos Connection de los que tenía pre- vistos. Pero en ADO.NET eso ya está superado y Soporte de nuevos tipos de datos podremos hacer a través de una conexión “lo que nos de la gana” en este sentido. MARS será el meca- Como parte de las muchas novedades de SQL nismo por el cual los desarrolladores podrán redu- Server 2005, están sus nuevos tipos de datos. Tipos cir el número de conexiones abiertas ante el hecho que van desde refinamientos de los ya existentes

Manía de lanzar múltiples comandos y recuperar múlti- –como los nuevos MAX BLOB, del estilo a VARBI- ples conjuntos de datos. NARY(MAX)–, hasta integración de tipos ya conoci- dotNet < < 78 << dnm.ado.net

dos como el XML; llegando hasta el avanzado UDT o ejemplo, un cambio de datos en una fila– emplean- USer Defined Type que pasa por auténticas clases do para ello los omnipresentes delegados. Imaginaos .NET. Todos estos nuevos tipos están recogidos en la utilidad de esta clase en entornos Web a la hora el espacio de nombres System.Data.SqlTypes y agre- de combinarlo con el objeto Cache o en entornos de ga las nuevas enumeraciones SqlUdt o SqlXml, que clientes desconectados de cualquier tipo de cliente junto con el método GetValue( ) eliminan cualquier .NET. Las posibilidades son muy interesantes, con limitación que se le pudiera achacar a este meca- el mínimo esfuerzo. Pero cuidado, que os veo, que nismo de intercambio de datos (capaz de devolver esto normalmente conllevará a recargar determi- clases, streams XML…etc). nadas partes del DataSet… pero no abuséis de ello en entornos de alta transaccionalidad y multitud de Herramientas de migración y copia masiva de filas. Antes que nada, echadle cabeza… datos.Tareas “bulk copy” Otra de las enormes mejoras que se han inclui- SqlCommand comando = do en este proveedor, es la capacidad de poder new SqlCommand("SELECT au_id, au_lname FROM dbo.authors", conexion); implementar mecanismos de transferencia masiva de datos, de una forma similar a cómo operan los // Registrar el delegado de dependencia conocidos mecanismos DTS de SQL Server. Las SqlDependency depend = new SqlDependency(comando); tareas bulk copy permitirán que podamos transferir depend.OnChanged += new OnChangedEventHandler(OnDatosCambiados); información –por ejemplo, de un DataSet– desde un conn.Open(); origen a un destino, como si de una instrucción SQL SqlDataReader rdr = cmd.ExecuteReader(); se tratase, simplificando, en mucho, este tipo de // procesar los datos recuperados procesos a como se hacían anteriormente en ... ADO.NET 1.1. Algo similar a lo que podemos en el código fuente 4: void OnDatosCambiados(object caller, SqlNotificationEventArgs e) { MessageBox.Show("Los datos origen han cambiado: "+e.Info); } // Cargar un Dataset con datos y procesarlo ... // Copiar los datos a SQL Server Fuente 5.Capturar eventos sobre los orígenes de datos

string cadConexion = GetCadenaConexion(); SqlBulkCopy bcp = new SqlBulkCopy(cadConexion); Otra forma de hacer las cosas, que ya comenta- bcp.DestinationTableName = "Empleados"; remos con más detalle en otros artículos, lo pro- bcp.WriteToServer(dsEmpleados); porcionan las nuevas colas de SQL Server 2005. A través de “conexiones” a colas de eventos median- Fuente 4.Transferencias de datos te subscripciones SQL y empleando la clase SqlNotificationRequest podremos tanto capturar eventos como reaccionar en consecuencia emple- Entre las posibilidades que nos brinda esta clase ando prototipos de comunicaciones asíncronas. tan particular, estará la capacidad de coger datos tan- Todo un mundo… to de un DataSet como de un objeto de tipo Reader –lo cuál nos brindará infinitas posibilidades a la hora de Mejoras en las tecnologías desconectadas recoger los datos de origen–. de los datos La potencia de los eventos de datos No podíamos terminar este artículo sin hablar de otro gran segmento del acceso a los datos. Y es el de Una utilidad fantástica que .NET traía de serie, las clases desconectadas. Nuestra querida mega-cla- era la que nos permitía capturar eventos del siste- se, DataSet. En esta clase más que novedades, hay mul- ma de archivos para poder actuar en consecuencia. titud de mejoras. Todas ellas relacionadas con su opti- Pues bien, a todos los que trabajamos con objetos mización y flexibilidad. desconectados, ¿cuántas veces nos ha hecho falta La mejor de esas modificaciones está en el objeto algo similar? Y ¡qué complejo a podido llegar a ser! DataTable, que podríamos decir que ahora es un poco Pues bien, gracias a los mecanismos nuevos de SQL más granular que antes. ¿Qué quiero decir?, pues que Server 2005, ya es posible estar “al loro” de estos ahora es capaz de hacerse persistente y poder vivir tantos para actuar en consecuencia. Para ello se nos independientemente de un DataSet. Esto que no pare- proporciona la interesante clase SqlDependency por ce mucho, aporta muchas ventajas a la hora de tratar Manía la cual podremos capturar eventos sobre datos –por tanto los orígenes de datos como la gestión del pro- dotNet < < 79 << dnm.ado.net

pio DataSet, que podía llegar a manejar volúmenes de datos y los mecanismos de filtro y orde- de información considerables. nación integrados– y BindingNavigator –que ofrece un nuevo sistema de navegación grá- fico de usuario más versátil y potente que los anteriores– y, cómo no, el visor de los nue- vos Reporting Services de SQL Server 2005. NOTA Todo un lujo.

Casi todas las mejoras de los objetos des- conectados son transparentes al programa- dor. Pero un DataTable “Stand-Alone” y un formato binario nuevo de seriación hará las [ delicias de los más "friquis". ]

La otra gran mejora, está en la adición de los mecanismos de persistencia de los propios objetos Dataset, que ahora permiten una seriación binaria, que seguro muchos notarán que mejora sensible- mente las comunicaciones en muchos casos aplica- dos al negocio. Es más, ahora será posible imple- mentar sistemas muy optimizados pudiendo inter- Figura 1. La paleta y los nuevos controles en acción. cambiar, en procesos de Remoting, datos empleando DataSet. ¡Una pasada! Más cositas que a más de uno le puede interesar: b) Soporte nativo de acceso a SQL Server 2005. a) La posibilidad de trabajar con Datasets de “solo Entre los que se incluye la creación de un lectura” con la nueva clase DataTableReader. proyecto SQL, editores para crear objetos b) La posibilidad de poder crear tablas a partir de de todo tipo y un potente editor de código vistas. gestionado a nivel de base de datos. c) La posibilidad de indexar campos de un c) Smarttags (etiquetas inteligentes) para la rápida DataTable que optimizan los procedimientos configuración de los controles de datos. DML en tablas. d) Búsquedas rápidas de filas, empleando méto- dos IndexOf(). e) Poder cambiar las columnas de posición. f) Mejoras internas del motor de inferencia, de la seriación de tipos personalizados. g) Un largo etcétera que ya se verán en futuros artículos, pero que os prometo que son trans- parentes al desarrollador, y que optimizarán aún más la ejecución del código.

Visual Studio 2005: Más herramientas Figura 2. SmartTags de datos en acción. que nunca Para terminar, que no hay casi más hueco… En fin, que podríamos hablar de todo ello con hablar de otra de las estrellas desde la cual poder mucha más profundidad, pero eso lo dejaremos a explotar al máximo el acceso a los datos: Visual futuros artículos… ya que, de nuevo, Microsoft ha Studio 2005. Así como las versiones anteriores ya conseguido que podamos derramar chorros de tin- ofrecían multitud de herramientas muy prácticas ta con una nueva versión que lejos de haberse que- para el acceso a los datos, Visual Studio 2005 no se dado estancada, ha ofrecido multitud de mejoras y queda atrás y nos ofrece: multitud de añadiduras que harán que el desarro- a) Una nueva paleta ampliada de controles para el llo de proyectos de datos sea más interesante, sen-

Manía acceso a los datos. De ellos, los más interesan- cillo y productivo aún de la que ya era. De nuevo, tes son BindingSource –encapsula un origen me quito el sombrero. dotNet < < 80 Por Alberto Ruiz Por Alberto < Como consecuencia, < lo largodelciclodevidalasaplicaciones. de atodoslosmiembrosdelequipodesarrollo Team System sionales eslacomunicaciónentreellos. mayor retoconelqueseencuentrannuestrosprofe- desarrollar ydesplegarestassoluciones.Quizásel hoy díarequierenequiposmultidisciplinarespara soporte atodoelequipodedesarrollo,estasson: System incluyeherramientasqueproporcionan ciones sobresistemasWindows. Visual StudioTeam de vidaparalaconsecucióndesplieguesolu- arquitecturas prescriptivas,yherramientasdeciclo herramientas queintegranorientacióndeprocesos, tiplicada tantoenlasáreas desistemascomodesarrollo. yseve mul- la multitud detecnologíasysucomplejidadagrava másestasituación, Por otro lado, les dificultaengranmedidalaejecucióndeproyectos desoftware. procedimientos yherramientas actua- La diversidad demetodologíasexistentes, ¿Qué es Visual Studio Team System? • Visual StudioTeam Systemesunconjuntode permiten alosarquitectosyresponsables tec- ción secentranenlosdiseñadores visualesque Las característicasmásrelevantes deestaedi- Visual StudioEdiciónparaArquitectos deSoftware Visual Studio2005 Team System facilita estacomunicaciónylaextien- Figura 1. las aplicacionescomplejasde Visual Studio2005 Team System. Visual Studio . datos de equipo deproyectoesgestionada porlabasede CaliberRM. ceras compañíascomoporejemploBorland tas talescomoMicrosoftExceloherramientasdeter- ble realizarlacapturaderequisitosconherramien- el ciclodevidadelproyecto.Adicionalmenteesposi- mecanismos detrazabilidadsobreestosdurantetodo la capturaderequisitoslosproyectosyestablece trabajo determinado. Enfuncióndelametodolo- utiliza paratrazarlasasignaciones yestadosdeun base dedatosqueVisual Studio Team Foundation Gestión deproyectos VSTS 2005disponedecapacidadespararealizar Cualquier elementoplaneado otrazadoporel • • • yectos conmenosesfuerzo. tionar yseguirelprogresoestadodelospro- servidor quepermitenalasorganizacionesges- mientas decolaboraciónequiposbasadasen despliegue. ficar elrendimientodeaplicacionesantesdel bas decargaquepermitenalosequiposveri- Software aplicación. principio ydurantetodoelciclodevidala e introducirunaltoniveldecalidaddesdeel ten alosequiposaumentarsuproductividad mientas dedesarrolloavanzadasquepermi- Software pios entornosoperacionales. vicios quepuedenservalidadascontrasuspro- nológicos diseñarsolucionesorientadasaser- Visual StudioTeam FoundationServer Visual StudioEdiciónparaTesteadores de Visual StudioEdiciónparaDesarrolladores de work items . Fundamentalmenteincorporaherra- . Herramientasavanzadasdeprue- . Un dnm. work ítem arquitectura es unregistrode . Herra- 81 <

la primera release de los diseñadores de sistemas distribuidos que permite obte- ner acceso a los servicios básicos o clien- tes (servicios Web, aplicaciones Web, aplicaciones Windows, servicios exter- nos o bases de datos externas). Más ade- lante se publicará un SDK que amplia- rá estas funcionalidades. Dynamic System Initiative (DSI) es una amplia iniciativa de Microsoft para unificar hardware, software, y provee- dores de servicios alrededor de una nue- va arquitectura basada en System Definition Model (SDM). Este último es un anteproyecto vivo que cubre el ciclo de vida y unifica las políticas de opera- ciones de IT con los requisitos opera- cionales de las aplicaciones. En tiempo de diseño permitirá a través de Visual Studio capturar las políticas de softwa- re y describir los requisitos operaciones de la aplicación. En tiempo de desplie- gue, la descripción de la aplicación per- mitirá al sistema operativo automatizar el despliegue completo de la aplicación y alojar dinámicamente un conjunto dis- tribuidos de servidores, almacenamien- to, y recursos de red que la aplicación requiere. No obstante, no podemos pasar por alto a Visio, que sigue incorporado como herramienta de diseño en Visual Studio 2005. Sin embargo, en la cons- trucción de aplicaciones de un domi- nio específico como aplicaciones orien- tadas a servicios, los diseñadores de sis- Figura 4. Diagrama de un Datacenter lógico. temas distribuidos son más idóneos. Es posible encontrar más información Los arquitectos de infraestructura Entre algunas otras características sobre diseñadores de sistemas distri- también pueden crear abstracciones sobresalientes en este apartado, cabe buidos en http://msdn.microsoft.com/ lógicas de sus centros de datos y vali- destacar que las configuraciones de los vstudio/teamsystem. darlos contra las restricciones de la apli- servidores Web basados en IIS descri- cación o centro de datos diseñado por tas en el modelo pueden ser replicadas Herramientas de desarrollo el arquitecto de aplicaciones sobre un automáticamente desde un servidor ya avanzadas despliegue real. Los informes genera- existente evitando tener que volver a dos desde esta validación ayudan a docu- parametrizar todos los detalles del host Las herramientas de análisis estáti- mentar el despliegue final. para duplicar el elemento. co de código que acompañan a Visual Los diseñadores de sistemas distri- Los lenguajes soportados para los Studio 2005 permiten detectar defec- buidos, ofrecen restricciones y valida- diseñadores de sistemas distribuidos tos en el código inspeccionando el ciones contra Web Service Enhancements en primera instancia serán Visual C++ código fuente o los binarios sin nece- (WSE), Seguridad IIS, Seguridad (Extensiones Manejadas), Visual Basic sidad de ejecutarlos. PREFast o FxCop SQL, y ASP.NET. A modo de ejem- y Visual C#. Sin embargo, el diseña- son herramientas de este estilo. Estas plo, esto permite asegurar que un com- dor de clases soportará todos los len- herramientas se integran con el proce- ponente que requiere un tipo de segu- guajes .NET suministrados por so de compilación produciendo adver- ridad, sólo podrá ser distribuido sobre Microsoft. tencias o errores en la lista de errores un sistema que soporte ese tipo de Desde el punto de vista de la exten- de Visual Studio y facilitando la nave- Manía seguridad. sibilidad se ha creado un modelo para gación hasta el defecto con un solo clic. dotNet < < 83 << dnm.arquitectura

Aunque las herramientas ya disponen pasar de una base de reglas para el análisis estático, es de datos Visual posible agregar nuevas reglas a través Source Safe a Team de las extensiones. System. Por últi- mo, cabe destacar que el nuevo siste- ma de control de código fuente ex- Figura 6. Test Manager. pone un conjunto de API que permi- Los proyectos de test son proyectos ten ser consumidas por terceras herra- de Visual Studio estándar creados espe- mientas y que pueden integrarse con cíficamente para contener las pruebas. Visual Studio facilitando la personaliza- Figura 5. Análisis de código. Este tipo de proyectos permite a los usua- ción de procesos en la gestión de la con- rios establecer una línea clara entre el figuración de cada organización. código desarrollado Application Verifier es una herra- y el código utilizado mienta de Visual Studio que expone ins- para el aseguramien- trumentación ya presente en el sistema to de la calidad. Por operativo Windows. La instrumentación otro lado Team realiza verificaciones en los programas en System incluye en el ejecución dentro de áreas seleccionadas Framework de Test como consumo de memoria, utilización un sistema de gestión de secciones críticas o modo de utiliza- que permite distri- ción. Permite detectar problemas de sola- buir las pruebas en pamiento de memoria, bloques alojados máquinas locales y en el heap, reutilización después de borra- remotas. Figura 7. Gestión de código fuente. do, doble borrado y contaminación del Realizando una heap. En el área de secciones críticas detec- comparación rápi- ta operaciones que pueden conducir a da entre Visual Studio Team Test y Conclusión deadlocks o pérdida de recursos. En la par- Application Center Test podríamos te de modo de utilización detecta inten- decir que las características que dan A medida que las aplicaciones cre- tos de reutilización de manejadores que soporte a las pruebas de carga son cen en complejidad, los equipos de desa- ya no son válidos. completamente nuevas, mientras que rrollo necesitan los mismos principios Code profiler es un mecanismo de el resto de prestaciones soportadas por RAD de simplicidad y flexibilidad para Visual Studio Team System que perió- ACT han sido ampliamente mejora- ir escalando con ellos. Reducir la com- dicamente interrumpe la ejecución de das. Entre las características que plejidad significa aumentar la producti- una aplicación para determinar qué fun- actualmente no están incorporadas se vidad, ahorrando costes mientras se ción se está ejecutando. Mantiene un encuentra el soporte para la automa- reducen los tiempos de desarrollo. Con conteo para cada función que es mos- tización de pruebas de interfaz de Visual Studio Team System las organi- trado sobre una estadística una vez fina- usuario (GUI), sin embargo, este tipo zaciones pueden: lizada la ejecución del profiler para deter- de funcionalidades serán suministra- • Reducir la complejidad de dis- minar el rendimiento medio de cada das por herramientas de terceros que tribución de modernas solucio- función analizada. Sin embargo, esta se integrarán en Visual Studio. nes orientadas a servicios, opti- funcionalidad no estará disponible para mizándolas para los entornos aplicaciones 64 bits hasta siguientes ver- Control de código fuente operacionales. siones de Team System. • Facilitar colaboración entre Visual Source Safe continúa acom- todos los miembros de un equi- Herramientas de testeo pañando a Visual Studio como una solu- po de software, incluyendo ana- ción individual o para pequeños equi- listas de negocio, jefes de pro- Las pruebas en Visual Studio Team pos. Team System incluye un servidor yecto, arquitectos, desarrolla- System son gestionadas a través del Test y una gestión de la configuración sus- dores, testers, y directores de Manager, que es un visor de los tipos de tentada sobre base de datos que es capaz operaciones. pruebas asociados a un proyecto. Los de escalar entre un gran número de • Personalizar y extender sus pro- tipos que se pueden incluir en el visor equipos y proyectos. pios procesos internos y marcos

Manía son: pruebas manuales, unitarias y prue- En la versión final del producto de trabajo o elegir entre más de bas de carga. existirá un proceso de migración para 450 productos adicionales. dotNet < < 84

dnm.todotnet.qa

Dino Esposito Visual Studio 2005 tips & tricks

Visual Studio 2005 es un entorno contenedor que integra la funcionalidad de múltiples diseñadores visuales. Hay diseñadores para construcción de aplicaciones Windows Forms, para sitios Web ASP.NET,para servicios Web, etc.Tiende a ofrecer un montón de asistentes para facilitar la labor y hacer que la escritura de código sea la menor posi- ble.A algunos les encantan los asistentes, otros los odian.

< < Vamos a comenzar este recorrido por Visual Studio con una especie de pregunta existencial: Tengo una pregunta existencial: ¿Hay vida más allá de los asistentes en Visual Studio 2005? Si los utilizo, ¿Hay vida más allá de los asis- ¿podré seguir escribiendo código manualmente? ¿Es arrastrar-y-soltar el futuro de la programación? tentes en Visual Studio 2005? La mayoría de las cosas que conozco hoy se remon- ¿Es arrastrar y soltar el futuro tan a hace quince años, cuando la única forma de pro- gramar aplicaciones Windows era utilizando el SDK. Se ¿ de la programación? trataba de un API al estilo C, expuesto por el sistema operativo. Trabajar con el SDK de Windows, te da ese sentido especial de los sistemas de ventanas, te pone en contacto con la maquinaria de bajo nivel, y al final, es difícil, y a menudo, frustrante. Por esa razón se inven- grupo de desarrollo, y los asistentes me ofrecieron? una taron primero, Visual Basic, y después, los asistentes. excelente herramienta para escribir código más rápi- Empecé a jugar con los asistentes en Visual Studio damente, y de acuerdo con un conjunto de premisas 4.0. En ese momento, un asistente era simplemente corporativas. En ese momento, era un fan de los asis- una librería de MFC, que debía registrarse e integrar- tentes, aunque, en realidad, era un fan de los asisten- se con el IDE de Visual Studio. El asistente creaba un tes personalizados. ¿Qué es un asistente personaliza- proyecto con un número predeterminado de ficheros do? Uno que te escribes tú mismo para ayudarte a ti y para formar una aplicación con un conjunto de capa- a tu equipo a desarrollar con ciertas características, más cidades definidas por el usuario. Estaba dirigiendo un rápido, con unos pocos "clicks”. ¿Cuál es la diferencia, si la hay, entre un asistente y otro? Es más o menos la misma diferencia entre los cul- tivos normales y los biológicos. Usualmente, no sabe- el único asistente realmente bueno, es mos qué es lo que contienen los vegetales que compra- mos en un supermercado. Pero si lo cultivas tú mismo, el que construyes tú mismo (o que sabes mucho de ellos. La moraleja de esto es que muchos Dino Esposito asistentes de Visual Studio esconden código de la vista es redactor de dotNetManía. consigues conocer al detalle). Utiliza Formador,consultor y escritor predeterminada y transmiten una sensación de omnipo- afincado en Roma. Miembro los asistentes para ahorrar tiempo, no tencia. Haces “clic” y el código se despliega ante tus ojos. del equipo de Wintellect, ¿Es eso lo que quieres? ¿Sabes realmente lo que hace ese Dino está especializado en para aprender programación código? Por ejemplo, el control SQLDataSource, hace que ASP.NET y ADO.NET.Puede enviarle sus consultas a la paginación a través de un origen de datos sea trivial. [email protected] Pero si no conoces exactamente cómo funciona, podrí- << dnm.todotnet.qa

as terminar con código ineficiente que nunca serías capaz ye ninguna de las características adicionales de IIS, de escribir en Visual Studio .NET 2003. tales como la metabase. En otras palabras, utiliza libre- Parafraseando un viejo lema del cine, el único asis- mente el servidor local para propósitos de depuración, tente realmente bueno, es el que construyes tú mismo (o pero no te fíes plenamente de él para la distribución que consigues conocer al detalle). Utiliza los asistentes de la aplicación. para ahorrar tiempo, no para aprender programación. Lo que no soporto de Visual Studio 2003, es que plantea una serie de restricciones a los desarrollado- res, tales como IIS, Extensiones de Servidor de FrontPage, y el uso de proyectos. ¿Me va a pasar lo ¿Qué es un DiffGram? Es la mismo con Visual Studio 2005?, a no ser que solucio- ne este tipo de problemas… representación XML del estado de un Por supuesto, estamos hablando de Visual Studio DataSet, incluyendo filas actuales, 2005 y aplicaciones ASP.NET. Por supuesto, la ver- sión 2005 suministra una forma mucho más sencilla y cambios realizados, y errores amigable de construir aplicaciones ASP.NET. Las mejoras clave, realmente solucionan muchos de los pendientes en filas de la tabla. problemas reportados por los programadores en los pasados años: falta de acceso FTP o IIS a máquinas remotas, IIS como único entorno de depuración, nece- sidad de soluciones .SLN para construir, no ya apli- caciones, sino una simple página, o falta de opciones Visual Studio 2005 soporta múltiples formas de abrir alternativas al “code-behind”. sitios Web. Además de usar las FPSE (Extensiones de Servidor de FrontPage), puedes acceder a tus ficheros de sistema mediante FTP o ubicaciones del sistema de fiche- ros. También puedes acceder a la instalación local de IIS, Lo que no soporto de Visual navegar por la jerarquía de directorios virtuales existen-

te, y acceder a las raíces virtuales o crear nuevas entra- [email protected] Studio 2003, es que plantea das. Puedes abrir sitios Web existentes mediante el pro- tocolo FTP y luego crear y editar archivos. Sin embar- restricciones tales como IIS, go, debe de tenerse acceso al sitio FTP y permisos sobre los directorios correspondientes. El directorio debe de Extensiones de Servidor de existir, porque Visual Studio no puede crear nuevos sitios ¿ Web vía FTP. FrontPage y el uso de proyec- Además, Visual Studio 2005 no compila todo el códi- tos. Me va a pasar lo mismo go del sitio en un único ensamblado, como la versión anterior. En su lugar, utiliza el nuevo modelo de compi- con Visual Studio 2005 lación de ASP.NET y reconoce dinámicamente los tipos de ficheros basándose en el directorio al que pertenecen. De esa forma no sólo se capturan los cambios en los fiche- ? ros .ASPX, sino en los de extensiones .CS o .VB e inclu- Visual Studio 2005, trae buenas noticias a los pro- so los de recursos. Esto desemboca en una especie de gramadores. Lo primero y más importante, IIS ya no compilación dinámica para las clases de soporte “code- es un requisito estricto. De hecho, el producto incor- behind”. Sin embargo, hay que ir con cuidado. Evitar la pora un servidor Web local que hace que IIS sea opcio- compilación explícita de toda la aplicación tiene un cos- nal, al menos para testeo rápido y depuración. El ser- to que debe ser tenido en cuenta. La distribución al ser- vidor Web local es una versión ligeramente mejorada vidor Web debe de constar obligatoriamente de fiche- de Cassini, una herramienta que se lanzó originalmen- ros .VB o .CS. Y aunque los ficheros de código fuente te con WebMatrix. Es importante tener en cuenta que no pueden ser solicitados explícitamente al servidor, están el servidor local representa solamente la opción pre- ahí con el riesgo potencial de que un atacante pudiera determinada. Si abres un proyecto a partir de un direc- acceder a ellos y poner en riesgo la propiedad intelec- torio virtual de IIS, Visual Studio utilizará IIS para tual. Para evitar esto, dispones de dos opciones: precom- depurar la aplicación. pilar todo el sitio para distribuir ensamblados ya cons- El servidor Web embebido es solamente un peque- truidos en el sistema local, o compilar los ficheros de ño archivo de código ejecutable, y no puede reempla- código a un único ensamblado. La pre-compilación del

zar las características de un servidor completo como sitio es otra de las características más interesantes de Manía IIS. Funciona sólo con páginas individuales, y no inclu- ASP.NET 2.0 (no de Visual Studio 2005), que permite dotNet [email protected] < < 87 << dnm.todotnet.qa

ten ciertos archivos y carpetas ocultos, y lo mismo suce- de con las carpetas virtuales de IIS. De forma que, para IIS ya no es un requisito estricto. De ocultar un directorio demasiado grande de la vista del explorador, basta con marcar la carpeta como un direc- hecho, el producto incorpora un torio virtual de IIS. Nada cambia en la aplicación, pero se obtienen una serie de beneficios asociados. Por ejem- servidor Web local que hace que plo, puedes reutilizar tus imágenes más fácilmente (o IIS sea opcional, al menos para testeo cualquier otro recurso), en otras aplicaciones y almace- narlos en cualquier parte del servidor Web. El conteni- rápido y depuración do de un directorio virtual, es automáticamente exclui- do de cualquier operación de distribución y el código fuente tampoco se incluye en el control de código del proyecto. A menudo tengo la necesidad de mover proyec- distribuir aplicaciones Web en un formato listo para usar- tos entre máquinas distintas. ¿Existe finalmente una se, preservando así la propiedad intelectual, y evitando, forma de transportar la configuración del IDE de for- además, ese pequeño retraso inicial en las peticiones, ma fácil y cómoda? debido a la compilación dinámica de recursos. Supongo que eres un típico adicto al trabajo (como Por último, pero no menos importante, Visual Studio yo) y no puedes estar en casa unas pocas horas por la 2005 soporta la edición de ficheros individuales, y no noche sin hacer algo. De ahí la necesidad de transva- requiere de un proyecto para la edición simple de un sar la configuración del IDE de la máquina del traba- fichero en disco. De modo que, si hacemos doble-clic jo al PC de casa. ¿Estoy en lo cierto? Francamente, en un fichero .ASPX en el explorador de Windows, se espero que no. lanza Visual Studio 2005, permitiendo la edición inde- pendiente. A diferencia la versión precedente, IntelliSense y el coloreado del código fuente funciona correctamen- te. La página puede verse, además, directamente en el A menudo tengo la necesidad navegador Web a través del servidor Web local. [email protected] He estado investigando últimamente con Visual de mover proyectos entre Studio 2005. Y tengo razones a favor y en contra del máquinas distintas. ¿Existe paradigma de correspondencia 1 a 1 entre los ficheros en disco y los nodos del Explorador de Soluciones. La finalmente una forma de razón por la que no me gusta, es que si tengo directo- ¿ rios con montones de ficheros (por ejemplo, ficheros transportar la configuración gráficos) las operaciones de copiar y pegar son muy len- tas, por no mencionar las operaciones tipo chek-in y check- del IDE de forma fácil out con Visual SourceSafe. ¿Sugerencias? Parece que esta es una de las preguntas más frecuen- y cómoda? tes a las que Scott Guthrie –el Manager de proyecto de ASP.NET– ya respondió públicamente en su sitio Web http://weblogs.asp.net/scottgu. Es importante tener en cuen- Típicamente, cuando trabajas con Visual Studio,? ta que Visual Studio no muestra todos los ficheros y car- desarrollas macros, reordenas menús, defines nuevos petas en el Explorador de Soluciones, sino que se omi- valores predeterminados, añades nuevos controles a la Caja de Herramientas, creas nuevas plantillas de proyec- to y defines nuevos colores y tipos de letra. Toda esta información no es fácil de catalogar si tienes que hacer- tengo razones a favor y en lo manualmente. Por suerte, Visual Studio 2005, sumi- nistra una nueva caja de diálogo de contra del paradigma de “Importación/Exportación de configuraciones”, desde el menú de “Herramientas”. Seleccionas el conjunto de correspondencia 1 a 1 entre valores de configuración que quieres almacenar y los los ficheros en disco y los guardas en un fichero. El fichero puede almacenarse en ¿ cualquier parte y recibe una extensión .vssettings. A pesar de la extensión, es un fichero XML. Basta con nodos del Explorador de mover el fichero a la máquina de destino e importarla. Manía Soluciones No puede ser más fácil.

dotNet Traducción por Marino Posadas [email protected] < < 88 ? << dnm. biblioteca.net < < ware opensaren softwarehechoconlanueva versiónalaluzdeloyaconocido. dable paraprogramadoresque conozcanlaversiónanterioryquieranactualizarsoft- fin, unarevisiónenprofundidad detodolodisponibleenestaversión,muyrecomen- Framework 2.0,usandoC#como lenguajebaseparatodoslosejemplosdecódigo.En sino (ymásimportanteeneste caso),todaslasnovedadesdelibrerías.NET Se tratadeunaobraextensa, en laqueserecorren,nosololasnovedadeslingüísticas, y vaencaminodebatirtodossusregistrosanteriores. Amazon dentrodesugénero.Bien,pues,estaobrayahavendido másquelasotrasdos, .NET andthePlatform:anadvancedguide”,quese situaron enlos reconocimiento conlapublicaciónde“COMand.NETinteroperability” y“Visual Basic es nuevo,ylohaceconlaprofundidadsuficienteparanodejarcabossueltos. la versiónanteriordellenguaje,deformaqueellibrosecentrafundamentalmenteenlo No setratadeunaobrainiciación,noobstante.Seasumenconocimientossuficientes a lanuevaversión. justamente loquenecesitaeldesarrolladordeC#quiereactualizarsusconocimientos obras anteriores,yespecialmente,consu“ProgrammingC#”,abordaenestapequeñaobra Idioma: Inglés Publicado: 2005 Páginas: 1.032 ISBN: 1590594193 Editorial: APress Andrew Troelsen Pro C#2005and the.NET2.0Platform nos decíaelmespasado tenerse como“linguafranca”yreferentedelasnovedadesenlenguajesdesarrollo, El lenguajeC#sigueacumulandointeresantescambiosestructuralesysemánticosparaman- Idioma: Inglés Publicado: Abril,2005 Páginas: 239 ISBN: 059600799X Editorial: O'Reilly Jesse Liberty developer's notebook Visual C#2005:A Autor deotras6obrasrelacionadasconlaprogramación, Jeff Prosise . Jesse Liberty dnm.biblioteca.net , queyanoshabíaconvencidoconsus Troelsen obtuvo sumáximo best sellers de 89 <

Marino Posadas

Microsoft y la seguridad Anti-spyware en Windows Vista y otras novedades

Según Greg Sullivan, Lead Windows Product Manager en Microsoft (del que publicaremos una entrevista en breve), el software de anti-spyware que ahora está sien- de la adquisición de Sybari Software por Microsoft hace noticias do distribuido gratuitamente para versiones anteriores algún tiempo. de Windows, formará parte de Windows Vista, en un esfuerzo por suministrar mejores servicios básicos de Curiosamente, hace unos días, Microsoft invitó a un nume- seguridad para los usuarios no corporativos. La noticia roso grupo de “hackers éticos”, a investigar vulnerabilida- se inscribe dentro de la política iniciada por la compa- des en su software, en el evento de seguridad Blue Hat. ñía acerca de la importancia de la seguridad, y coincide Y, casi de forma paralela, Tony Chor (Lead Program casi en el tiempo con el anuncio de un nuevo software, Manager para IE7) mostraba en Malasia algunas de las nue- Microsoft Client Protection, cuya disponibilidad en vas características de IE7 Beta 2, enfatizando en el hecho noticias. beta parece próxima. Dentro de esta línea estaría la pre- de que no se trata de un conjunto de nuevos parches, sino sencia de Windows OneCare Live, un sistema antivi- de un cambio profundo a nivel de estructura, con la segu- rus y anti-spyware que parece uno de las consecuencias ridad en mente en todo momento.

Documentos y código en la Red Utilidades del mes

Script para automati- DonationCoders. Este mes zar el asistente de queremos dedicar esta sección, grabación de CD en no a un producto concreto Windows XP: Fernando Muñoz el webmaster de sino al sitio especializado Fermu's Website (http://www.fermu.com/content/view/ DonationCoders, en el que participan varios autores, algu- 262/2/lang,es) nos trae este interesante ejemplo de códi- nos de los cuales han aporta- go de script, producido por él (que no quiere atribuir- do utilidades notables. Uno de se su autoría) y que puede además darnos ideas para ellos, Skrommel, presenta una otros usos similares. utilidad que recomendamos (Process Guard), que monitori- za (y avisa, a voluntad) situa- ciones límite del sistema (respecto al uso de memoria, puertos, disco, etc). Pero todo el sitio es realmente útil. < < http://www.donationcoders.com. Sitios recomendados

VBaccelerator: Sitio con notables aportaciones de código fuente, espe- cialmente en Visual Basic .NET. Sin haberlo hecho a propósito, una de las novedades actuales es un WWWCoder: Interesante sitio con artí- código fuente en VB.NET que permite mediante las API Image culos y código fuente sobre desarrollo en .NET Mastering API (IMAPI) controlar el proceso de grabación, selec- de cara a la programación Web y cliente/ser- ción de contenidos y producción de CD (http://www.vbaccelera- vidor. Actualiza con bastante frecuencia. tor.com/home/NET/Code/Libraries/Writing_CDs/Writing_Data_CDs/ Disponible en http://www.wwwcoder.com/main/

Manía article.asp). Default.aspx dotNet < < 90