Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework
Transcripción
Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework
nº20 noviembre 2005 • 8,50 € (España) Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET Novedades en la seguridad en Visual Studio 2005 • Programando para 64 bits con .NET Framework 2.0 • Novedades para desarrollo Web en ASP.NET 2.0 • Optimización ASP.NET 2.0 • Novedades en el estándar de C#• “Reflexionando” y haciendo “reflexión” sobre la genericidad de .NET 2.0 • Novedades de Visual Basic 2005• ¿Maestro-detalle con Visual Basic 2005? • El IDE de V isual Studio 2005 • Novedades en la extensibilidad de Visual Studio 2005 • ADO.NET 2.0, más y mejor acceso a datos dnm.editorial dotNetManía Visual Studio 2005 Vol. II •Número 20 • Noviembre 2005 Precio: 8,50€ Editor Paco Marín ([email protected]) Administración Pilar Pérez ([email protected]) Asesor Técnico Marino Posadas ([email protected]) Redactores Antonio Quirós, Dino Esposito, Guillermo 'guille' Som, Jorge Serrano, José Manuel Alarcón, Luis Miguel Blanco, Miguel Katrib (Grupo Weboo). Colaboradores habituales Ángel Esteban, Braulio Díez, Daniel Mazzini, Eladio Rincón, Erich Bühler, Fernando Nogueras, Jorge Crespo Cano, José Miguel Torres, Miguel Egea, Octavio Hernández, Pablo Abbate, Pepe Hevia, Rodrigo Corral y Salvador Ramos. Además colaboran en este número Alberto Ruíz, Carlos Quintero, Javier Izquierdo, José Murillo, Mario del Valle y Sergio Vázquez Edición y Suscripciones .netalia c/ Robledal, 135 28529 Rivas-Vaciamadrid (Madrid) Tf. (34) 91 666 74 77 Fax (34) 91 499 13 64 Publicidad Mediadev Sophie Mancini ([email protected]) Tf. 93 426 22 57 - 670 99 74 64 Fax. 93 423 11 40 Imprime Gráficas Vallehermoso www.graficasvallehermoso.com ISSN 1698-5451 Depósito Legal M-3.075-2004 << Bienvenido al número 20, de noviembre de 2005, de dotNetManía, el número que más horas de sueño nos ha quitado :-). El día 7 de noviembre se habrá presentado oficialmente la nueva versión Visual Studio 2005, junto con SQL Server 2005 y BizTalk Server 2006. Por este motivo hemos querido hacer un número especial dedicado exclusivamente al nuevo Visual Studio 2005, tal y como hicimos ya con SQL Server 2005. Nuestro objetivo es que usted tenga, después de leerlo, una idea bastante aproximada de las novedades más importantes de Visual Studio 2005 y .NET Framework 2.0. Para lo cual hemos dedicado 32 páginas más de lo habitual y un buen puñado de horas extraordinarias. Aún así, han quedado cosas en el tintero pues las novedades son muchas, ciertamente. Este mes publicamos las entrevistas a Brian Keller, Program Manager de Visual Studio 2005, y a Mike Hernández y Donald Drake, del equipo de desarrollo de Visual Studio Tools for Office 2005, otro de los grandes cambios en esta versión. Hemos escrito sobre algunas ediciones nuevas: Visual Studio Team System y Visual Studio Web Developer Express Edition. Procuramos abarcar las novedades de .NET Framework más relevantes: la nueva capacidad de generar código nativo de 64 bits, las novedades en cuanto a la seguridad, los nuevos ADO.NET 2.0, .NET Compact Framework 2.0 y ASP.NET 2.0; este último con dos artículos, uno genérico y otro más en detalle enfocado a la optimización. Y también, cómo no, algunas novedades que afectan a los lenguajes de programación, con artículos generales para Visual Basic y el nuevo estándar ECMA de C#; además, otro más específico de generics con C# y uno más explicando la generación de código para Visual Basic con uno de los asistentes. Microsoft ha puesto especial cuidado en ahorrarnos líneas de código innecesarias; según comenta José M. Alarcón en su artículo, hasta un 70% en ASP.ET 2.0 con respecto a ASP.NET 1.x. No nos hemos olvidado del IDE de Visual Studio 2005, nuestro banco de trabajo, que sufre cambios significativos. Enfocado desde un punto de vista general y también más específicamente con las novedades sobre la extensibilidad. Seguramente debimos hacer más hincapié en las nuevas capacidades de despliegue; por supuesto, las cinco páginas dedicadas a Team System son insuficientes; las dos dedicadas a seguridad sólo dan para apuntar novedades; nos hemos dejado atrás a J#,... En fin, faltan muchas líneas por escribir, afortunadamente. Aquí no hace más que comenzar nuestro trabajo con esta nueva versión. Mi más sincero agradecimiento a las personas de Microsoft Ibérica que nos han apoyado incondicionalmente y, por supuesto, a todos los redactores que se han implicado y que han trabajado duro para que esto fuera un todo y no la suma de sus individualidades. Lo mejor es que se ponga cómodo, pase página y deje esta editorial para leer algo más interesante. <<dotNetManía Dedicada a los profesionales de la plataforma .NET 3 20 dnm.sumario 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 dnm.sumario 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 6 noticias.noticias.noticias.noticias.noticias.noticias << dotNetManía << dnm.noticias Business Objects presenta BusinessObjects XI Release 2 Business Objects ha anunciado hoy la disponibilidad de BusinessObjects XI Release 2. Las mejoras y los nuevos productos que incorpora BusinessObjects XI Release 2 ofrecerán a los usuarios una mayor simplicidad de manejo, información más fiable, así como la posibilidad de estandarizar toda su infraestructura en torno a una única plataforma de BI. permite a los usuarios realizar consultas y análisis sobre esas fuentes de una forma más sencilla. Ahora los usuarios pueden integrar información procedente de bases de datos OLAP y relacionales y efectuar consultas y análisis de manera integrada a partir de esos datos, como si estos procediesen de una sola fuente. BusinessObjects Desktop Intelligence Business Objects ha presentado también BusinessObjects Intelligent Question, un nuevo producto que proporciona una interfaz más fácil de utilizar, que resultará atractiva para un nuevo colectivo de usuarios empresariales. Con Intelligent Question, el usuario de a pie puede formular fácilmente preguntas acerca de su negocio y recibir respuestas sin necesidad de ejecutar consultas ni de entender de datos. El producto BusinessObjects Desktop Intelligence, antes conocido como “cliente completo” (Full Client), permite a todos los clientes de Business Objects disfrutar de todas las ventajas de la plataforma BusinessObjects XI, incluidas las funcionalidades de toma de decisiones colaborativas, la integración con Microsoft Live Office, y la BI Encyclopedia, que ofrece información de contexto adicional sobre el negocio. Con Desktop Intelligence, los usuarios tienen a su disposición un lugar unificado desde donde ver todo el contenido de BI y compartirlo con sus otros colegas. Mejoras en Web Intelligence BusinessObjects Composer BusinessObjects XI Release 2 introduce importantes mejoras en Web Intelligence La nueva versión de Web Intelligence sincroniza datos procedentes de varias fuentes distintas, lo que BusinessObjects Composer es un producto nuevo e innovador que ayuda a los responsables de TI a mejorar su eficiencia y la calidad de diseño de sus proyectos de extracción, transformación y carga de datos BusinessObjects Intelligent Question (ETL). Los proyectos de ETL suelen diseñarse de forma ad hoc, en un proceso para el cual escasean las mejores prácticas. Cuando un responsable de TI empieza a diseñar un proyecto de ETL, ha de definir minuciosamente la correspondencia exacta entre cada fuente de datos y las necesidades empresariales de los usuarios finales. Con BusinessObjects Composer, los desarrolladores pueden documentar fácilmente todo el proceso de ETL. Ahora pueden iniciar nuevos proyectos de ETL de mayor nivel con sólo consultar proyectos realizados anteriormente. Gestión automatizada del ciclo de vida de BI Las nuevas funcionalidades de BusinessObjects XI Release 2 permiten a los responsables de informática gestionar con mayor facilidad las implantaciones de BI de las que ya disponen. Ahora los responsables de TI pueden utilizar herramientas de gestión automatizada del ciclo de vida para mover cualquier objeto u aplicación de BI, a través de los entornos de desarrollo, pruebas y producción. Esta nueva característica permite a las organçizaciones reducir el coste de mantenimiento de sus implantaciones de BI, facilitando al mismo tiempo su ampliación gradual. Para más información: http://www.businessobjects.com. Borland presenta Delphi 2006,C# Builder 2006 y C++ Builder 2006 Delphi 2006, C# Builder 2006 y C++ Builder 2006 ofrecen a partir de ahora Borland Developer Studio –el entorno de desarrollo multilenguaje de Borland para las aplicaciones Microsoft Windows y .NET–. Se trata del único entorno de desarrollo integrado que incluye soporte para las aplicaciones Delphi/Delphi .NET, C, C++ y C#. Los clientes que adquieran cualquiera de estos productos obtendrán un soporte para los cuatro lenguajes sin costes adicionales, con la flexibilidad de personalizar las capacidades específicas del lenguaje. Las nuevas mejoras de Delphi 2006, tales como un sistema de plantillas en directo, refactorings avanzados que automatizan los cambios de código fuente y la integración perfecta con herramientas ALM de Borland, ayudan a reducir el tiempo y el coste de construcción, gestión, mantenimiento y ampliación de las aplicaciones Windows y .NET. Los usuarios de Delphi también pueden acelerar el desarrollo con soporte para ingeniería inversa, “prototipaje” rápido e integración avanzada de IDE con modelado UML, requerimientos, control de versiones, seguimiento de bugs y colaboración entre equipos. Con soporte para Microsoft .NET Framework, ASP.NET, VCL.NET, VCL y Win32 SDK. Además, dado que Delphi soporta tanto Win32 como .NET, los clientes pueden continuar con el desarrollo y mantenimiento de las aplicaciones Win32 existentes, a la vez que simplifican el camino hacia .NET Framework y las aplicaciones Windows de próxima generación. ECO III, el marco único de Borland para Delphi 2006 y C# Builder, ofrece servicios para aplicaciones como el mapeado relacional de objetos (ORM) y la persistencia transparente de objetos, lo que evita a los desarrolladores la complejidad de construir y mantener sus propios servicios personalizados. ECO III también contribuye a que el desarrollo basado en el diseño sea una realidad gracias a su Framework basado en modelos, especialmente útil para la creación de aplicaciones de bases de datos basadas en formularios para servicios Web, ASP.NET y Windows. Estas nuevas versiones se presentarán en Madrid y Barcelona el 15 y 16 de noviembre respectivamente, con la presencia de Jason Vokes, Director de Producto de Borland. Para más información e inscripción: 902 34 45 56 y en www.borland.es. dnm.noticias Eventos 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 evento reunió a alrededor de 1.000 desarrolladores para mostrarles las más avanzadas tecnologías y experiencias en desarrollo de software. En este segundo año, Compuware ha ampliado el alcance del evento incluyendo las tecnologías de desarrollo Microsoft .NET y Java, las dos mayores plataformas que están usando actualmente las empresas para el desarrollo y la implantación de aplicaciones distribuidas. El encuentro tuvo como objetivo mostrar y educar sobre las habilidades y estrategias más avanzadas para incrementar la productividad del desarrollo, el ROI (retorno de inversión) y la calidad, con independencia de la tecnología subyacente. La edición de este año contó con presentaciones relevantes tanto por parte de Microsoft como de Eclipse. El evento se desarrolló en un ambiente abierto e incluyó sesiones técnicas, laboratorios de aprendizaje interactivo, estudios reales de casos de desarrollo y conferencias de expertos. Los desarrolladores, sus jefes y los CIO pudieron aprender tendencias y técnicas de la mano de algunos de los más brillantes y consumados visionarios de la industria. Soporte para Visual Studio 2005 Compuware anunció en este evento el soporte para Microsoft Visual Studio 2005 de sus herramientas para la ayuda al desarrollo, testeo, gestión de aplicaciones. “Compuware es un miembro importante y valioso del programa Visual Studio Industry Partner (VSIP) y tiene un rica tradición en aplicaciones empresariales”, dijo Rick LaPlante, General Manager de Visual Studio 2005 Team System en Microsoft Corporation (al que tuvimos la ocasión de entrevistar el mes de mayo pasado). “Nosotros estamos muy contentos de ver la solidez de Compuware y la continuada inversión en tecnologías .NET y su concentración en la innovación sobre aplicaciones del ciclo de vida”. Compuware participará como gold sponsor en el próximo Microsoft Visual Studio 2005 Launch Tour en el que se presentará Visual Studio 2005 a nivel mundial. En él, Compuware presentará la siguiente versión de Compuware TestPartner con capacidades de pruebas funcionales y de regresión, integradas en Microsoft Visual Studio 2005 Team System. Además, Compuware planea introducir una nueva versión de Compuware DevPartner Studio con una completa integración en el IDE de Visual Studio 2005: DevPartner Studio 8.0 que ofrecerá soporte mejorado para servicios Web, una nueva e innovadora característica llamada Performance Expert y capacidades para la simulación de fallos. Adicionalmente, Compuware introducirá una nueva versión de DevPartner Fault Simulator que se integra con DevPartner Studio. A principios de 2006, Compuware tiene pensado liberar la próxima versión de su herramienta de análisis de seguridad DevPartner SecurityChecker, con soporte para Visual Studio 2005. Más información sobre este evento en: http://www.compuwareojx.com Alhambra-Eidos celebra su 15 cumpleaños Alhambra-Eidos, empresa especializada en facilitar soluciones a las necesidades empresariales en el ámbito de las TIC, ha celebrado sus 15 años de trayectoria en este sector. A la fiesta asistieron más de 300 personas entre empleados, clientes, colaboradores y medios de comunicación. Durante estos 15 años de experiencia, Alhambra-Eidos se ha convertido en una de las empresas punteras del mercado nacional, con una amplia proyección y profesionales altamente cualificados, que se ha reflejado en los reconocimientos de fabricantes como Cisco Systems o Microsoft, entre otros. Más información en: http://www.alhambra-eidos.com. Lanzamiento deVisual Studio 2005 y SQL Server 2005 El 15 y 17 de noviembre, en Barcelona y Madrid, son las fechas y los lugares elegidos para la presentación más esperada de los dos últimos años. Para la presentación en España de Visual Studio 2005, SQL Server 2005 y BizTalk Server 2006, Microsoft Ibérica tiene previstos dos eventos de carácter introductorio y general: uno en Barcelona que se celebrará el día 15 de noviembre en el salón La Sagrada Familia del hotel AC Barcelona, coincidiendo con el IT Forum; y otra en Madrid que se celebrará el día 17 de noviembre en la Sala Retiro, entre el pabellón 8 y 10 del recinto ferial IFEMA y coincidiendo con el SIMO. Más información sobre estos eventos y registro en: http://www.encuentromicrosoft.com. Más adelante para la presentación de la versión española de estos productos habrá una gira por 14 ciudades españolas, aún por decidir. Incluiremos detalles de estos eventos el próximo mes. Como ya informamos el mes pasado, el 7 de noviembre Steve Ballmer será el encargado de anunciar este lanzamiento en un evento de un solo día que se celebrará en San Francisco, en el Moscone West Convention Center. Más información en: http://www.microsoft.com/launchtour2005. HP Integrity Summit 2005 Durante los días 5 y 6 de Octubre en Madrid, se ha celebrado el HP Integrity Summit 2005 que este año se componía del HP Integrity Developer Forum para desarrolladores y del HP Integrity Forum, dirigido a las grandes empresas españolas . La tercera edición del HP Integrity Developer Forum se ha celebrado con un gran despligue tecnológico, con un área de trabajo de 4.000m2, un taller de programación con más de 100 puestos de trabajo y 300 conexiones en red, un centro de proceso de datos con 70 servidores de alta disponibilidad. Alrededor de 50 desarrolladores tuvieron la oportunidad de migrar aplicaciones reales a plataformas de 64 bits con la asistencia de técnicos de las diferentes empresas participantes: Intel, Bea, Oracle, Microsoft... Más información en http://www.hp.es. dnm.noticias << dotNetManía OJ.X de Compuware 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 deVisual Studio, que acaba de lanzarse conjuntamente con SQL Server. Juntos, estos productos ofrecen 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 conectadas 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 Javier Izquierdo Es Ingeniero Técnico de Obras Públicas por la UPM y Gerente de Producto de Visual Studio desde julio de 2000 que Microsoft presentó la primera versión de Visual Studio, la suite de herramientas de desarrollo para trabajar en entornos Windows. Por aquel entonces, con Visual Studio 97, básicamente se siguió el concepto de otros paquetes y sencillamente se procedió a incluir los diferentes productos existentes en un mismo paquete, pero cada uno tenía su propio ejecutable y trabajaban por separado, con lo que los desarrolladores habitualmente aprendían a manejar un solo lenguaje 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 propio Bill Gates anunció públicamente el cambio trascendental que Microsoft planeaba para su futura línea de productos… estamos hablando de .NET, la plataforma de aplicaciones empresariales de Microsoft que como buenos lectores de esta revista ya conocen con bastante detalle. Así, en la primavera de 2002 presentamos al mercado el nuevo Visual Studio .NET 2002, y con él la base de este cambio, el primer .NET Framework, así como ASP.NET y un nuevo y moderno lenguaje basado en C, que desde su creación ha recibido el apoyo de numerosos académicos y desarrolladores profesionales, quienes ya lo han convertido en uno de los más utilizados en la actualidad; nos referimos por supuesto a C#. Había llegado la hora de los servicios Web y la programabilidad de Internet. Este primer Visual Studio .NET cambiaba drásticamente el concepto de la suite de desarrollo, al ofrecer un entorno de trabajo integrado y único independientemente del lenguaje de programación empleado (existen casi 30 lenguajes .NET ahora mismo), y permitiendo la utilización de diferentes lenguajes en un mismo proyecto. .NET comenzaba a despertar el interés de la comunidad de desarrollo, y en poco tiempo se convertía en una alter- Visual Studio 2005 es el mejor entorno de desarrollo creado hasta el momento y con la amplia variedad de versiones ofrecidas estamos seguros de que todos los desarrolladores encontrarán la solución a sus necesidades dnm.plataforma.net dnm.plataforma.net Nuevas ediciones para el nuevo Visual Studio 2005 Con Visual Studio 2005 no solo presentamos una versión actualizada y mejorada del producto, además ampliamos el alcance del producto, incorporando nuevas líneas para ofrecer soluciones para todos los perfiles de usuarios. Visual Studio 2005 Express Así, aparece Visual Studio 2005 Express, compuesta por cinco productos (los cuatro lenguajes de programación Microsoft –Visual Basic 2005 Express, Visual C++ 2005 Express, Visual C# 2005 Me alegro de tener la ocasión de poder dirigirme a los lectores de dotNetManía coincidiendo con un momento tan especial como es el anuncio de Visual Studio 2005, la nueva y mejorada versión de nuestro conjunto de herramientas de desarrollo. Atrás quedaron las primeras versiones de Visual Studio, una evolución que se ha venido realizando sobre un firme y constante propósito, el de ofrecer a los desarrolladores una solución flexible y dinámica que les permita potenciar su productividad y eficiencia en las labores de desarrollo y testeo del software. Este importante lanzamiento se produce conjuntamente con el anuncio de SQL Rosa Mª García Server 2005, la esperada versión de nuestro Consejera Delegada de gestor de bases de datos y herramienta de Microsoft Ibérica business intelligence, y BizTalk Server 2006, un completo e integrado ecosistema de productos que marcará, sin duda, un antes y un después en la forma de trabajo de los desarrolladores. Esperamos satisfacer las expectativas que, tanto la comunidad técnica como los fieles lectores de dotNetManía, han puesto en nosotros. Express y Visual J# 2005 Express– más Visual Web Developer 2005 Express), orientados a los desarrolladores noveles, estudiantes y aficionados que desean dar sus primeros pasos en el mundo de la programación. Dichos productos Express estarán disponibles para su descarga de forma gratuita por tiempo indefinido, para hacer más accesible la plataforma .NET a los futuros profesionales del sector. como para los profesionales del desarrollo Web tendremos Visual Studio 2005 Standard, el cual incluye opciones como el desarrollo para dispositivos móviles o el soporte nativo de 64 bits, y que permite además extender el entorno de desarrollo con más de 300 herramientas de otros fabricantes miembros del programa de Partners de Visual Studio (VSIP). Visual Studio 2005 Professional Visual Studio 2005 Standard Para aquellos desarrolladores que aún utilizan versiones pre-.NET así Llegamos así a la versión que como su nombre indica, Visual Studio 2005 Professional, está dirigida a los profesionales 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 publicación automáticas con ClickOnce, apariencia consistente de las aplica- <<dotNetManía nativa reconocida como plataforma de aplicaciones empresariales. Solo un año después estaba disponible una versión actualizada del producto, Visual Studio .NET 2003, la cual incluía ya J# (la sintaxis Java para .NET) y sobre todo, aparte de mejoras de rendimiento y resolución de bugs, integraba el desarrollo para dispositivos móviles, que hasta el momento requería de la utilización de otras herramientas. Y así llegamos hasta el presente, con el esperado lanzamiento de la nueva versión, Visual Studio 2005 (ya no es necesaria la inclusión de .NET en el nombre del producto, pues ha quedado constatado que es el fundamento de la plataforma Microsoft), el cual ha sido presentado conjuntamente con SQL Server 2005, con el que está perfectamente integrado, en este mes de noviembre (aunque aún deberemos esperar unas semanas hasta disponer de versiones en español, previstas para después de las Navidades). 9 << dnm.plataforma.net [ Con Visual Studio 2005 los desarrolladores podrán • Obtener una mayor productividad mediante herramientas integradas del ciclo de vida de desarrollo que reducen la complejidad de crear soluciones orientadas a servicios y permiten a las organizaciones comunicarse y colaborar más eficazmente. • Disponer de un mayor conocimiento de los procesos de desarrollo utilizando Visual Studio 2005 Team System, permitiendo a los equipos de desarrollo analizar sus procesos software, tomar mejores decisiones de desarrollo y mejorar la previsión del ciclo de vida de desarrollo del software . • Trabajar sobre una plataforma de aplicaciones segura, de alto rendimiento y fiable con el .NET Framework 2.0 y Visual Studio 2005. ciones y sitios Web con las plantillas de Páginas Maestras, etc); además se ha mejora sustancialmente el rendimiento. Para los interesados en crear soluciones sobre Excel, Word e InfoPath disponemos de Visual Studio 2005 Tools para Office System, un añadido 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. ] Nuevas Suscripciones MSDN Todas las ediciones Team System se ofrecen en conjunto con la nueva Suscripción MSDN Premium, que viene a sustituir a la actual MSDN Universal, de forma que el usuario siempre esté al día y disponga de todos los recursos que pueda necesitar. Por otro lado, Visual Studio Professional además de en solitario podrá adquirirse con Suscripción MSDN Premium o con Suscripción MSDN Professional; mientras que la Suscripción MSDN Enterprise desaparece y deja de comercializarse. Conclusión Studio 2005 Team Foundation Server. Y para las empresas que deseen incrementar la carga de usuarios en las pruebas que realizan sobre sus aplicaciones, se dispone de Visual Studio 2005 Test Load Agent. En definitiva, creemos sinceramente que Visual Studio 2005 es el mejor entorno de desarrollo creado hasta el momento y con la amplia variedad de versiones ofrecidas estamos seguros de que todos los desarrolladores, desde los noveles hasta los profesionales con amplia experiencia, encontrarán la solución a sus necesi- Y por supuesto, Team System será muy competitivo en precio respecto a soluciones de ciclo de vida de otros fabricantes, acercando y popularizando de este modo su utilización en organizaciones dedicadas al desarrollo en todos los segmentos de mercado, no solo grandes empresas sino también pequeñas y medianas. dades. Como parte del compromiso de innovación y mejora que representa Visual Studio 2005, esperamos que ayude a todos nuestros clientes y socios de negocio a mejorar su productividad y competitividad y a alcanzar el éxito. Más información en www.microsoft.com/spanish/msdn/vs2005. <<dotNetManía Visual Studio 2005 Team System 10 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 dentro de los equipos de desarrollo se han especializado, se ofrecen diferentes “sabores” según el puesto que se desempeña, disponiendo de una edición para desarrolladores, otra para arquitectos y otra para probadores de software. También es posible disponer de las características de las tres ediciones mediante el paquete Team Suite. Estas ediciones trabajan en conjunto con el repositorio de versiones y portal de proyecto, en un modelo cliente servidor de nivel empresarial, Visual 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 Marino Posadas es asesor técnico y redactor de dotNetManía, MVP de C# y formador de Alhambra-Eidos las distintas versiones de Visual Studio 2005, incluyendo las ediciones Express, en términos de licencias y precios, o sea, en cuanto a su disponibilidad. Visual Studio Express está pensado para estudiantes, aficionados y personas que empiezan con desarrollos, sin experiencia previa. Queríamos poner a disposición de este colectivo una herramienta sencilla, inmediata, con todo lo que se necesita para empezar a hacer desarrollos reales. Por eso incluye muchos tutoriales, ejemplos, acceso a recursos comunitarios, etc. En términos de funcionalidad, no existe ninguna limitación, salvo algunas herramientas de alto costo como las pensadas para desarrollo en grupo, plantillas empresariales, aplicaciones para dispositivos móviles, etc. Pero puede desarrollarse cualquier tipo de aplicación mediante las ediciones Express, aunque no todas las herramientas de soporte estén presentes. Respecto a las licencias, tampoco existen limitaciones importantes. Se pueden construir aplicaciones para cualquiera, distribuirlas como se necesite, comercializarlas, etc. Y respecto a los precios, creemos que son muy competitivos. Por ejemplo, las versiones Express, están valoradas alrededor de los 49$, y SQL Server Express es gratuito y va a continuar en esa categoría, y pensamos que es un gran valor añadido. A propósito de estos comentarios, en la revista hemos tenido ocasión de hablar con otros responsables de Visual Studio, y hemos observado la presencia común del término “entusiasta”. ¿Puedes explicarnos exactamente qué entendéis por entusiasta, y sobre todo, cuántos de ellos tenéis “censados”, como usuarios reales y/o potenciales? Es curioso que lo comentes, porque recientemente hemos ponderado el número de usuarios que pensamos que caen dentro de las categorías de aficionados o entusiastas, y la cifra sube hasta aproximadamente los 18 millones, en todo el mundo. Son desarrolladores no profesionales, con distintos perfiles: desde el usuario avanzado, el principiante, el administrador de sistemas que quiere tener capacidades extendidas de administración mediante programas, etc. Has mencionado un nuevo elemento dentro del menú principal de Visual Studio, que tuve ocasión de comprobar desde las primeras betas, y que está relacionado con la Comunidad (de hecho, se llama así). ¿Significa eso una voluntad por parte de Microsoft para abrir lo más posible los recursos comunitarios de desarrolladores? ¿Vais a continuar con esa línea? Hemos estado pensando cómo potenciar los recursos comunitarios vinculados con las herramientas de desarrollo, y hemos contactado con un gran número de partners para conseguir que esa idea se pudiera expresar de forma clara en el nuevo Visual Studio 2005. Eso nos llevó a incluir esas nuevas opciones e incluso otras, como los llamados kits de inicio, que pueden verse en la página principal de todos las ediciones de Visual Studio, incluyendo las Express. ¿Tiene eso algo que ver con una iniciativa llamada Coding for fun? En efecto. Es una idea con soporte Web, que tiene por objeto suministrar contenidos interesantes en términos de artículos, código fuente, etc., para que la gente lo pueda incluir en sus propios proyectos. Ahora (primeros de julio/05) ya tenemos una treintena de artículos disponibles y pensamos ir aumentando a un ritmo de unos dos o tres por semana. Queremos que se mantenga vivo, añadiendo además, video webcasts, similares a los que publica Channel9. Hablemos acerca de lenguajes. ¿Piensas que el lenguaje J# ha evolucionado en su aceptación en la forma esperada por Microsoft? ¿Cuáles son las estadísticas de uso actuales? << dnm.directo.entrevistas Marino Posadas y Brian Keller que es quien está desarrollando esa característica. Es una de las herramientas que se consideran como recursos añadidos y, a veces, el canal de distribución, o los calendarios pactados no permiten que ciertos elementos aparezcan en las betas, aunque luego estén en el producto final. De hecho también va a figurar en todas las versiones Express de los productos. Aunque ADO.NET no parece haber cambiado excesivamente desde la versión anterior, ASP.NET sí que ha sufrido un montón de cambios, nuevos modelos de compilación, edición, desarrollo y distribución, más de 60 controles de servidor añadidos, etc. ¿Supone eso que ASP.NET estaba inmaduro respecto a ADO.NET? Lo que pasa, a veces, es que lleva tiempo averiguar cómo la gente va a utilizar una tecnología. El equipo de desarrollo de ASP.NET es uno de los mejores de Microsoft en términos de mirar qué es lo que están haciendo los clientes, analizarlo y determinar cuáles son las necesidades. De esa forma, hemos sido capaces de reducir el código necesario en alrededor de un 70% para esta versión. Cada versión nueva es mejor que la anterior, porque aprende de los errores cometidos y ve las carencias con más claridad. Aunque no soy muy aficionado a las preguntas tópicas, a veces parecen inevitables las comparativas. ¿Podrías citar las que –para ti– son las 3 mejores características de la nueva versión, respecto a cuatro puntos concretos: Windows, ASP.NET, ADO.NET y aplicaciones para móviles? Para Windows, la distribución ClickOnce; en ASP.NET, el número de nuevos controles, junto a los kits de inicio; en ADO.NET, quizás la capacidad de devolver objetos DataTable como valor de retorno de un servicio Web; y respecto a las aplicaciones para dispositivos móviles, me gustan especialmente el nuevo emulador, que es capaz de funcionar en un Virtual PC, y el soporte de Platform/Invoke para soportar mensajes SMS. Para concluir, ¿puedes decirnos algo acerca de las implicaciones en la adopción por parte de los equipos de desarrollo del nuevo Visual Studio Team System? Por ejemplo, no me parece que muchos de esos entusiastas que citábamos antes vayan a ir por ese camino inmediatamente, debido a la curva de aprendizaje… Es cierto, yo tampoco lo creo. Pienso que es una herramienta para equipos de desarrollo más experimentados, y mayores en volumen que el programador individual. Entre otras cosas, porque requiere conocimientos del ciclo de vida correcto de las aplicaciones, de las que llamamos best practices, etc. Somos conscientes de esto, así como de que existe un enorme trabajo que hacer todavía para las próximas versiones en términos de facilidad de uso, de características de instalación (recordemos que en la Beta 1 se requerían 3 máquinas distintas para su instalación, aunque en esta Beta 2, ya sólo hace falta una), etc. Pero pienso que para el momento en que el producto esté oficialmente en la calle, vamos a disponer de una excelente herramienta, muy fácil de usar, considerando las capacidades que tiene, y que va a suponer una herramienta de un valor añadido fantástico para nuestros clientes. <<dotNetManía Al principio se trataba de un lenguaje 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 cumplido sobradamente las expectativas. Otra fuente muy importante de programadores 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 podido comprobar que, mientras muchos organismos oficiales, pymes, y principiantes prefieren Visual Basic, en el mundo universitario, el lenguaje de adopción es claramente C#, debido a sus características sintácticas, fundamentalmente. ¿Esa situación perjudica la promoción de J# como lenguaje? Nosotros tenemos claro cuál es la situación del lenguaje en la comunidad en este momento. Como dije, ha cumplido y cumple su función y expectativas y seguirá estando ahí, dentro de esos términos, por decirlo así. Aunque entendemos que para la mayoría de la comunidad de desarrolladores los lenguajes más atractivos sean Visual Basic y C#, por supuesto. Y, respecto a estos dos últimos, ¿piensas que todavía Visual Basic es el lenguaje más popular, o está empezando a cambiar la tendencia? Eso es interesante de analizar, porque si piensas en todas las versiones de Visual Basic, como VBA, VBScript, etc., entonces Visual Basic es, sin duda, el lenguaje más popular. Pero si sólo consideramos los lenguajes .NET, creemos que la tendencia está empezando a igualarse entre ambos. Aunque no era así en un principio. Respecto a las nuevas características de los lenguajes, parece que una de las más esperadas por los desarrolladores era la de “Editar y continuar”, al estilo de las versiones de VB anteriores a .NET. Sé que Visual Basic 2005 y C# 2.0 van a incluir esa característica, pero hay un temor en los beta-testers respecto a la presencia de refactoring en Visual Basic, porque las betas actuales sólo la incluyen para C#. ¿Qué puedes comentar al respecto? Pues entonces, tengo un mensaje tranquilizador para vuestros lectores, ya que, aunque no está presente en la Beta 2, sí que lo va a estar en la versión final. Lo que sucede es que hemos llegado a un acuerdo con otra compañía (Developer Express), 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 modelo de especificación de políticas de ejecución muy configurable.Esta nueva versión contiene 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 características de seguridad, dependiendo del tipo de código a analizar: nativo o administrado. No vamos a tocar aquí las propias del código nativo, pero sí recordar que, para programadores de C++, la nueva herramienta de análisis de código que se incluye en Visual Studio Team System, posee un montón de atractivas novedades en ese sentido. Por una parte, vamos a comentar brevemente la seguridad del propio Framework 2.0. Después, veremos algunos cambios en Visual Studio 2005. Seguridad en .NET Framework 2.0 Marino Posadas es asesor técnico y redactor de dotNetManía, MVP de C# y formador de Alhambra-Eidos Vamos a resaltar algunas de las novedades en los espacios de nombres de .NET Framework 2.0. La primera que nos llamó la atención, es la clase SecureString. Se diseñó como parte del espacio de nombres System.Security , y no se almacena en memoria, como la clase string, sino mediante Data Protection API (DPAPI), en un espacio controlado por el sistema. Similares medidas se han tomado en el espacio de nombres System.Diagnostics, donde la clase ProcessStartInfo, dispone de una propiedad Password, del tipo SecureString. Garantizan que el acceso al contenido de la cadena cifrada sólo pueda hacerse a través de DPAPI sin accesos alternativos. Otra clase específica de la seguridad es la potente SecurityContext. Permite capturar el contexto de seguridad de un subproceso y restaurarlo en otro proceso. Eso incluye los marcadores de subproceso para CAS, tales como Assert y PermitOnly. Otros aspectos internos de interés tienen que ver con la propagación de los símbolos de “impersonation” entre distintas hebras. Ese comportamiento, que no era asumido por .NET anteriormente, ahora sí lo es, hasta el punto de poner a disposición del usuario los métodos SuppressFlow() y SuppressFlow WindowsIdentity(), con el objeto de poder operar al estilo anterior. AccessControl Dentro del espacio System.Security, el namespace AccessControl suministra acceso mediante código a las ACL (Access Control List) del sistema, no sólo en lectura, sino permitiendo la creación de nuevos objetos, la toma de control sobre objetos existentes, y la posibilidad de convertir cadenas SDDL (Security Descriptor Description Language) en descriptores binarios y viceversa. De hecho, todos los objetos en los que la seguridad era importante, disponen desde esta versión de dos nuevos métodos: GetAccessControl() y SetAccessControl(). Muchos otros aspectos que no podemos destacar por la falta de espacio: la clase NegotiateStream, perteneciente a System.Net.Security, permite ahora crear canales seguros de comunicación para facilitar la implementación de Kerberos o SSL en las aplicaciones. En el apartado de la criptografía, las nuevas clases ProtectedData y ProtectedMemory hacen uso directo de DPAPI, y existen novedades como la no necesidad de CAPICOM (el API de criptografía basado en un módulo de Interop), para manejar certificados y mensajes. << dnm.plataforma.net Otras primicias agradables, las encontramos en los espacios de nombres System.Diagnostics (donde la clase Process permite una llamada directa a CreateProcessWithLogonW , sin necesidad de Platform/Invoke), o en System.DirectoryServices y System.Web, donde podemos usar DPAPI para cifrar secciones de ficheros Web.Config, con código de este tipo: comprobar hasta qué punto un código cumplía con los principios de diseño recomendados. A partir de ahora, se integra en las ventanas de configuración de propiedades del proyecto, donde, además, podemos observar una solapa especial “Security”, dedicada fundamentalmente a la distribución ClickOnce y la forma de garantizar su ajuste fino. mos establecer exactamente qué tipo de permisos se van a conceder en función de las zonas de ejecución que establece la directiva CAS (default, LocalIntranet, Internet, etc.) //fichero Web.Config <configuration> <appSettings> <add key='pwd' value='secreto'/> </appSettings> </configuration> // manejo de Web.config string configFilePath = null; Configuration config = Configuration.GetExeConfiguration(path,ConfigurationUserLevel.None); config.AppSettings.ProtectSection(ProtectedConfiguration.DataProtectionProviderName); config.Update(); Figura 2 Otra de las mejoras a destacar tiene 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 deshabilitados, de acuerdo con la directiva establecida, si bien esta característica sólo está presente en Visual Basic. A eso hay que subrayar la capacidad de ejecutar código con mínimos privilegios (una de las recomendaciones para la escritura de código seguFuente 1 ro que encontramos en la mayoría de manuales), la información extendida de errores de seguridad, y las nuevas capacidades de testing de aplicaciones ofrecidas por Visual Studio Team System, incluyendo la creación de tests unitarios, de stress, y un largo etc. En suma, el producto ha sido revisado Figura 1. Solapa de “Seguridad” en la “Ventana de “con la seguridad” en la Propiedades” de “Proyecto” proa, y, nuevos análisis, nos irán descubriendo cómo esa seguridad aparece por doquier Como vemos, si la aplicación sólo en toda la plataforma. dispone de permiso Partial Trust, pode- Y además, se han añadido muchas nuevas clases y propiedades dentro de CAS (como una nueva clase de evidencia que nos indica si un ensamblado ha sido cargado desde GAC), así como otras novedades para el manejo de la distribución ClickOnce. En un próximo artículo profundizaremos algo más en estas características. Seguridad en el IDE FXCop: Una herramienta “de obligado cumplimiento” FxCop se había estado usando como herramienta independiente para <<dotNetManía //fichero de salida <configuration> <protectedData> <protectedDataSections> <add name="appSettings" provider="DataProtectionConfigurationProvider" /> </protectedDataSections> </protectedData> <appSettings> <EncryptedData> <CipherData> <CipherValue>AQAAA...</CipherValue> </CipherData> </EncryptedData> </appSettings> </configuration> 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 optimizado para plataformas de 64 bits, tanto para procesadores Itanium como los basados en tecnología extendida x64. << La arquitectura de los 64 bits Jose Murillo Es ISV Developer Advisor en la División de Desarrollo y Plataforma (DPE) de Microsoft Ibérica.Su objetivo es ayudar a los fabricantes de software (ISVs) en la implementación de tecnologías Microsoft,especialmente sobre la plataforma de desarrollo .NET. La transición de 32 a 64 bits es tan inminente e inevitable como fue en su momento la de 16 a 32 bits, aunque afortunadamente ya podemos anticipar que no será tan compleja, sobre todo para aplicaciones desarrolladas con código manejado. Las ventajas de los 64 bits son varias: desde poder direccionar hasta 8 TB (sí, ¡TeraBytes!) frente a los clásicos 3 GB de los procesadores de 32 bits, incluso permitir escalar verticalmente nuestro servidor hasta nuevos límites. Un ejemplo: este incremento de memoria permite al sistema operativo pasar de un máximo de 115.000 conexiones TCP/IP simultáneas a más de 1.000.000 en Windows Server 2003. En un escenario de un servidor Web con ASP.NET, el cambio a 64 bits no supondría sólo ventajas para nuestra aplicación en cuanto al uso de memoria, sino sobre todo en el rendimiento y escalabilidad de nuestra Web. Dentro de los sistemas de 64 bits podemos diferenciar dos arquitecturas completamente diferentes, cada una con sus ventajas e inconvenientes, pero sobre todo destinadas a dos escenarios claramente diferenciados. Es fundamental conocer cuáles son nuestros objetivos y prioridades antes de decantarnos por una u otra arquitectura. Por un lado nos podemos encontrar con los sistemas basados en procesadores extendidos, los conocidos como x64, basados en la tecnología EM64T (Extended Memory 64 Technology). Ejemplos de éstos son los sistemas basados en Intel Xeon, Pentium 4 x64 o AMD Athlon Los procesadores Itanium están diseñados principalmente para ejecutar código nativo en 64 bits, no de 32 bits 64 entre otros. Son procesadores que mantienen su núcleo de 32 bits pero incorporan un conjunto de instrucciones extendidas que le permiten ejecutar código de 64 bits. Estos sistemas nos permiten acceder a las ventajas de los 64 bits pero manteniendo la habilidad de ejecutar código 32 bits de forma nativa con el rendimiento habitual. Por otro lado podremos encontrar procesadores nativos de 64 bits, los conocidos como IPF (Itanium Pentium Family) o IA64 y basados en la tecnología EPIC (Explicit Parallel Instruction Computing). Son procesadores con arquitectura completamente diferente a los x86 o x64, mucho más potentes y capaces de ejecutar hasta 6 instrucciones en paralelo. El inconveniente de estos procesadores es que no pueden ejecutar código de 32 bits de forma nativa, así que esta ejecución de código de 32 bits se realiza a nivel del sistema operativo mediante un subsistema de emulación conocido como WoW64 (Windows 32 on Windows 64). Por desgracia, el impacto de este subsistema de emulación en el rendimiento es bastante elevado. << dnm.plataforma.net Tanto en C# como en Visual Basic 2005 podemos generar código manejado para 64 bits Generación de código para 64 bits con Visual Studio 2005 El IDE de Visual Studio 2005 sigue siendo una aplicación de 32 bits, aunque por primera vez soportada en WoW64. Esto quiere decir que ya podemos instalarlo directamente en máquinas Itanium, aunque mi recomendación personal es no hacerlo y seguir desarrollando sobre estaciones de trabajo de 32 bits. En este caso, el modelo de desarrollo recomendado es mediante despliegues y depuración remota sobre la máquina Itanium. De todas formas, aunque despleguemos el IDE en la misma máquina, si intentamos depurar código nativo de 64 bits, nos encontraremos con el IDE ejecutando bajo 32 bits y la aplicación a depurar en 64 bits, con lo cual internamente se utilizará depuración remota aún dentro de una misma máquina, ya que código de 32 y 64 bits no pueden convivir en un mismo proceso. Lo que sí cambian son los compiladores. Tanto en C# como en Visual Basic 2005 podemos generar código manejado para 64 bits. ¿Pero no habíamos quedado en que el código MSIL era código intermedio independiente de la plataforma? ¿por qué tenemos entonces que volver a recompilar para 64 bits? Efectivamente el código MSIL que generamos con la configuración por defecto (anyCPU) es agnóstico a la plataforma. Este código puede ser ejecutado en cualquier tipo de procesador, ya que el JITter generará código nativo sobre la marcha. En el caso de máquinas de 64 bits, se ejecu- ...portar nuestras aplicaciones .NET a 64 bits consiste simplemente en cambiar el target de la configuración de compilación y recompilar tará sobre el Framework 2.0 para 64 bits, con lo cual el rendimiento será mayor. Sin embargo, esto ya era posible con el código generado mediante Visual Studio 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 ahora con Visual Studio 2005 de especificar como target en la configuración de compilación tanto procesadores Itanium (IA64) como Extendidos (x64). En este caso, el código MSIL generado estará optimizado para que el JITter de dichas plataformas sea capaz de generar código nativo optimizado para ese procesador, por ejemplo haciendo así uso de las nuevas capacidades de Itanium para ejecutar instrucciones simultáneamente. El incremento del rendimiento de nuestra aplicación en estos casos es notable. Así pues y con todo lo visto, podemos decir que en la mayoría de los casos, portar nuestras aplicaciones .NET a 64 bits consiste simplemente en cambiar el target de la configuración de compilación y recompilar. Obviamente el escenario se complica si tenemos dependencias de código de 32 bits, tanto en componentes COM accedidos mediante COM Interop, como en DLL nativas referenciadas mediante Platform Invoke. En el caso de que tengamos acceso al código de estos componentes, la recomendación es recompilarlos también en 64 bits. En el caso de que no tengamos acceso al código fuente o podamos recompilar los componentes en 64 bits, tendremos que exponerlos a nuestro proceso manejado de 64 bits mediante un proceso wrapper de 32 bits y realizar la comunicación mediante mecanismo IPC (InterProcess Communication). Si nuestro componente es COM, bastará con registrarlo en COM+ como servidor, así será la propia plataforma de COM+ quien nos lo exponga a nuestro código manejado mediante un proceso de 32 bits. Si el componente es una DLL nativa, por ejemplo en C o C++, tendremos que hacer un wrapper nosotros mismos, por ejemplo mediante un Server ATL que lo encapsule y exponga el mismo contrato mapeado. ¡Animaos! Sólo tenéis que cambiar una opción de la configuración de Visual Studio y recompilar para 64 bits. Ahora ya sólo nos falta una máquina de 64 bits para poder ejecutarlo :-). <<dotNetManía 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 flotante, como por ejemplo aplicaciones de diseño gráfico CAD, de cálculos de ingeniería, o simplemente para entusiastas de videojuegos o sistemas multimedia. En el caso de los procesadores IA64 o Itanium, su uso está principalmente destinado a servidores de backend como bases de datos (existe una versión de SQL Server 2000 y 2005 para IA64), servidores de componentes de 64 bits, o servidores de aplicaciones Web para 64 bits. Como vemos, el mensaje es claro. Los procesadores Itanium están diseñados principalmente para ejecutar código nativo en 64 bits, no de 32 bits. 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 características nuevas. Sólo por alguna de ellas ya merece la pena actualizarse. El entorno de Visual Studio 2005 también se ha mejorado notablemente.Vamos a conocer todas estas interesantes mejoras y añadidos. << Cuando la primera beta de la plataforma .NET “asomó la cabe- José Manuel Alarcón es redactor de dotNetManía. Es ingeniero industrial y especialista en consultoría de empresa. Ha escrito varios libros, y ha publicado más de doscientos artículos sobre informática e ingeniería en revistas especializadas.Visita su blog en www.jasoft.org. za” allá por el verano del año 2000 (¡ya han pasado más de 5 años, parece mentira!) todos los programadores contuvimos la respiración. Aquello era todo tan nuevo y diferente de lo que conocíamos en el mundo Microsoft que suponía una amenaza, pues había que aprenderlo todo desde cero de nuevo si realmente la cosa iba en serio. Por fortuna en cuanto te metías un poquito en ello veías que las ventajas sobrepasaban con creces a las dificultades y que .NET iba a hacernos la vida más fácil. De todas las áreas abarcadas por .NET, la más espectacular y novedosa era, sin duda, la referida al desarrollo de aplicaciones Web. La diferencia entre ASP.NET 1.x y cualquier otro marco de desarrollo Web conocido por entonces era simplemente abismal: controles, viewstate, postback, enlace a datos, compilación, etc, etc. Combinado con Visual Studio y todas sus herramientas gráficas, ASP.NET ofrecía un poder sin precedentes para crear aplicaciones HTTP. Aunque ASP.NET 1.x es espectacular y parece que las mejoras siempre podrán ser pocas, lo cierto es que la versión 2.0 del marco de desarrollo vuelve a sorprendernos gratamente. Los chicos de Microsoft no se han limitado a añadir unas cuantas cosillas de compromiso. La 2.0 trae tantas novedades que es difícil elegir por dónde empezar. De todos modos conviene destacar un par de hechos importantes respecto a esta nueva versión: • Según estimaciones de Microsoft la nueva versión de ASP.NET permite reducir las líneas de código que es necesario escribir en un 70% en muchos escenarios, sobre todo en los que hacen uso intensivo de enlazado a datos. • Los nuevos controles Web incrementan la productividad de forma espectacular tanto en tratamiento y visualización de datos como en cuestiones relativas a seguridad. Dicho esto vamos a conocer las novedades más importantes. Empezaremos por las menos obvias pero aún así significativas, e iremos viendo las más espectaculares al final para mantener así la tensión dramática ;-) Nuevo modelo de compilación y menos código Si abrimos una página ASPX y su correspondiente archivo de código (.vb o .cs) en ASP.NET 1.x veremos mucho código. Para empezar, todos los controles de la página se declaran como miembros de la clase que la representa y existe una parte de inicialización con bastante código. Además el archivo .ASPX utiliza lo que ha dado en llamar Code-Behind para relacionar el código con la interfaz de usuario, y ambas debían estar sincronizadas en cuanto a sus miembros públicos (los mismos controles declarados) para funcionar. La nueva versión utiliza mucho menos código. Para ello emplea un nuevo modelo de compilación y de relación entre una página ASPX y su código asociado, que saca partido a una de las nuevas características de los lenguajes de la plataforma: las clases parciales. La característica de clases parciales permite dividir el código que define a una clase en diversos archivos en lugar de obligarnos como hasta aho- << dnm.asp.net Según estimaciones de Microsoft la nueva versión de ASP.NET permite reducir las líneas de código que es necesario escribir en un 70% en muchos escenarios <% @ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> Si nos fijamos, ahora ya no se utiliza el atributo CodeBehind que aparecía en esta directiva en las páginas de la versión 1.x. En su lugar se utiliza el atributo Codefile que indica también en qué archivo está la funcionalidad asociada a esta interfaz de usuario. Si indican lo mismo: ¿a qué se debe este cambio?. Si examinamos el archivo de código (.cs o .vb) asociado a la página, veremos que tiene muchas menos líneas y es más sencillo de leer (más “limpio”) que el de versiones anteriores, tal y como se observa en la figura 1. En esta misma figura podemos contemplar que incluso la versión de Visual Basic es todavía más limpia que la de C# al no incluir siquiera sentencias Imports mientras que la de C# lleva varios using. ye la nueva palabra clave Partial (en minúsculas en C#). Es decir, lo que vemos es sólo una parte de la definición de la clase que representa la lógica de la página. Ello se debe a que, cuando ASP.NET compila la página, primero completa automáticamente el código de la clase _Default con otra implementación parcial de ésta en la que se definen los controles de la página (el código que ha desaparecido respecto a las versiones anteriores del entorno). Luego define una nueva clase específica para la página que hereda de _Default y es en ella donde inicializa los controles y hace el nexo entre la interfaz y la lógica. Es por este motivo que ahora los manejadores de eventos de la clase se declaran con accesibilidad protected, para que puedan utilizarse desde la clase derivada. A esta novedosa forma de separar (y al mismo tiempo unir en tiempo de ejecución) la interfaz de la lógica hay quien la denomina code-beside, como homenaje al hasta ahora utilizado codebehind de ASP.NET 1.x. Sólo este cambio ya nos hace la vida mucho más fácil a los programadores. Es muy fácil comFigura 1. Como se puede observar, tanto en Visual Basic como en probar este funcionaC# el código de nuestras páginas se ha reducido considerablemente miento si nos vamos a gracias a la técnica de clases parciales empleada. la carpeta temporal de ASP.NET y abrimos los archivos de código generados de forSi nos fijamos en la definición de la ma automática que allí encontraremos. clase veremos que su definición inclu- Ahora Visual Studio nos permite disponer del código y la interfaz en el mismo archivo si lo deseamos; cosa que antes no era posible desde el entorno. También nos deja mezclar código y páginas escritas en diferentes lenguajes al mismo tiempo, depurando la aplicación en todas ellas a la vez. Se han definido una serie de carpetas en el raíz de las aplicaciones que tienen un significado especial. Por ejemplo, si creamos una carpeta llamada App_code, todo archivo de código fuente que coloquemos en ella se compilará automáticamente y estará disponible para su uso desde las páginas del sitio Web. Se pueden mezclar ahí archivos de código escritos en diferentes lenguajes e incluso, sólo con dejar en ella los archivos .wsdl y .xsd que definen un servicio Web se crea de forma automática un proxy para poder utilizarlo (aunque no veremos el código auto-generado sí podremos hacer uso de él). Aunque para esto último ya existe una carpeta especial llamada App_WebReferences que nos permitirá mantener ordenadas nuestras referencias a servicios. Como vemos todas estas carpetas llevan el prefijo “App_”. Existen muchas otras como App_Data, App_GlobalResources, App_LocalResources o App_Themes. Con ASP.NET 2.0 se proporciona una herramienta de precompilación de sitios Web (Aspnet_compiler.exe). Gracias a ello podemos precompilar nuestras aplicaciones evitando la compilación dinámica y por tanto reduciendo el tiempo de inicio de ejecución de las mismas (no se generan las páginas bajo demanda). Además proporciona un modo de precompilación especial para distribuir aplicaciones que elimina todo rastro de nuestro código (incluso del HTML de las pági- <<dotNetManía ra a mantener todo lo relativo a una clase dentro del mismo lugar. Esta característica a simple vista puede parecer una nimiedad, pero realmente tiene gran interés ya que permite cosas como repartir el trabajo de una clase entre varios programadores, o características como el nuevo modelo de soporte de código que mencionamos. En las páginas ASPX de la versión 2.0 hay una directiva Page análoga a la siguiente: 19 << dnm.asp.net nas ASPX) y nos facilita su despliegue con XCopy protegiendo nuestra propiedad intelectual. Las nuevas clases de manipulación de archivos de configuración mejoran nuestras capacidades para crear asistentes de configuración e instaladores de aplicaciones. Ahora existe también una zona concreta dentro del archivo de configuración que se usa para almacenar cadenas de conexión a bases de datos, facilitando su acceso. A esto se une la capacidad de ASP.NET 2.0 para cifrar y descifrar automáticamente zonas enteras de web.config usando DPAPI, por lo que se mejora mucho la seguridad ante el robo de estos archivos. Controles nuevos y mejorados En general todos los controles Web se han mejorado bastante. Ahora devuelven siempre etiquetas compatibles con el estándar XHTML 1.1. Existe una nueva característica de los controles Web llamada renderizació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 controles anteriores. Por ejemplo, un mismo control Web se verá correctamente (aunque de forma diferente) en un navegador de escritorio como Internet Explorer y en un navegador WAP desde un teléfono móvil si existen directivas de renderizado para ellos. También se pueden usar filtros dependientes del dispositivo en las propiedades de los controles indicando valores distintos para diferentes dispositivos. En tiempo de diseño algunos controles muestran un panel de tareas adjunto que facilita asistentes y accesos directos a sus características más importantes (figura 2). Gracias a él se acelera mucho el trabajo. Existen nuevos controles que mejoran a algunos anteriores, así como controles desconocidos hasta la fecha. Por ejemplo, el control GridView mejora notablemente al anterior control de rejilla DataGrid y permite hacer más cosas con menos código. De hecho, aunque controles anteriores de este tipo siguen estando soportados 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- plo el primero de ellos (Wizard) permite la creación visual de asistentes en múltiples pasos e introduce el JavaScript y la lógica de servidor necesarios para conseguir su funcionamiento. Existen categorías enteras de nuevos controles como los relacionados con la seguridad, los portales personalizables o la navegación. Estos últimos ofrecen grandes facilidades para crear elementos de exploración de la estructura de una Web como menús desplegables, árboles o rutas. De los otros hablaremos dentro de un rato. Los controles de usuario ahora son más potentes, fundamentalmente por dos motivos: su aspecto al utilizarlos y la facilidad acceder a ellos. Ahora, al emplearlos en alguna página, ya no se muestra un aburrido rectángulo gris sin pistas de cómo es el control en realidad. Desde el diseñador de la página veremos el aspecto real del control de usuario (figura 3) y podremos redimensionarlo y trabajar mejor con él. Para usar un control de usuario desde cualquier pági- Figura 3.Ahora los controles de usuario se muestran con su verdadero aspecto en la superficie de diseño de las páginas por lo que resultan más intuitivos y fáciles de usar. na ASPX antes había que emplear una directiva <%@ Register %> en cada una de ellas. No es que se tratase de un gran problema porque al arrastrar un control sobre una página, el entorno de Visual Studio lo hacía automáticamente, pero sí era un engorro si decidíamos cambiar la definición del control (había que tocar todas las páginas) o decidíamos sustituirlo por otro (había que retocar o borrar manualmente las directivas). En ASP.NET 2.0 se puede definir un control para su uso directo desde cualquier página registrándolo en web.config dentro del nodo <system.web>: <pages> <controls> <add tagPrefix="miUC" namespace="MisControles.MiControldeUsuario"/> </controls> </pages> <<dotNetManía Internacionalización 20 Figura 2. Los paneles de tareas disponibles en algunos controles resultan de gran ayuda para trabajar. Otra gran novedad de ASP.NET 2.0 es la renovada capacidad de internacionalización de aplicaciones que es más fácil que nunca. Podemos conseguir que los elementos de la interfaz se adapten automáticamente a las preferencias de idioma del navegador de los usuarios creando archivos de recursos para cada idioma y colocándolos en una carpeta especial. << dnm.asp.net Existen recursos locales (para páginas concretas) y globales (utilizables desde cualquier lugar). Las carpetas especiales para ellos son respectivamente App_ LocalResources y App_GlobalResources. Los archivos de recursos tienen extensión .resx y poseen un editor propio (figura 4) que permite añadir no sólo cadenas de texto, sino iconos, imágenes y sonidos específicos de cada cultura. Figura 4. El editor de recursos integrado de Visual Web Developer. Por ejemplo, para que una página trata de controles que representan conexiones con diferentes tipos de orígenes de información que van desde bases de datos a objetos de negocio. No disponen de apariencia visual pero se arrastran igualmente sobre los formularios Web para trabajar con ellos visualmente y poder usar sus paneles de tareas. Abstraen al programador de las complejidades relacionadas con el manejo de los datos, permitiendo de manera automática seleccionarlos, actualizarlos, ordenarlos, paginarlos, etc. No hace falta volver a escribir código ADO.NET de bajo nivel más que en circunstancias muy concretas. ASP.NET 2.0 provee de serie con los siguientes tipos de orígenes de datos: Control Descripción SqlDataSource Enlaza con cualquier base de datos para la que exista un proveedor de ADO.NET. Está especializado en trabajar con bases de datos Microsoft Access. mipagina.aspx pueda utilizar recursos loca- lizados basta con crear un archivo con el mismo nombre y extensión .resx (sería mipagina.aspx.resx) e incluir en ella los distintos recursos del idioma por defecto. Para enlazarlo a la interfaz se usa una etiqueta especial (resaltada en negrita en este ejemplo): <asp:Label ID="Label1" runat="server" Text=" <% $ Resources:Saludo %> "></asp:Label> Esto hará que dinámicamente a la propiedad Text de la etiqueta se le asocie el valor del recurso de nombre Saludo. Si ahora creamos otro archivo de recursos con una extensión adicional para indicar el idioma (por ejemplo, mipagina.aspx.enus.resx para el inglés americano) se asociará el valor del idioma correspondiente cuando el usuario lo haya elegido como preferido en su navegador. Para que esto funcione de forma automática hay que incluir el nodo siguiente en web.config: se puede reutilizar la misma página para hacer uso de los datos de cualquier otra fuente. El comportamiento de los orígenes de datos se puede parametrizar a partir de casi cualquier cosa: desde valores de propiedades de otros controles hasta cookies o cabeceras HTTP recibidas y por supuesto directamente por código. En el caso de aplicaciones empresariales tal vez el origen de datos más interesante sea el ObjectDataSource. Expone los mismos métodos que cualquiera de los otros pero en lugar de acceder directamente a los datos emplea objetos personalizados de capa de negocio para hacerlo. AccessDataSource ObjectDataSource Se enlaza con objetos de negocio y capas personalizadas de acceso a datos. XmlDataSource Trata datos contenidos en documentos XML. SiteMapDataSource Se enlaza con la jerarquía de clases expuesta por el modelo de navegación de sitios de ASP.NET 2.0. 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 cualquier sistema gestor de datos para el que exista un proveedor .NET, como Oracle, MySQL, o mediante un controlador OLEDB u ODBC. Cuando hemos definido un control de tipo DataSource en una página basta con asignar su nombre en la propiedad DataSourceID de cualquier control que se enlace a datos (casi todos) para que funcione. Así de simple. Como todos los controles DataSource soportan las mismas interfaces, sólo con cambiar la asignación del origen de datos Plantillas de páginas, temas y skins Lo más habitual cuando se crea una aplicación o un sitio Web es que las páginas que lo conforman sean todas bastante parecidas o al menos que existan varios grupos de páginas similares que sólo varían ciertos contenidos entre ellas. En ASP.NET 1.x si queríamos que nuestras páginas dispusiesen de zonas comunes para conseguir un aspecto COHERENTE debíamos recurrir a soluciones caseras como emplear controles de usuario colocados manualmente en todas las páginas Mejoras en el uso de características de datos El nuevo modelo de enlazado a datos desde la interfaz de usuario se basa en el uso de orígenes de datos en lugar de enlazar directamente con objetos DataSet. Se Los temas de ASP.NET son como hojas de estilo que se aplican a controles Web y sus elementos tienen una sintaxis prácticamente idéntica a la de los controles cuyo aspecto definen <<dotNetManía <globalization uiCulture="auto"/> 21 << dnm.asp.net [ NOTA 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 referirme a esta característica. El motivo es que este término es el más aceptado y el que veremos con más frecuencia y además considero que la traducción “Páginas principales” elegida por Microsoft no ha sido la más afortunada. ] (cabeceras, laterales y pies, por ejemplo) o bien crear una clase propia heredada de Page que cargase ciertos controles automáticamente. Ninguna de estas soluciones era realmente buena o estaba exenta de problemas. ASP.NET 2.0 proporciona un modelo nativo y coherente para crear plantillas de páginas que se reutilicen 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 definir 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 mantenimiento 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 %>. Por lo demás se pueden considerar prácticamente equivalentes. Esto es importante porque significa que ya sabemos todo lo necesario para crearlas. Una página ASPX normal puede derivar su estructura a partir de una MP simplemente añadiendo un atributo MasterPageFile a su directiva de página, así: <<dotNetManía <% @ Page Language="C#" MasterPageFile="~/Articulos.master"... 22 Que indica el archivo de página principal que se utilizará para su estructura. Para agregar una Master Page a nuestro proyecto sólo hay que elegir el icono “Página Principal” en el diálogo de agregar nuevo elemento, del mismo modo que se añade cualquier otro objeto. Al abrir una MP aparece un diseñador idéntico al de una página ASPX normal. Podemos arrastrar sobre su superficie cualquier control así como editar su HTML de la manera usual. También lleva un archivo de código asociado en el que se puede responder a sus diversos eventos. La única diferencia apreciable a simple vista respecto a una página normal es que contiene por defecto un control de tipo ContentPlaceHolder. La sintaxis de este control es análoga a la siguiente: <asp:contentplaceholder id="Contenido" runat="server"> </asp:contentplaceholder> Su única propiedad interesante es precisamente su identificador ya que este tipo de control se utiliza para marcar las posiciones en las que irán los diferentes contenidos de las páginas derivadas dentro de 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 las zonas definidas por estos comodines de contenido, permaneciendo las demás inalterables. Al editar una página que deriva de una Master Page aparece el aspecto y estructura de la página principal en el diseñador, pero sólo se pueden tocar las partes correspondientes a los comodines de contenido (vea figura 5). Figura 5.Al editar una página que hace uso de una Master Page sólo podremos modificar aquellas zonas definidas para contenidos en la plantilla. Además las MP se pueden anidar de forma que unas hereden el aspecto y la disposición de otras, aunque en este caso no se podrán usar directamente desde el diseñador de Visual Studio .NET 2005. Gracias a las Master Pages podemos definir una estructura común para las páginas de nuestra aplicación Web. Sin embargo, aún no hemos resuelto todas las cuestiones sobre el mantenimiento de la interfaz que se presentan normalmente. Los controles que añadamos a las zonas de contenido de nuestras páginas todavía tendrán el aspecto predeterminado. Podemos configurar su aspecto estableciendo las propiedades de apariencia del control (como BackColor, Font, etc...). El problema que tiene este método es que, si deseamos cambiar por completo la apariencia de estos controles, tendríamos que tocar una por una todas las páginas. Esta no es una opción admisible en cuanto la aplicación dispone de más de unas pocas páginas. Aparte del normal uso de hojas de estilo en cascada (CSS) que proporciona HTML, ASP.NET 2.0 introduce una interesante novedad que se comple- << dnm.asp.net Figura 6. Estructura de ejemplo de la carpeta de temas de una aplicación. En este caso hay dos temas diferentes (white y black) cada uno con sus correspondientes archivos de definición. Un archivo de máscara contiene definiciones de controles ASP.NET a los que se le establecen valores de propiedades que serán aplicadas de modo automático cuando aparezcan en una página que use el tema al que pertenece la máscara. Por ejemplo, si un archivo .skin contiene el siguiente código: <asp:TextBox runat="server" BackColor="#FFFF80" BorderColor="#C04000" BorderStyle="Dotted" BorderWidth="1px"></asp:TextBox> Conseguiremos que las páginas que lo apliquen dispongan de controles TextBox con el fondo gris claro y el borde punteado de 1 píxel de ancho. Al igual que en las CSS es posible definir diferentes clases para un mismo tipo de control y aplicarlas selectivamente. Para que una página se adapte automáticamente a un tema definido en la carpeta App_Themes lo único que tenemos que hacer es asignar un atributo Theme en la directiva de la página, así: <% @ Page Theme="MiTema" Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> El segundo atributo indica el tema que se va a aplicar. El entorno de desarrollo nos ofrece de manera automática una lista de temas disponibles al escribir este atributo por lo que es muy fácil usarlo. Nada más establecer el atributo, la página se personaliza siguiendo los dictados de los archivos .skin que haya definidos para el tema. Dado que podemos disponer de varios temas se puede asignar uno diferente a cada grupo de páginas de una aplicación según las necesidades. Para no tener que establecer manualmente los temas y las Master Pages a cada página, es posible definirlos de manera global para un sitio o una carpeta de éste por medio de sendas entradas en el archivo web.config, por lo que se facilita mucho más la tarea en sitios grandes. Webparts: trocitos de portales Por si a alguien las nuevas capacidades de personalización y adaptación automática a plantillas le pareciesen poco, con esta nueva revisión de la plataforma se incluyen unos nuevos elementos de interfaz de usuario realmente impresionantes: los Webparts. Si usted ha visto en alguna ocasión en funcionamiento 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 soltando sus distintos elementos como en Sharepoint es una capacidad estándar que se ha añadido a ASP.NET gracias a los Webparts. Y lo mejor es que podemos crear nuestros propios Webparts y reutilizarlos en otras aplicaciones ASP.NET así como en el propio Sharepoint. Aunque la tarea se ha facilitado mucho sigue siendo algo compleja de habilitar y requiere una buena explicación que abordaremos en un próximo artículo. De momento le dejamos, amigo lector, con la miel en los labios. Seguridad, control de acceso y personalización Hasta ahora, si queríamos establecer un sistema de seguridad propio ajeno a las características de IIS o el propio sistema operativo empleábamos autenticación Forms. En este sistema con ASP.NET 1.x era el propio programador el que debía construir sus propios sistemas de almacenamiento, validación y uso de perfiles de usuario y roles. Ello implicaba normalmente escribir código de consulta contra bases de datos, el cual validaría las credenciales de los usuarios y obtendría los roles de los mismos. Luego se creaban objetos de seguridad (Principal e Identity) asignándole estos valores y asociándolos al contexto de la aplicación. ASP.NET 2.0 nos libera por fin de todo ello y ofrece de serie una completa API de gestión de <<dotNetManía menta a la perfección con las Master Pages para solventar el problema del aspecto: los temas y máscaras de controles Web. La funcionalidad ofrecida por los temas de ASP.NET 2.0 se entiende fácilmente si los asemejamos con las hojas de estilo. Los temas de ASP.NET son como hojas de estilo que se aplican a controles Web y sus elementos tienen una sintaxis prácticamente idéntica a la de los controles cuyo aspecto definen. Un tema de ASP.NET 2.0 está formado por uno o varios archivos de tipo .skin junto con las imágenes y hojas de estilo CSS que éstos utilicen, que se almacenan dentro de una carpeta con el nombre del tema y que a su vez está contenida en una carpeta especial de nombre App_Themes. Por ejemplo, la figura 6 muestra una carpeta App_Themes que contiene dos temas y cada uno de ellos a su vez contiene un archivo .skin, hojas CSS y gráficos específicos del tema. 23 << dnm.asp.net usuarios que nos evita tener que reinventar la rueda en cada aplicación. La clase Membership proporciona una sencilla interfaz de programación para almacenar y recuperar información sobre los usuarios de nuestras aplicaciones. Lo más interesante de todo es que, al igual que muchas otras características nuevas de ASP.NET 2.0, está basada en un patrón de diseño de proveedores, lo que permite cambiar los métodos de trabajo y almacenamiento sin tocar el código de la aplicación. Es decir, abstrae la funcionalidad del soporte físico utilizado para implementarla. Así, por defecto esta API utiliza SQL Server 2005 para almacenar toda la información de seguridad de una aplicación. Pero dada su arquitectura basada en proveedores podemos cambiar el modo de gestión con sólo un ajuste en el archivo de configuración. Incluso, es posible definir métodos de gestión de usuarios propios sin modificar el código de nuestras aplicaciones. Esto nos permite reutilizar infraestructuras de seguridad preexistentes que hubiésemos creado para ASP.NET 1.x sin perder el trabajo. Membership consta de un conjunto de métodos estáticos (compartidos) para poder crear, eliminar y validar usuarios entre otras cosas. Así, por ejemplo, para crear un usuario escribiríamos: Membership.CreateUser("usuario", "clave") Y para validarlo sólo hay que usar su método ValidateUser: <<dotNetManía Membership.ValidateUser("usuario", "clave") 24 Que devuelve verdadero o falso en función de si las credenciales son o no válidas. El objeto Roles complementa al anterior para permitir la gestión de los roles de un usuario y, al igual que aquel, está basada en el mismo patrón de proveedores. No es necesario utilizar el mismo proveedor para los roles que para los usuarios. Por ejemplo, se pueden autenticar usuarios contra una base de datos SQL Server y obtener los roles desde el Directorio Activo o las cuentas locales. Por fin, para la parte de personalización, esto es, mantener las preferencias de los visitantes de nuestro sitio sin complicarnos la vida, se provee de un objeto Profile similar a los anteriores y también basado en proveedores. Se proporciona una completa interfaz de gestión de usuarios, roles y configuración (figura 7) de la que tenemos el código fuente y que nos facilita mucho la vida a la hora de establecer los datos iniciales de un sitio Web. Figura 8.Aspecto del nuevo control de autenticación tras aplicarle un estilo de los predefinidos que vienen con Visual Web Developer. tenemos libertad de añadir nuevos pasos o modificar los predeterminados a voluntad. En la figura 8 se ve un control de autenticación en pleno proceso de personalización estética. En resumen En este artículo hemos tratado de llamar la atención sobre lo más sobresaliente que ofrecen ASP.NET 2.0 y Visual Figura 7.Aspecto de la herramienta de configuración de Web Developer 2005 seguridad que viene con ASP.NET 2.0. (que es como se llama la parte de Visual Studio dedicada a desarrollo Pero tal vez lo más espectacular Web y que está separada de lo demás por relacionado con la seguridad sean los completo). Aún siendo un texto bastante extenso para lo habitual en una revista sólo nuevos controles de seguridad (bautihemos rascado un poco la superficie, y nos zados como de “inicio de sesión”). hemos dejado en el teclado muchas cosas Estos controles nos dan ya hechas por comentar. Si bien la mayoría son multitud de operaciones comunes de pequeños detalles comparado con todo lo seguridad relacionadas con la interfaz visto aquí, todos ellos contribuyen a que de usuario. Por ejemplo, el control Login permite disponer de un comel nuevo entorno sea el mejor que hemos pleto diálogo de autenticación con visto nunca, lleno de destellos de calidad sólo arrastrarlo sobre un formulario por doquier. Web. El CreateUserWizard es un asisSiga atento a dotNetManía y en los tente con varios pasos que permite la próximos números iremos desgranando creación automática de nuevos usuapara usted con mayor detalle cada una de rios. El control LoginView permite perestas novedades. Esperamos que tras leer sonalizar lo que ven los usuarios en este texto, como mínimo, esté deseando función de los roles a los que pertedescargar la versión gratuita del entorno nezcan. Y todavía hay unos cuantos (Visual Web Developer 2005 Express) para más. Lo mejor es verlos en funcionaempezar a experimentar algunas de las miento. Son realmente útiles. características comentadas. Puede leer Todos ellos permiten la personalisobre ella en el artículo de Sergio zación, tanto parcial por medio de Vázquez. Ahí podrá encontrar también propiedades, como absoluta usando una tabla comparativa de versiones. plantillas. En el caso de los asistentes Siga sintonizándonos. dnm.asp.net Braulio Díez Reyes García Optimización ASP.NET 2.0 ¡Como una moto! Hace un tiempo leí un artículo que comparaba ASP.NET con PHP, la conclusión del autor era que si bien ASP.NET era muy amigable y orientado a objetos, PHP era más rápido al no tener artificios.La conclusión que saqué es que si ASP.NET es tan fácil de manejar, nadie se preocupa en dedicar un tiempo a estudiar la maquinaria de optimización que trae incorporada...En este artículo vamos a ver las novedades que nos trae con Visual Studio 2005 en este área. desarrolle y testee en la propia máquina o a la sumo en un servidor de la red local. Todo funciona rápido y fluido, con lo que parece que eso de gastar tiempo y dinero en mejorar el rendimiento de las páginas, es algo reservado a esos pocos sitios de la red a los que acudimos todos en masa (periódicos online, macrotiendas de libros, dotnetmania.com :-)...). El problema llega cuando subimos nuestra aplicación al servidor en producción y vemos que es lentísima, o incluso que cuando lanzamos eventos al servidor se convierte en algo con usabilidad cero (¡Ojo! las intranets tampoco se libran de estos males). Vamos a ver cómo ahorrarnos un capital en superservidores, ampliaciones de ancho de banda… usando las novedades que nos trae ASP.NET 2.0. Llamadas fuera de banda Reyes García Ha sido consultora “todo terreno”. Hoy día se dedica al gratificante mundo de la docencia. Braulio Díez colabora habitualmente con dotNetManía. Es MCSD en programación distribuida con Visual C++. Trabaja como Solutions Developer de Avanade. Como viejo desarrollador de aplicaciones desktop que soy, una de las características que más me impactó de ASP.NET, era la de asociar una acción de un control ASPX a un evento en el servidor (por ejemplo: cambio de selección en un combo), ¡era cómo programar una aplicación Windows! Con el paso del tiempo, uno se da cuenta que no se puede abusar de dicha práctica, hay que mover todas las validaciones posibles a métodos Javascript, o para algunos eventos, mostrar algún mensaje para que el usuario sepa que algo está en marcha, e incluso hacer una transición a otra página. Si no hacemos esto corremos el riesgo de que la aplicación deje de ser “usable”. Llamadas fuera de banda Sirve Para Ejecutar eventos en el servidor y actualizar la página actual, sin tener que enviar la página completa. Mejora Principal Round trips: los paquetes que se envían son más pequeños. Más usabilidad: permite trabajar mientras la operación en background se está procesando. Obervaciones En teoría debe funcionar para todos los exploradores, pero en Beta 2 sólo estaba listo para IE. Todo esto me parece muy bien, pero ¿por qué es tan lento? Enviar una petición a un servidor remoto siempre es lento, comparado con trabajar directamente en la máquina cliente, y aún más todavía si para cada petición que hacemos enviamos la página entera, el servidor la procesa de nuevo y se la envía de vuelta al cliente ¿¡Como!?, ¡pero si yo quiero leer un simple dato del servidor! ¿No hay alguna forma de enviar una petición simple sin tener que ir enviando y recibiendo la página completa?… para eso ASP.NET 2.0 incorpora las llamadas fuera de banda (o como dicen en inglés Out of band calls o Script callbacks). Con una llamada fuera de banda, lo que hacemos es enviar una petición al servidor, dejar que el usuario siga trabajando con su página, y cuando su explorador recibe la respuesta del servidor, actualizar la <<dotNetManía << Lo normal cuando se crea una aplicación Web es que se 25 << dnm.asp.net foto mostramos el seleccionado en ese momento, el cambio de selección y la carga de la foto lo realizamos usando llamadas fuera de banda (ver figura 3). Páginas asíncronas Figura 1. Ciclo de vida evento a servidor - ASPX 1.1 Figura 2. Ciclo de vida llamada asíncrona - ASPX 2.0 <<dotNetManía página usando DHTML. Los parámetros de petición y respuesta, son sendas cadenas de texto (bueno, un string puede contener XML, así que en el fondo podemos enviar y recibir lo que queramos…). La figura 1 muestra el ciclo de vida de un evento de servidor de ASPX 1.1, que podemos comparar con el de una llamada fuera de banda (figura 2). Como se puede apreciar el segundo consume menos ancho de banda y recursos del servidor. En la Web de dotNetManía puede bajar un ejemplo simple que utiliza esta técnica, consiste en una página compuesta por un combobox y un control imagen. En el combobox tenemos el nombre de los autores de dotNetManía, y en la 26 Figura 4.Aplicación de ejemplo: Llamadas fuera de banda Normalmente las páginas ASP.NET son síncronas, es decir, cuando viene una petición, se le asigna una hebra, y dicha hebra se queda a la espera de que la petición sea completada. En un principio esto parece correcto, pero… ¿qué pasa si una de nuestras páginas llama a servicios Web de otros proveedores, o a procesos de cálculo/lectura de BD que pueden tomar un tiempo considerable en ejecutarse? El resultado es que la hebra asignada a la petición se quedaría ocupada y, en realidad, consumiría recursos sin estar haciendo nada (ver figura 4). Dichas hebras son recursos limitados, de forma que si tuviéramos un número determinado de peticiones a la página en cuestión, ¡ podría llegar saturar el servidor! Debido a esto el resto de páginas “normales” no podrían ser procesadas, la cola de peticiones pendientes estaría llena (ver figura 5). Figura 4. Tienda web, formalización de pedido y petición de cálculo de gastos de envío a compañía de transportes Figura 5. Servidor web bloqueado por un número limitado de peticiones de páginas con procesos asíncronos << dnm.asp.net Sirve Para Extraer temporalmente de la cola de páginas a procesar aquella que esté esperando respuestas de procesos asíncronos (ej. llamada a servicio Web, o proceso pesado de base de datos). Mejora Principal Carga de servidor: al eliminar de la cola de peticiones aquellas que pueden tardar, el servidor puede responder a más peticiones simultáneamente). Obervaciones Otra ventaja es la de poder lanzar varias tareas asíncronas en paralelo. Para solucionar este problema usaremos lo siguiente: • Llamadas asíncronas a servicios Web y/o ADO.NET: se dividen en dos pasos, un primero BeginInvoke y un segundo EndInvoke. • Páginas asíncronas: ejecuta las llamadas asíncronas, duerme las hebras y las incorpora a la cola de hebras, cuando todas las llamadas asíncronas se han ejecutado. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Async="true" %> Fuente 1. (ASPX) En la página le añadimos la opción para que sea asíncrona. protected void Page_Load(object sender, EventArgs e) { // Vamos a realizar una busqueda de libros KeywordRequest keyword = new KeywordRequest(); ProductInfo productInformation = null; // Buscamos todos los libros que tenga que ver con C# keyword.keyword = "C#"; keyword.mode = "books"; (…) // Iniciamos la busqueda... PageAsyncTask searchTask; bool executeInParallel = true; // Si hubieran más tareas asíncronas, ejecutarlas en paralelo searchTask = new PageAsyncTask( delegate(Object Source, EventArgs ea, AsyncCallback callback, Object State) { // Arrancamos la llamada al webService return search.BeginKeywordSearchRequest(keyword, callback, State); }, delegate(IAsyncResult Ar) { // cuando recibamos respuesta, la procesamos productInformation = search.EndKeywordSearchRequest(Ar); // Transformar el resultado a DataSet DataSet ds = TransformToDataSet(productInformation); dgLibros.DataSource = ds; dgLibros.DataBind(); }, null, null, executeInParallel ); // Registramos la tarea para que se ejcute en paraleo RegisterAsyncTask(searchTask); } Fuente 2. (.CS, code-behind) Registramos la tarea asíncrona, le decimos que hacer al arrancar y que hacer al finalizar la tarea. Otra ventaja de utilizar páginas asíncronas es que podemos lanzar todas las peticiones asíncronas en paralelo, y que el Framework se encarge de avisarnos cuando están todas listas, en vez de ir lanzándolas una a una. De la Web de dotNetManía puedes descargar un ejemplo que procesa de forma asíncrona una llamada a un servicio Web de Amazon (en fuente 1 y 2 puedes ver fragmentos del mismo). Caché 2.0 Cuando subimos una aplicación a producción, una de los detalles que debemos tener en cuenta es el asignarle caché a ciertas páginas y ciertos datos, para que el servidor tarde menos en procesar las respuestas, y minimizar el tráfico entre nuestra aplicación y el servidor de base de datos. ¿Como funciona la caché en ASPX 1.1? Básicamente consiste en coger una página, o un segmento de datos (por ejemplo un DataTable que contuviera la lista de delegaciones de nuestra empresa), y en vez de hacer que nuestra aplicación lea de la base de datos cada vez que se hiciera una petición, mantenerlo en memoria por un tiempo (por ejemplo 3 minutos). Esta aproximación hace que nuestro servidor tarde muy poco en generar una página, ya que lo tiene todo preparado para montarla o incluso la tiene ya montada. El problema aquí es que, al darle un tiempo fijo de validez a la caché, si el cambio de unos datos es crítico para el negocio, tenemos o bien que no usar caché o darle un tiempo de vida muy corto. Si mal no recuerdo, en un sitio Web de visitas masivas, la página principal la tenían en caché por 5 segundos, lo que hacía que se pudieran responder muchas más peticiones, pero… ¿y si pudiéramos mantener dicha caché hasta que realmente cambiaran los datos? Eso mismo es lo que incorpora la caché en ASPX 2.0, dialoga con SQL Server e invalida una caché cuando su fuente de datos a cambiado, esto nos lo proporciona de dos formas: • Para SQL Server 7.0 y 2000: El sistema de caché funciona a nivel de tabla, y ASP.NET pregunta cada <x> segundos si ha habido cambios en la tabla <<dotNetManía Páginas asíncronas 27 << dnm.asp.net Cache 2.0 ASP.NET 2.0 dialoga con SQL Server e invalida una caché sólo cuando la fuente de datos cambia. Con SQL Server 2000 funciona a nivel de tabla, mientras que con 2005 lo hace a nivel de fila y con mayor optimización en cuestión (para ello primero hay que preparar nuestra base de datos, utilizaremos la utilidad aspnet_regsql que podemos lanzar desde la línea de comandos, la consola de Visual Studio 2005), ver fuente 3. • Para SQL Server 2005: Se puede afinar a nivel de fila de una tabla, y SQL Server, mediante Notification Delivery Services, es el que nos avisa cuando los datos han cambiado; esto es mucho más óptimo que el primer protected void Page_Load(object sender, EventArgs e) { // Ojo, este ejemplo es para SQL Server 2000. Esto sólo // se debe ejecutar una vez, sirve para preparar la base de datos // para usar caché en una tabla, también se puede habilitar usando la // herramienta aspnet_regsql //SqlCacheDependencyAdmin.EnableNotifications(@"server=LocalHost; //database=NorthWind;uid=sa"); //SqlCacheDependencyAdmin.EnableTableForNotifications(@"server=LocalHost; //database=NorthWind;uid=sa", "Categories"); // 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 SqlConnection conn = new SqlConnection(@"server=LocalHost;database=NorthWind;uid=sa"); SqlDataAdapter adapter = new SqlDataAdapter("Select * from Categories",conn); DataSet categories = new DataSet(); adapter.Fill(categories); Sirve Para Guardar una caché de datos/páginas, que sólo se refresquen cuando realmente haya cambios en la base de datos de la que leemos. Mejora Principal Tiempo de respuesta del servidor: al no tener que ir a 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 aprovechan recursos y se procesan las peticiones de páginas más rápido. Obervaciones Donde está más optimizada es bajo SQL Server 2005, si bien también podemos hacer uso de ella en 7.0 y 2000. sistema, pero sólo funciona para esta versión del motor de base de datos. ViewState Una de las características mas valoradas y odiadas de ASP.NET es, sin duda alguna, el "View State". Por un lado nos permite guardar información sobre el estado y aspecto de nuestros controles, así como información propia de la aplicación a nivel de página/estado. Por otro lado, toda está información viaja en un campo escondido de la págiViewState Sirve Para // Creamos una dependencia que se dispare cuando la tabla "categories" cambie. // "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 // connection string. SqlCacheDependency dependency = new SqlCacheDependency("Northwind", "categories"); // "Cacheamos" la página, y le decimos que mientras no cambie la tabla "categorías" // no la recargemos Response.AddCacheDependency(dependency); Response.Cache.SetValidUntilExpires(true); Response.Cache.SetExpires(DateTime.Now.AddMinutes(60)); Response.Cache.SetCacheability(HttpCacheability.Public); GridCategorias.DataSource = categories; GridCategorias.DataBind(); <<dotNetManía // Esto nos sirve para // Para ver un cambio, // de la base de datos Response.Write("Pagina 28 ver que la página es la que estaba en caché. modifica una entrada en la tabla categories "NorthWind" (base de datos de ejemplo de SQL Server 2000) creada el : " + DateTime.Now.ToString()); } Fuente 3. Ejemplo de uso, caché 2.0 Almacenar información del estado de los controles de una página, así como información propia a nivel de página. El ViewState viaja incrustado en la página que se envía al cliente. Mejora Principal El formato en que se graba se ha optimizado, la información de ViewState que ahora se genera ocupa menos. Round trips: los paquetes que se envían son más pequeños. Obervaciones Para hacer uso de esta mejora sólo tenemos que compilar nuestra aplicación en VStudio 2005. << 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 descuidamos, el tamaño de nuestra página en Kb se puede disparar. Un ejemplo de este caso se da al usar controles pesados como el DataGrid. 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. …Lo mejor de todo esto es que, para hacer uso del nuevo ViewState, lo único que tenemos que hacer es recompilar nuestra aplicación con Visual Studio 2005. • Tenemos la opción de no distribuir los ASPX, con lo que ya no se podría modificar nada, ni la presentación de nuestra aplicación. Esto es muy útil para productos “en caja”. La herramienta que nos permite precompilar dichas páginas se llama aspnet_compiler , podrá encontrar ejemplos más detallados en el apartado de links que sigue. 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 recibe la primera petición, las páginas ASPX son parseadas y precompiladas a código intermedio, con lo que el tiempo de respuesta de cara al cliente es malísimo. Si esto sólo ocurre la primera vez, ¿por qué preocuparnos.? Bueno seguro que esa primera vez coincide con una demo que estamos haciendo, o con que uno de los gerentes de la empresa tiene acceso para probarlo como un piloto, mejor ponerle remedio. ASP.NET 2.0 nos da la oportunidad de precompilar los ASPX, con lo que obtenemos las siguientes ventajas: • La primera petición que recibamos se ejecuta igual de rápido que cualquier otra. • Evitamos que aparezcan errores de compilación de páginas en el servidor en producción. Llamadas fuera de banda Para saber más “Script Callbacks in ASP.NET 2.0 - interesting, but lacking” http://west-wind.com/weblog/ posts/2302.aspx Páginas asíncronas “Async Pages in ASP.NET 2.0” http://odetocode.com/Blogs/scott/archive/2005/06/16/1656.aspx “Dimtry Robsman, Tech ed 2005Asynchronous pages in ASP.NET 2.0” http://blogs.msdn.com/dmitryr/archive/2005/07/05/435647.aspx Precompilación Evitar que las páginas se compilen en la primera petición. Mejora Principal Tiempo de respuesta: Evita el que la primera petición de una página ASPX sea muy lenta. Obervaciones También se puede usar para evitar exponer el código fuente (ASPX incluidos), así como para evitar que aparezcan errores de compilación en el servidor en producción. View State “ViewState Encoding in ASP.NET 2.0” http://pluralsight.com/blogs/fritz/ archive/2004/06/03/408.aspx “Whidbey will brings us a shorter viewstate, guaranteed!” http://weblogs.asp.net/vga/archive/2004/05/26/WhidbeyWillBringsUs AShorterViewstateGuaranteed.aspx Precompilación “Precompilation in ASP.NET 2.0” de páginas http://www.codeproject.com/aspnet/Pre compile.asp <<dotNetManía Sirve Para “Script Callbacks in ASP.NET 2.0” (Dino Sposito) http://msdn.microsoft.com/msdnmag/issues/04/08/Cutti ngEdge 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 orientada a estudiantes y a profesionales en fase de aprendizaje. << Por fin Microsoft ha sacado una versión de Visual Studio de Sergio Vázquez Sergio trabaja de Consultor Ebusiness en Pangeaes.com. Es Ingeniero Superior en Informática, MCP y Webmaster del sitio Web http://www.mutisdotnet.com sobre tecnologías .net.También es Vicepresidente del GUSE.NET. bajo coste destinada a la comunidad de desarrolladores que sin duda va a facilitar su uso y expansión a nivel mundial. Son muchos los programadores que echaban en falta una herramienta de este tipo para iniciarse fácilmente 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 aunque 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 entre ambas versiones. Entre ellas cabe destacar que WebMatrix no tiene Intellisense ni opciones de depuración paso a paso, cualidades muy deseables en un entorno integrado de desarrollo y que sí tienen las versiones Express de Visual Studio. Es importante indicar que esta herramienta, VWD no soporta ASP.NET 1.1 pues está diseñada para la versión 2.0 del Framework y está pensada para desarrollar en Visual Basic, C# y J#. En la figura 1 podemos ver una imagen general del nuevo entorno donde se aprecia la similitud con versiones anteriores. Para poder descargarnos la beta 2 podemos acudir a: http://msdn.microsoft.com/asp.net/getvwd. En castellano ya tenemos muchos recursos: http://www.microsoft.com/ spanish/msdn/vstudio/express. Recordemos que la beta 2 es gratuita y no está soportada por Microsoft aunque sí existen foros de discusión sobre el producto (http://forums.asp.net/175/ ShowForum.aspx). Figura 1. Vista general del entorno. Aquí podemos encontrar un tutorial: http://beta.asp.net/QUICKSTART/aspnet/default.aspx Y una visita guiada con un ejemplo de un sitio Web que usa la base de datos pubs con un control GridView y un ejemplo de Master Pages: http://beta.asp.net/ GuidedTour. Diferencias con otras versiones Después de instalar Visual Web Developer 2005 Express con SQL 2005 Express Edition vemos las siguientes novedades destacables: • El entorno de desarrollo trae su propio motor de base de datos gratuito SQL Server 2005. • Tiene Intellisense mejorado tanto en el código HTML como en el código ASP.NET en el lenguaje elegido (Visual Basic, C#, C++ o J#) facilitando así el desarrollo. << dnm.laboratorio.net • 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 forma 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 electrónicos. • Dispone de un asistente para la conversión de proyectos de las versiones anteriores de Visual Studio 2002 y 2003. • Permite crear Starter Kits o “soluciones predefinidas” que servirán de esqueleto a nuevas aplicaciones pudiendo contener las clases habituales y componentes con las que trabajamos. • Las Master Pages nos permiten crear una nueva página dentro de nuestro sitio Web que tenga la misma estructura con los mismos apartados que las demás como si fueran plantillas. • Los skins o temas permiten dar una apariencia a nuestro sitio web y cambiarla con hojas de estilo de forma sencilla. • Tiene más de una docena de nuevos controles de servidor muy interesantes como: o Password Recovery: recupera su clave de un usuario 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 equipos 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: http://lab.msdn.microsoft.com/vs2005/productinfo/productline. Una vez que instalamos Visual Studio Web Developer Express notamos que es bastante similar a Visual Studio NET y las diferencias son más bien estéticas. Cuando empezamos un nuevo proyecto en el menú “Archivo > Nuevo” nos pregunta si crear un nuevo sitio Web, un nuevo servicio Web, un nuevo sitio Web vacío o un sitio Web a partir de uno de ejemplo. Figura 2. Creacion de un nuevo proyecto Web. En la ventana de diálogo del nuevo sitio Web puedes especificar la localización del sitio Web que puede ser: • Un directorio local de tu PC. • Un sitio Web remoto conectado con las extensiones de servidor de FrontPage. • Un sitio Web remoto conectado vía FTP. Cuando ejecutas una página, Visual Web Developer lanza el servidor interno de desarrollo que acepta solo peticiones HTTP del propio equipo pero se puede configurar para que use este mini servidor Web o bien IIS. Figura 3. Ejecución de una página Web. <<dotNetManía Este producto es ideal para iniciarse en la programacion de aplicaciones Web con ASP.NET 2.0 y desarrollar rapidamente nuestras webs aprovechando los nuevos componentes que incluye Creando nuestro primer sitio Web con ASP.NET 2.0 31 << dnm.laboratorio.net EdicionesVisual Studio 2005 Team System1 Professional Standard Express2 Coloreo de código e Intellisense Sí Sí Sí Sí Lenguajes:Visual Basic,C#, C++,J# Sí Sí Sí Individualmente. VWD:VB, C# y J# Proyectos Windows Sí Sí Sí Excepto con Visual Web Dev Proyectos Web Sí Sí Sí Únicamente con Visual Web Dev Proyectos Mobile Sí Sí Sí Desarrollo con SQL Server Sí Sí Sí SQL Server Express Edition Reporting Services Tools Sí Sí Sí SQL Server Express Edition Acceso a Datos Remotos Sí Sí Sí Diseñadores visuales de datos Sí Sí Depuración Remota Sí Sí Visual Studio SDK Sí Sí Proyectos Excel, Word e InfoPath Sí VSTMOS 20053 Modelado con Visio Sí Requerirá MSDN Premium Análisis de Código Sí Herramientas para arquitectos Sí Herramientas para testers Sí Administración de proyectos Sí VS 2005 Team Foundation Server Sí SQL Server Developer Edition Sí 2005 Existen variaciones según la edición específica de Team System. Existen variaciones entre los distintos productos Express. 3 Visual Studio Tools for MS Office System es un producto independiente. 1 2 Requisitos del Sistema Hardware Software Procesador Mínimo Procesador de tipo Pentium a 600 MHz Recomendado Procesador de tipo Pentium a 1 GHz Sistema Operativo Windows 2000 SP4 Windows 2003 Server Windows XP SP2 Windows Vista Espacio en disco 500 Mb La instalación completa ocupa 1.3Gb Microsoft ASP.NET 2.0 <<dotNetManía RAM Mínimo 128Mb Recomendado 256 Mb 32 Pantalla Mínimo 800 x 600, 256 colores Recomendado: 1024 x 768, color de alta densidad de 16 bits Con las versiones superiores de este producto se puede coordinar un equipo de desarrollo completo asignando tareas a sus miembros y trabajando en equipo Preguntas frecuentes acerca de Visual Studio Express 2005 1.- ¿Puedo tener a la vez en la misma máquina Visual Interdev, VS2003 y VS2005 sin problemas? Sí. 2- ¿Puedo desarrollar aplicaciones para la versión 1.1 de ASP.NET? No, pues cada versión de Visual Studio está destinada a una versión diferente del Framework. La version 2005 sólo puede ser usada para crear aplicaciones que se ejecutan en la versión 2.0 del Framework. Si abrimos un proyecto de la versión 2003 de Visual Studio, se convertirá en otro nuevo con la versión 2005 y permite guardar copia de seguridad de la versión anterior. 3.- ¿Donde puedo encontrar una lista de cambios que hay entre las versiones 1.1 y 2.0 del Framework? Aquí: http://www.gotdotnet.com/team/changeinfo/ Backwards1.1to2.0. 4.- ¿Donde puedo encontrar ayuda y soporte? En los foros de ASP.NET en la Web de Microsoft en castellano y en http://forums.asp.net. 5.- ¿Qué tipo de aplicaciones puedo construir con la edición Express? Aplicaciones Web con formularios y servicios Web. 6.- ¿Qué beneficios obtengo si registro el producto? Te puedes descargar libros electrónicos gratuitos en inglés que puedes ver aquí: http://lab.msdn.microsoft.com/express/register. Podéis encontrar más preguntas frecuentes en inglés aquí: http://lab.msdn.microsoft.com/express/faq. Conclusiones En este artículo hemos visto que con este entorno integrado que incluye motor de base de datos gratuito, herramienta de desarrollo Web, servidor Web y ejemplos de pruebas, no necesitamos mucho más para poder empezar a desarrollar aplicaciones Web con ASP.NET 2.0 que no requieren equipos de desarrollo con rapidez. Si queréis más detalles sobre los Skins, Master Pages y los nuevos controles podéis consultar el artículo de José M. Alarcón. Para desarrollar aplicaciones más grandes y complejas que requieran alta disponibilidad y rendimiento se encuentran las versiones Standard, Professional y Team System que se describen en el artículo de Javier Izquierdo, responsable de producto en Microsoft. 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 entrevistarles, para pulsar sus opiniones acerca de esta nueva versión. << La primera cuestión es si Office se está Marino Posadas es asesor técnico y redactor de dotNetManía, MVP de C# y formador de Alhambra-Eidos 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 vinculados con ella. En un cierto sentido podría decirse así. En el sentido de que Office permite hacer la mayor parte de las cosas que pueden hacerse hoy día en las aplicaciones Windows, dispone de acceso a datos, de modelos 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 corporativos. La integración de los nuevos diseñadores de Visual Studio es un paso más en ese sentido. Al estar basada esta versión en el nuevo CLR 2.0, ¿en qué forma ha afectado a Visual Studio Tools for Office (VSTO a partir de ahora) las nuevas características de lenguajes y las extensiones a las librerías existentes? Aprovechamos muchas cosas y ninguna en particular. Existen nuevos tipos y los usamos en general, pero nada en particular. Hay un nuevo tipo de documento, y tenemos extensiones de las Smart Tags, pero nada específico que venga de la versión 2.0 del CLR. ¿Hay algunos tipos de proyectos nuevos, además de los ya existentes de Word y Excel? Sí, ahora existen proyectos de tipo InfoPath y Outlook. Donald D. Drake y Mike Hernández ¿Puedes explicarnos la diferencia entre Proyectos Orientados a Documentos y Proyectos Orientados a Aplicaciones? Podría decirse que depende de si se trata de personalizaciones para un documento dado o de proyectos genéricos que van producir nuevos documentos, o manipular información a partir del código fuente interno y las peticiones del usuario. Por ejemplo, los proyectos de Outlook, tendrían más que ver con el nivel de aplicación. La tecnología ClickOnce va a ser una de las grandes innovaciones en el nuevo visual Studio. ¿Existen cambios en ese sentido para VSTO? No. Hay diferencias en la forma en que funcionan los proyectos de VSTO y los de Visual Studio. << dnm.directo.entrevistas Los usuarios muchas veces son reticentes hacia las nuevas versiones debido a problemas con las migraciones y las dificultades que surgen de estos procesos. ¿Podéis decir algunas palabras de esperanza para aquellos que quieran realizar miMike Hernández, Community Program Manager de VSTO graciones? Lo mejor que po¿Respecto a Office 12, qué es lo demos decir es que no se necesita ningún que podéis aportar de cara al desarrotipo de migración. Todo el código creallo? ¿Seguirá siendo compatible hacia do para la versión anterior, compilará peratrás? fectamente en esta nueva versión. Hay Pensamos sacar una nueva beta de cosas que han cambiado para aprovechar VSTO con la beta de Office 12. Y tras las nuevas características. Muchas veces, eso, tendremos la versión final, con asociadas a novedades del propio Visual Orcas (o Visual Studio 9). De hecho en Studio 2005. el PDC mostramos una versión de ¿Estarán disponibles todas las caracVisual Studio Orcas que soportaba terísticas del modelo de objetos de cada Office 12. aplicación para los distintos proyectos, En conclusión, ¿cuáles diríais que de forma sencilla? son los mejores argumentos para aniSí todo lo que se presenta en el marse a dar el paso a esta nueva vermodelo de objetos estará disponible sión? también para los desarrolladores de Supongo que todas las novedades de aplicaciones VSTO, cara al desarrollador vinculadas a Visual sin limitaciones, a Studio 2005, por un lado, y otras caractravés de los PIA terísticas como la seguridad, producti(Primary Interop vidad, nuevos controles y entorno mejoAssemblies). Pero van rado. Además del soporte de proyectos a poderse utilizar Outlook, que es una de las cosas que los también los nuevos clientes más nos habían solicitado. controles presentaTambién habría que citar el nuevo y dos por esta versión, mejorado Modelo de Programación, las y también hemos mejoras de los Action Panes, y nuevas añadido un mejor características del los mecanismos de modelo de prograenlace a datos. mación vinculado Digamos que ahora, cualquier proDonald D. Drake, Director del equipo de desarrollo de VSTO con los Action Panes gramador que sepa hacer algo con y los Smart Tags. Windows Forms, será capaz de escribir ¿Dispondremos aplicaciones VSTO con extrema facide facilidades para utilizar las macros ¿Qué es exactamente el Editor de lidad. Además, todos nuestros conde tipo VBA? Manifiestos de Aplicación, del que troles se comportan como controles Existe un soporte de macros, pero si hemos oído hablar? estándar, con sus propiedades, métola pregunta es en el sentido de si se elimiLa información de metadatos de dos, eventos, etc. na VBA, te diré que no, que VBA estará ensamblado no era sencilla de modifi¿Se espera nuevo soporte para disponible bastante tiempo todavía. Lo car y con este editor permitimos que el otras aplicaciones de Office, en el que no se va a hacer es mejorarlo en ninprogramador la modifique más fácil y futuro? guna forma, eso no tiene sentido. Será sencillamente. Es información que conSí, en el PDC se anunció el futuposible, eso sí, utilizar los nuevos objetos tiene datos como, por ejemplo, a qué ro soporte para todas las aplicaciones del modelo desde el VBA existente, pero ensamblados está vinculada la aplicade Office, dentro de la siguiente vereso es todo. El lenguaje, el entorno, y el ción, características de distribución, versión de VSTO. runtime no cambian. siones, etc. <<dotNetManía Quizá en la próxima versión, la tecnología se integre de forma más clara, pero no en la actual versión. La forma de distribución de las aplicaciones se ha visto extendida de alguna otra forma, para incluir características de seguridad, por ejemplo utilizando Active Directory, o sigue usándose los Servidores de Ficheros? Básicamente, se siguen usando los servidores de ficheros para distribuir documentos y DLL a los clientes. Pero se integran con la seguridad de los servidores directamente. Ahora que la seguridad está siendo un tema prioritario para la mayoría de empresas y desarrolladores, ¿en qué forma se ha mejorado la seguridad en esta versión? VSTO utiliza la seguridad vinculada al código (CAS: Code access security) igual que cualquier otro código de .NET Framework. De forma que, en ese aspecto, funciona exactamente igual a la versión anterior. La seguridad se encuentra vinculada a los ensamblados y estos necesitan permisos FullTrust para garantizar los accesos. 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 ofrece 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 Asamblea General de la organización estandarizadora ECMA aprobó dos documentos que deberán convertirse en referencia obligada para todos aquellos que desarrollamos nuestra actividad profesional alrededor de .NET: las terceras ediciones de los estándares relativos al lenguaje de programación C# (ECMA-334) y de la Infraestructura Común de .NET (ECMA-335) [1,2]. Estos documentos, que pueden ser descargados gratuitamente del sitio Web de la organización, http://www.ecma-international.org, constituyen las bases sobre las que se cimentan las implementaciones de estas dos tecnologías incluidas en la versión 2.0 de .NET Framework. Introducción Octavio Hernández es colaborador habitual de dotNetManía, Ingeniero en Informática de Sistemas y MVP de C#.Actualmente es Director Técnico de Danysoft La aparición del lenguaje C# como parte de la plataforma .NET representó un hito muy significativo en lo relativo a la generalización del uso de las tecnologías de programación más avanzadas de la actualidad, y especialmente de las centradas alrededor del desarrollo rápido basado en objetos-componentes. C# logró integrar de una manera armoniosa los principales conceptos que hicieron tan importantes a lenguajes anteriores como C++, Delphi o Java con otros aportes realmente novedosos. Superada con creces la prueba de aceptación que representa cualquier versión 1, la nueva versión de C# (que estará implementada al 100% en Visual Studio 2005) nos presenta un lenguaje mucho más maduro, que ha incorporado a su repertorio de características toda una serie de novedades importantes que harán el desarrollo mucho más productivo. Las nuevas características incorporadas en C# 2.0 y que se describen en este artículo son: • Genericidad • Iteradores • Tipos valor anulables • Métodos anónimos e inferencia de tipos delegados • Declaraciones parciales • Clases estáticas • Distinta visibilidad de métodos de acceso de propiedades • Calificación mediante aliases • Directivas pragma Genericidad Sin duda alguna, la más importante de todas las novedades presentes en C# 2.0 es la genericidad. Por ello la tratamos más en profundidad en este monográfico con el artículo “Reflexionando” y haciendo “Reflexión” sobre la genericidad de .NET 2.0, de Miguel Katrib y Mario del Valle. No es una característica exclusiva de C#; el hecho de que está implementada a nivel del CLR ha hecho posible que Visual Basic 2005 la incluya también, al igual que seguramente harán en el futuro otros lenguajes para .NET 2.0. Se conoce como genericidad (algunas fuentes utilizan el término genericidad paramétrica) a la posibilidad de parametrizar clases, estructuras, interfaces o incluso métodos en función de los tipos de los datos que estos almacenan y/o manipulan. Por ejemplo, a continuación se muestra una posible implementación de una lista enlazada de elementos pertenecientes a un mismo tipo T, el parámetro genérico, que en prin- << dnm.lenguajes.csharp public class Lista<T> { private Nodo<T> raíz = null; public bool EstáVacía() { return raíz == null; } public void AgregarAlInicio(T dato) { raíz = new Nodo<T>(dato, raíz); } // otros miembros… } Fuente 1. Fragmento de definición de un tipo genérico. La potencia de la genericidad radica en que permite describir de una manera general estructuras de datos y algoritmos, dejando sin concretar los tipos de datos subyacentes para que sean especificados más adelante por el usuario del código genérico. Por ejemplo, a partir de la definición anterior, es posible crear y manipular una lista de enteros de la siguiente forma: { Lista<int> listaEnteros = new Lista<int>(); listaEnteros.AgregarAlInicio(4); listaEnteros.AgregarAlInicio(3); listaEnteros.AgregarAlInicio(2); // más código… } Fuente 2. Consumo de un tipo genérico. El código cliente del tipo genérico es quien indica al compilador en la declaración que su lista sólo contendrá elementos de un tipo de datos concreto, enteros en el ejemplo. Gracias a esto, la seguridad de la programación aumenta sensiblemente ya que ahora el compilador es capaz de detectar cualquier intento de manipulación incorrecta del tipo genérico. Por otra parte, el rendimiento mejora también, ya que se evitan las verificaciones de tipos en tiempo de ejecución y, en el caso de los tipos valor, se evita completamente la necesidad de realizar operaciones de boxing y unboxing. Aunque un análisis en profundidad de la implementación de la genericidad en C# y el CLR rebasa los límites de este artículo, hay que destacar que se trata de un mecanismo diferente de las plantillas (templates) de C++. De hecho, en Visual C++ 2005 coexistirán ambas tecnologías. Por supuesto, no será necesario desarrollar desde cero estructuras de datos como la mostrada anteriormente para empezar a aprovechar las ventajas de la genericidad. La librería de clases de .NET 2.0 añade a los contenedores “tradicionales” una amplia gama de contenedores genéricos, todos ellos dentro del nuevo espacio de nombres System.Collections.Generic. Iteradores Un iterador es un mecanismo que se define para permitir recorrer los elementos de un tipo contenedor, de forma que un cliente del tipo pueda obtener una secuencia ordenada de estos. No describiremos en detalle las posibilidades que ofrece esta característica, ya que publicamos recientemente un excelente artículo sobre el tema [6]. A modo de ejemplo, el fuente 3 muestra la programación de un iterador para nuestra lista enlazada genérica. Con una implementación como ésa, una aplicación cliente podría recorrer los elementos de una lista del modo que se muestra en el fuente 4. Genericidad restringida Una característica adicional de la genericidad que no podemos dejar de mencionar es la posibilidad de establecer restricciones sobre los tipos parámetros de los tipos genéricos que definamos. Esto permite garantizar de forma estática que los tipos que se utilicen como argumentos de un tipo genérico satisfagan ciertos requisitos, o más concretamente, que implementen una interfaz determinada. Por ejemplo, el fragmento de código que se muestra en el fuente 3 establece que el tipo de los nodos de nuestra lista enlazada debe implementar IComparable. class Nodo<T> where T: IComparable { // implementación de la clase… } public class Lista<T> : IEnumerable<T> where T : IComparable { // implementación de la clase… // enumerador public IEnumerator<T> GetEnumerator() { Nodo<T> n = raíz; while (n != null) { yield return n.Dato; n = n.Siguiente; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } Fuente 3. Ejemplo de genericidad restringida e implementación de iterador. Lista<int> listaEnteros = new Lista<int>(); // Adición de elementos a la lista… // iterar sobre los elementos de la lista foreach (int i in listaEnteros) MessageBox.Show(i.ToString()); Fuente 4. Iteración sobre los elementos de una lista. Tipos valor anulables Otra de las novedades realmente importantes de C# 2.0 es la que abre la posibilidad de utilizar el valor null (Nothing en Visual Basic, nil en Delphi .NET, etc.) no sólo para los tipos referencia, sino también para los tipos valor. Tradicionalmente, los lenguajes de propósito general no han ofrecido ningún soporte en ese aspecto, y se ha hecho necesario utilizar trucos más o menos “sucios” para indicar un valor nulo o indefinido para los tipos valor, tales como utilizar un elemento “especial” del dominio (por ejemplo, -1 ó 0 para tipos enteros) o mantener señalizadores booleanos en variables independientes; técnicas todas que adolecen de inconvenientes importantes. Los tipos valor anulables (la traducción que hemos dado al término inglés nullable types) resuelven definitivamente este problema tan antiguo, ofreciendo soporte integrado en el lenguaje para la utilización del valor null con todos los tipos valor. Los tipos valor anulables son realmente una aplicación sutil de la generi- <<dotNetManía cipio no se especifica. El código asume la existencia de otro tipo genérico Nodo<T>: 37 << dnm.lenguajes.csharp cidad: se apoyan en el tipo genérico predefinido System.Nullable<T>. Internamente, un tipo valor anulable combina un señalizador booleano, al que se accede mediante la propiedad de sólo lectura HasValue, con un campo del tipo valor subyacente, que puede leerse mediante la propiedad Value. Si HasValue tiene valor false, se considera que el valor de la variable es null. Cuando HasValue es true, la propiedad Value devuelve el valor almacenado. C# 2.0 incorpora una buena dosis de “azúcar sintáctico” para facilitar la utilización de estos tipos. Un tipo valor anulable se declara añadiendo al nombre del tipo “base” el modificador ?. Por ejemplo, int ? es la variante del tipo predefinido int que acepta el valor nulo. El lenguaje provee conversiones implícitas del literal null y del tipo valor correspondiente a un tipo valor anulable. Eso hace perfectamente válidas las instrucciones que conforman el fragmento de código que se muestra en el fuente 5. { int? n = null; int? m = 275; if (m.HasValue) MessageBox.Show("m vale: " + m.Value.ToString()); else MessageBox.Show("m no tiene valor"); } Fuente 5. Utilización de tipos valor anulables. De entre las diversas aplicaciones posibles de los tipos valor anulables, mencionaremos que pueden ser especialmente útiles a la hora de encapsular los campos de bases de datos SQL que admiten el valor null durante el desarrollo de la capa de acceso a datos de las aplicaciones corporativas. Métodos anónimos e inferencia de tipos delegados Los métodos anónimos de C# 2.0 permiten definir delegados “en línea”, en el lugar en que se necesitan, eliminando así la necesidad de crear un método o incluso una clase por el simple hecho de que se desea crear un delegado. El fuente 6 muestra tres instrucciones en las que se agrega un delegado a un evento de tres maneras distintas. De las tres vías que se utilizan en el fuente 6 para agregar un delegado al evento Click de un botón, la primera es la vía “tradicional” (la única válida en la versión 1 de C#). A continuación, la segunda sentencia muestra otra manera de lograr el mismo efecto, pero evitando la creación explícita de un método gracias a un método anónimo. Por último, la tercera sentencia de código muestra un ejemplo de la otra novedad que se describe en este epígrafe: la inferencia de tipos delegados. En principio, ahora ya no es necesario crear explícitamente el delegado, sino que el compilador se encarga de generarlo automáticamente cuando le indicamos el método a invocar. Declaraciones parciales En C# 2.0 es posible dividir la implementación de una clase, estructura o interfaz a lo largo de varios ficheros de código fuente. Esta característica puede ser útil de cara a la división del trabajo de programación entre varios miembros de un equipo o a lograr una mejor organización del código fuente. El propio Visual Studio 2005 hace uso de esta característica, separando en dos ficheros el código generado automáticamente por el diseñador del código y el código introducido por el desarrollador, como puede verse en la figura 1. 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; <<dotNetManía } 38 private void GestorBotón(object source, EventArgs e) { MessageBox.Show("¡Hola!"); } Fuente 6. Métodos anónimos. Figura 1. El diseñador de Visual Studio 2005 separa en dos ficheros el código de los formularios. Cada parte de un tipo parcial debe incluir el modificador partial; éste indica al compilador simplemente << dnm.lenguajes.csharp que pueden existir otras partes del tipo que deberán ser combinadas. Todas esas partes deberán ser compiladas conjuntamente, de manera que el compilador genere la implementación completa del tipo. De esto se desprende que las clases parciales no permiten “extender” tipos que ya estén compilados. Clases estáticas Las clases estáticas son una adición pequeña pero útil al lenguaje C#. Su objetivo es permitir “marcar” explícitamente (mediante la palabra reservada static) aquellas clases cuyo objetivo es contener únicamente entidades estáticas (de clase), para que el compilador impida que se le añadan por descuido o error miembros de instancia. Ejemplos clásicos de clases de la librería de .NET Framework que sólo ofrecen al programador recursos estáticos son Math y Monitor. El fuente 7 muestra un fragmento de código en el que se define una clase estática. mente el método get, pero limitar la visibilidad del método set. La sintaxis necesaria para lograr esto puede verse también en el fuente 7. Calificación mediante aliases La posibilidad de definir aliases para espacios de nombres que incorporaba C# 1.0 adolecía de ciertas limitaciones a la hora de ayudar a resolver las ambigüedades potenciales entre identificadores. C# 2.0 añade ahora un nuevo mecanismo para permitirnos calificar los nombres que usamos en nuestro código e indicar explícitamente en qué espacio de nombres debe buscar el compilador. La sintaxis, que parece inspirada en C++, es la siguiente: <alias> :: <nombre> <alias> puede ser un nombre de alias o el identificador global, que indica que el nombre debe ser buscado en el espacio de nombres global. Hay que seña- Directivas pragma Por último, #pragma es una nueva directiva del preprocesador de C# 2.0, que puede ser utilizada para indicar información contextual al compilador. Por ejemplo, mediante directivas pragma es posible: • Activar o desactivar la generación de diferentes advertencias del compilador para el código fuente que sigue a la directiva. • Indicar optimizaciones a aplicar al código fuente que sigue a la directiva. • Suministrar información que pueda ser utilizada por un depurador. Conclusión En este artículo hemos descrito las principales novedades que incluye la 3ª Edición del estándar ECMA del lenguaje de programación C#, implementadas completamente en el compilador de este lenguaje integrado en .NET 2.0. Agradecimientos Fuente 7. Clases estáticas y visibilidad de métodos de acceso de propiedades. Distinta visibilidad de métodos de acceso de propiedades C# 2.0 permite especificar diferentes niveles de visibilidad para los métodos de acceso de lectura y escritura asociados a una propiedad o indizador (propiedad vectorial). Con esto se satisface una petición de muchos desarrolladores, puesto que es relativamente frecuente que se desee exponer pública- lar aquí que global no es una nueva palabra reservada del lenguaje, sino un identificador normal, que sólo toma un significado especial cuando aparece a la izquierda de los ::. Lo mismo ocurre con partial, yield y otros términos presentados en este artículo, que sólo adquieren su significado especial en el contexto adecuado. El objetivo de esta medida es mantener la compatibilidad con C# 2.0 del código desarrollado para la versión anterior del lenguaje. El autor desea expresar su agradecimiento a Richard Blewett, de DevelopMentor, por sus útiles aclaraciones sobre temas tratados en este artículo. Bibliografía [1] Estándar ECMA-334, “C# Language Specification”, 3ra. Edición, Junio 2005 [2] Estándar ECMA-335,“Common Language Infrastructure (CLI)” 3ra.Edición,Junio 2005 [3] Lowy J.“Create elegant code with anonymous methods,iterators and partial classes”, publicado en MSDN Magazine,Mayo de 2004 [4] Clark, J.“Introducing Generics in the CLR”, publicado en MSDN Magazine, Septiembre de 2003 [5] Clark, J.“More on Generics in the CLR”, publicado en MSDN Magazine, Octubre de 2003 [6] Katrib M., Del Valle M., “Enumeradores e iteradores en C# 2.0”, publicado en dotNetManía Nº 7, Septiembre de 2004 <<dotNetManía public static class Matematicas { private static double epsilon = 0.1E-6; public static double Epsilon { get { return epsilon; } // público private set { if (value > 0.1E-2 || value < 0.1E-8) throw new Exception("Value out of range"); epsilon = value; } } public static double Sqrt(double src) { // cálculo de raíz mediante algoritmo de Newton… } } 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 programación y un soporte para estar más protegidos de cometer errores por inconsistencia 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- Mario del Valle Es desarrollador del grupo WEBOO e instructor del Departamento de Ciencia de la Computación de la Universidad de la Habana Miguel Katrib Es Dr.y Catedrático del Departamento de Ciencia de la Computación de la Universidad de La Habana y jefe del grupo WEBOO.Es un especialista en lenguajes de programación y entusiasta de la tecnología .NET y el lenguaje C#. rá integrada en el CLR en .NET 2.0. A diferencia de la implementación de la genericidad en otros lenguajes y plataformas, el CLR se encargará, durante el proceso de 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 rendimiento en ejecución porque el código final ejecutará según las especificidades de cada tipo. Los ensamblados en la versión 2.0 del Framework han sido enriquecidos con nuevos metadatos para permitir la representación de los tipos genéricos. Consecuentemente las clases de System.Reflection y System.Reflection.Emit fueron adaptadas para inspeccionar y generar tales clases. El tema de la genericidad en los lenguajes de programación ha sido ya tratado en la literatura (ver muy buen ejemplo en lenguaje Eiffel [1]): La genericidad en .NET ya fue abordada en un trabajo previo de dotNetManía [2]. De modo que no es la intención de este trabajo dar una introducción a la genericidad. Lo que vamos es a ilustrar cómo usando la reflexión (reflection) podemos hacer convivir las clases genéricas, o las clases concretas resultado de la instanciación de las clases genéricas, con clases ya existentes que no son genéricas, así como reflexionar sobre algunos aspectos de la genericidad que han sido incluidos en el .NET Framework 2.0. El comodín object y la genericidad En las versiones previas a la 2.0 la forma más común de implementar “tipos genéricos” se basaba en el uso del tipo comodín object. Así los métodos de clases como Stack eran consumidores de parámetros de tipo object y/o tenían a object como tipo de retorno (fuente 1). public class Stack { public void Push(object x) {…} public object Pop() {…} public object Peek() {…} ... } Fuente 1 Aunque el tipo object resulta ser una buena alternativa para agrupar y definir estructuras que sirvan para objetos de diferentes tipos, beneficiado además por la capacidad de boxing-unboxing de .NET que permite de manera transparente tratar a los tipos por valor en la jerarquía de object, lo cierto es que por su condición de clase base de toda jerarquía provoca el uso excesivo de casts con la degradación de rendimiento y la aparición de errores cuando estos casts se hacen inadecuadamente. Por ejemplo, en la línea 4 del fuente 2 se hace un cast a int del valor que se extrae de la pila para provocar una división entera entre 2. Como sólo se adicionaron valores enteros (línea 3) el cast es correcto y la división se efectúa correctamente. Sin embargo, en la línea 5 ocurre un error de cast inválido con el tipo float, pues aunque la asignación de un entero a float 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 objeto 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 compilador 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 Stack<int> stack = new Stack<int>(); 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 3 Por lo que disponer ahora de clases genéricas para toda esta familia de contenedores reduce la aparición de errores y mejora el rendimiento de las aplicaciones con la eliminación de casts innecesarios, además de aportar mayor claridad al código. Replicación de código por falta de genericidad Las versiones anteriores del NET Framework están plagadas de clases que se han tenido que implementar sólo para cambiar el tipo general object por tipos específicos. Entre los ejemplos más notables podemos mencionar los delegates manejadores de eventos (*EventHandler) de los controles. Por ejemplo: © Caricatura por Yamil Hernández delegate void MouseEventHandler( object sender, MouseEventArgs args) o delegate void KeyEventHandler( object sender, KeyEventArgs args) La única diferencia entre ambos delegates es el tipo del parámetro args. En el nuevo .NET Framework 2.0 se incluye un único delegate genérico EventHandler<T> donde T debe ser un tipo de heredero EventArgs y representa al segundo parámetro (args) que se usa de manera convencional en los eventos de los controles. Ahora en vez de definir un evento MouseUp como: public event MouseEventHandler MouseUp; Lo que se hace es: public event EventHandler<MouseEventArgs> MouseUp; Sin necesidad de definir un tipo delegate específico. Como resultado se tendrá un evento al que se le podrán anotar métodos como el siguiente: private void MyControl_MouseUp(object sender, MouseEventArgs args) {...} Además de los casos para eventos como el ejemplificado anteriormente, nos encontramos en el .NET Framework 1.1 clases como ControlCollection herederas de CollectionBase y que han definido sus propios métodos Add, Remove, etc., sólo para poder lidiar con un <<dotNetManía Si por el contrario usáramos ahora la nueva clase 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 variable 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, pues ahora sólo indica que debe efectuarse una división real entre el entero devuelto por Pop y el valor 2. 41 << dnm.plataforma.net Con el nuevo .NET Framework 2.0 tenemos toda la jerarquía de Collection genérica, de modo que se puede disponer de la clase deseada con toda la eficiencia de usar el tipo directo y sin necesidad de replicar la programación Sin embargo, en C# 2.0, asignaciones como las de los dos ejemplos anteriores no son permitidas, ni se tienen herramientas en el Framework que faciliten lograr tal efecto. Al menos convendría tener una clase que nos permitiera hacer algo como: IList<Control> controls = Converters.TypeConvert<IList<Control>> (button.ControlsCollection); o tipo específico que represente al tipo de contenido (Control en el caso de ControlsCollection) y de este modo no tener que basarse en los contendores generales que usan el comodín object. La implementación de todos estos métodos se basa de manera similar en delegar en un ArrayList (que sí se basa en object) toda su implementación y hacer internamente los cast correspondientes. Con el nuevo .NET Framework 2.0 tenemos toda la jerarquía de Collection genérica, de modo que se puede disponer de la clase deseada con toda la eficiencia de usar el tipo directo y sin necesidad de replicar la programación. Sin embargo, el espacio de nombres System.Windows.Form no ha sido adaptado a estas nuevas clases genéricas y sigue usando tipos como los delegates antes descritos, y otros como ControlsCollection y TapPageCollection que representan colecciones de tipos específicos. <<dotNetManía La coexistencia y la transición 42 Disponer ahora de clases genéricas aporta mucho, sobre todo en claridad, confiabilidad y productividad porque reduce considerablemente la cantidad de clases a implementar. Sin embargo, la transición al mundo genérico de las clases concebidas sin genericidad no se puede aplicar inmediatamente. Las aplicaciones desarrolladas en el nuevo .NET Framework 2.0 tendrán que poder convivir con la existencia de código anterior a la genericidad. Incluso muchas clases no genéricas de los anteriores espacios de nombres, como el caso ya mencionado de System.Windows.Form, aún no tienen un nuevo representante genérico en el Framework. ¿Significa esto que no podremos usar en contextos no genéricos, objetos provenientes de la genericidad y lo contrario usar en contextos genéricos objetos provenientes del mundo no genérico? Si ahora disponemos de genericidad entonces sería deseable poder hacer algo como: IList<Control> controls = button.ControlsCollection; Si realmente conocemos que ambas clases ofrecen la misma funcionalidad pero que una basa sus métodos en el tipo object y la otra en un tipo genérico. Por el contrario, también podríamos querer usar objetos de tipos genéricos adaptados a contextos no genéricos ya existentes haciendo algo como: ControlsCollection controls = new List<Control>(); ControlsCollection controls = Converters.TypeConvert<ControlsCollection> (new List<Control>()); Para de este modo tratar en un contexto genérico a los objetos formados en un contexto no genérico y viceversa. En la siguiente sección veremos cómo implementar tales conversores. De no genérico a genérico y viceversa Una forma de resolver la asignación de objetos no genéricos basados en el uso de object o de algún tipo específico como Control en el caso de ControlsCollection a variables definidas a partir de un tipo genérico es creando una clase que haga de intermediaria (proxy), como por ejemplo la clase ControlList del fuente 4. public class ControlList : IList<Control> { private ControlsCollection collection; public ControlList(ControlsCollection collection){ Debug.Assert(collection != null, "Parameter collection cannot be null"); this.collection = collection; } public void Add(Control control){ collection.Add(control); } public void Remove(Control control){ collection.Remove(control); } public Control this[int index]{ get { return collection[index]; } set { collection[index] = value; } } ... } Fuente 4 << 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<Control> 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. Fuente 5 Note que la implementación de los métodos es exactamente la misma en ambos fuentes, sólo difieren en el tipo de la variable collection en la que delegan (ControlsCollection en el fuente 4 y IList<Control> en el fuente 5). Siguiendo el patrón de delegación que aplican estos dos fuentes se puede implementar una clase Converters cuyo método TypeConvert cree dinámicamente el tipo que hará de intermediario entre 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 intermediario para asignarlo a la variable correspondiente. El método TypeConvert es genérico y el tipo de lo que devuelve es el mismo de su parámetro genérico (fuente 6 y figura 1). En un artículo previo en dotNetManía “El Poder de la Reflexión en .NET” [3] ilustramos una forma de factorizar clases usando intermediarios emitidos dinámicamente. La implementación de Converters es bastante similar. La diferencia radica en que hay que inspeccionar y emitir tipos basados en la genericidad, lo cual será posible gracias a que la reflexión en el class Converters { ... public static T TypeConvert<T>(object source) { TypeBuilder proxyBuilder = CreateType(typeof(T)); FieldInfo sourceField = AddSourceField(proxyBuilder, source); EmitCtor(proxyBuilder, sourceField); EmitMethods(proxyBuilder, sourceField); Type proxyType = proxyBuilder.CreateType(); ContructorInfo ctor = proxyType.GetConstructor(new Type[] {source.GetType()}); return (T) ctor.Invoke(new object[] { source }); } } Fuente 6 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 en el fuente 6. Note cómo aquí se aplica el operador typeof al parámetro genérico T para obtener un objeto de tipo Type que se corresponde con el tipo utilizado estáticamente para instanciar la llamada a TypeConvert (como cuando se hizo Converters.TypeConvert<IList<Control>>(b); en la figura 1). Usando reflexión el método CreateType crea el AssemblyBuider, ModuleBuilder y TypeBuilder correspondiente a dicho tipo (fuente 7). class Converters { ... static TypeBuilder CreateType(Type target) { AssemblyBuilder assBuilder = new AssemblyBuilder("…"); ModuleBuilder modBuilder = assBuilder.DefineModule(); TypeBuilder result = modBuilder.DefineType(baseType.Name + "Proxy", target); return result; } } Fuente 7 <<dotNetManía public class ControlList : ControlsCollection { private IList<Control> collection; public ControlList(IList<Control> collection){ Debug.Assert(collection != null, "Parameter collection cannot be null"); this.collection = collection; } public override void Add(Control control){ collection.Add(control); } public override void Remove(Control control){ collection.Remove(control); } public override Control this[int index]{ get { return collection[index]; } set { collection[index] = value; } } ... } 43 << dnm.plataforma.net La estrategia que se sigue en la implementación de EmitMethods para emitir cada método es buscar cada método abstract o virtual de la clase que se de como tipo target y por cada uno se busca en la clase que define al tipo del objeto a convertir, algún método que coincida en nombre y signatura. Si tal método existe, entonces se emite en la clase Proxy un método que redefine al método de la clase target y cuya implementación delega en el método correspondiente del objeto a convertir (fuente 8). class Converters { ... static MethodInfo FindImplementation(MethodInfo method, Type sourceType) { foreach (MethodInfo sourceMethod in sourceType) if (method.ToString() == sourceMethod.ToString()) return sourceMethod; return null; } } Fuente 9 class Converters { ... static void EmitMethods(TypeBuilder proxyBuilder, FieldInfo source) { foreach (MethodInfo method in proxyBuilder.BaseType) { MethodInfo sourceMethod = FindImplementation(method, source.FieldType); if (sourceMethod != null) EmitMethod(sourceMethod, source) } } } Fuente 8 No hay ningún problema porque los parámetros genéricos son completamente sustituidos por el JITcompiler cuando se instancian con algún tipo específico. Por ejemplo, el método Add de la interfaz IList<T> definido como: void Add(T element); Al ser inspeccionado aplicando reflexión sobre el tipo IList<Control> será como si originalmente se hubiera sido definido: El fuente 10 muestra la implementación del método EmitMethod. class Converters { ... static MethodInfo EmitMethod( MethodInfo mi, FieldInfo sourceField) { Type[] argsTypes = getTypesOf(mi.GetParameters()); MethodBuilder methodBuilder = proxyTypeBuilder.DefineMethod(sourceMethod.Name, MethodAttributes.Public | MethodAttributes.Override, mi.ReturnType, argsTypes); ILGenerator generator = methodBuilder.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldfld, realTarget); for (int i=0; i < argsTypes.Length; i++) generator.Emit(OpCodes.Ldarg, i+1); OpCode callCode = OpCodes.Call; if (coreMethod.IsVirtual) callCode = OpCodes.Callvirt; generator.EmitCall(callCode, mi, null); generator.Emit(OpCodes.Ret); } } 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: <<dotNetManía Type listType = typeof(IList<Control>); MethodInfo addMethod = listType.GetMethod("Add"); ParameterInfo[] args = (ParameterInfo[]) addMethod.GetParameters(); Type firstArgType = args[0].ParameterType; 44 Se obtiene como resultado en firstArgType el objeto Type correspondiente a Control. Note que en las líneas anteriores se ha inspeccionado el método de la misma forma que se hace con un tipo no genérico. Por todo esto, la implementación del método FindImplementation del fuente 8 no tiene que hacer consideraciones especiales respecto de la genericidad para encontrar los métodos coincidentes en signatura (fuente 9). En el artículo “El Poder de la Reflexión” [3] se explica detalladamente el algoritmo de emisión utilizado por el método EmitMethod. Como se puede notar el mecanismo de conversión anterior también es aplicable al proceso inverso, es decir, cuando se va a asignar un objeto de un tipo obtenido por una instanciación genérica a una variable de tipo que no se ha basado en la genericidad. Es decir, el mismo método TypeConvert puede usarse para hacer: ControlsCollection collection a = Converters.TypeConvert<ControlsCollection>(b); En este caso es el tipo del objeto b el que sería IList<Control>. << dnm.plataforma.net La herencia múltiple es un recurso ausente en .NET y sus lenguajes. Existen diferentes métodos para simular la herencia múltiple. A continuación mostramos cómo podemos simular la herencia múltiple con ayuda de la genericidad y las capacidades de reflexión y emisión de código. Supongamos que queremos que una clase C heredase de dos clases A y B1. Una forma de simular la herencia múltiple es que C heredase de A y que simule la herencia de B delegando internamente en un objeto de tipo B (fuente 11). La variable interna b reproduce la funcionalidad de B que C hubiese querido heredar. El operador de conversión implícita nos permite hacer asignaciones de la forma B unB = new C(); como si C heredase de B. class C : A { protected B b; public C(...){ this.b = new B(...); } ... public static implicit operator B (C c){ return c.b; } } Fuente 11 Con la genericidad podemos “generizar” el patrón anterior. Podemos definir una clase genérica A<T> que sirva para todo aquel que quiera heredar de A y de alguien más (fuente 12) class A<T> : A where T : new() { protected T t; public A(){ this.t = new T(); } public static implicit operator T (A<T> source){ return source.t; } } Fuente 12 1 En este caso lo que hay que hacer ahora es heredar de A<T> instanciando el parámetro genérico T con el otro tipo del cual se quería heredar además de A. class C : A<B> {...} Como A<T> hereda de A podemos hacer A unA = new C(); y, por el operador de conversión implícito, podemos hacer B unB = new C(); Pero lamentablemente con esto no basta como veremos en la sección siguiente. La herencia múltiple es un recurso ausente en .NET y sus lenguajes, pero podemos simularla con la ayuda de la genericidad class C : A { protected InnerB b; public C(...){ this.b = new InnerB(this); } ... public virtual void F(...){ ... } public static implicit operator InnerB (C c){ return c.b; } class InnerB : B { C c; public InnerB(C c){ this.c = c; } public override voif F(...){ c.F(...); } } } Fuente 13 InnerB tenga redefinido el método F de B delegando su implementación en el método F que se defina en C. Lo que ocurre ahora por detrás del telón cuando se hace: B unB = new C(...); Simulando la redefinición de métodos En una situación de herencia múltiple real en la que C heredase de A y B, un método virtual F definido en B puede ser redefinido en C de forma que al hacer: B unB = new C(); ... unB.F(...); se aplique el polimorfismo y se llame al F redefinido en C. Pero como en el patrón de simulación seguido en el fuente 11, la variable en la que se delega es de tipo B, el F al que se seguiría llamando es al de B. Un patrón de solución es el que se muestra en el fuente 13. En lugar de delegar en una variable de tipo B lo que se hace es definir una clase interna InnerB. El método F de C puede ser llamado a partir de la llamada al F de B si hacemos que la variable b refiera a un objeto de otra clase InnerB heredera de B, de modo que El mismo patrón se podría seguir si quisiéramos que heredase de más de dos clases es que se aplica el conversor implícito que lo que hace es devolver el objeto interno b que es de tipo InnerB (que hereda de B) y que por tanto se puede asignar a unB que es de tipo B. Si ahora se hace entonces unB.F(...) lo que ocurre es que se llama al F definido en InnerB que lo que hace a su vez es llamar al c.F(...) lográndose el efecto del polimorfismo. ¿Podemos llevar esta solución al patrón genérico visto anteriormente? Note (fuente 13) que al redefinir F en C es porque sabemos quién es la clase de la cual queríamos simular herencia múltiple (B en este caso) y que sabemos que esta clase tiene un F. ¿Cómo saber si el tipo con el que vamos a instanciar al parámetro genérico T tiene un método F? El recurso de genericidad restringida where de C# 2.0 parece ayudarnos a acercarnos a una solución La idea es no permitir que cualquier tipo pueda usarse para instanciar a la clase genérica sino sólo aquellos que cumplan con las restricciones indicadas (fuente 14). <<dotNetManía Simulando herencia múltiple mediante la genericidad 45 << dnm.plataforma.net interface IHasF { void F(...); } class A<T> : A where T : IHasF, new() { protected T t; public A(){ this.t = new T(); } ... } Fuente 14 De este modo si B implementa IHasF, y tiene un constructor por defecto, para que valga hacer el this.t = new T(), se puede hacer: class C: A<B>{...} Se podría ahora intentar completar el resto del patrón genérico que seguimos en el fuente 13 para hacer algo como lo que se indica en el fuente 15. Pero lamentablemente esto no es posible porque en la genericidad del .NET 2.0 no se puede heredar de un tipo que sea parámetro genérico2. class A<T> : A where T : HasF, new() { protected T t; public A(){ this.t=Converters.TypeConvert<T>(this); } public virtual void F(...) {} } Fuente 16 Emitiendo tipos genéricos Aplicar patrones genéricos, como el que se ha visto en la sección anterior para simular la herencia múltiple, nos ilustra lo que ahora podemos explotar con la genericidad de .NET 2.0. Sin embargo, para un desarrollador no avezado esto puede resultar difícil y propenso a cometer errores. Podría pensarse entonces en desarrollar alguna herramienta que automatice la labor de “generar una clase genérica” permitiendo hacer cosas como esta de “multiplicar” nuestra herencia. Digamos que pudiéramos tener un método: class A<T> : A where T : IHasF, new() { protected InnerT t; public A(){ this.t = new InnerT(this); } public virtual void F(...) {} class InnerT : T { // Error: No se puede heredar de T porque es un parámetro genérico A<T> at; public InnerT(A<T> at){ this.at = at; } public override void F(...){ at.F(...); } } } <<dotNetManía Fuente 15 46 ¿Y tanto nadar para ahogarse en la orilla? podrá preguntarse con razón el lector. Lo que nos hace falta es un tipo que herede de T y que delegue la implementación de sus métodos virtuales en los métodos correspondientes de A<T>. Esto lo podríamos solucionar si podemos convertir un objeto de tipo A<T> en T, que es precisamente lo que hace el método TypeConvert de nuestra clase Converters: 2 class MultipleInheritance { ... public static Type EmitGenericSubtype( Type baseType, Type constrainType) {...} } que genera dinámicamente y devuelve el tipo genérico equivalente a haber definido estáticamente algo como: class baseType<T>:baseType where T : constrainType Es decir, que si ejecutamos: MultipleInheritance.EmitGenericSubtype( typeof(A), typeof(HasF)) se generaría una clase genérica equivalente a la que se muestra en el fuente 16. Afortunadamente con la reflexión del .NET Framework 2.0 podemos emitir clases genéricas a partir de cambios que se hicieron en algunas clases como TypeBuilder, que fue enriquecida con métodos como: GenericParameterBuilder[] DefineGenericParameters(string[] names); Este método permite indicar los nombres de los parámetros genéricos del tipo emitido por TypeBuilder. A su vez el tipo GenericTypeParameterBuilder, que hereda de TypeBuilder, permite emitir cada parámetro genérico. Con su método SetBaseTypeConstrains se pueden especificar los tipos a los que está restringido cada parámetro y con el método SetGenericParameterAttributes se puede indicar que el tipo tiene que tener constructor por defecto explícito. Por razones de espacio no se puede dar aquí la implementación de este generador de tipos genéricos (el lector interesado puede descargárselo del sitio de dotNetManía). Conclusiones Invitamos a los lectores de dotNetManía a disfrutar de la genericidad que viene con Visual Studio 2005 y el .NET Framework 2.0, a la vez que con ello puedan potenciar su capacidad de desarrollo. Esperamos con este artículo haber develado algunos secretos de lo que puede lograrse, otros trabajos deben estar por venir. Referencias [1] Meyer Bertrand, “EIFFEL The Language”, Prentice Hall 1992, ISBN 0-13-247925-7 [2] Som Guillermo,“Generics y Visual Basic”, dotNetmanía No 8, Octubre 2004, Ed Netalia, España M-3.075-2004 [3] del Valle Mario, Katrib Miguel,“El poder de la reflexión en .NET”, dotNetmanía No 3,Abril 2004, Ed Netalia, España M-3.075-2004 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. 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 AG OT AD O Aún está a tiempo ❑ Nº 7 ❑ Nº8 ❑ Nº9 ❑ Nº13 ❑ Nº14 ❑ Nº15 Nº16 ❑ Nº10 ❑ Nº11 ❑ Nº12 ❑ Nº18 ❑ N19 AG OT AD O ❑ Nº6 ✃❑ ❑ Nº17 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 ❑ Talón nominativo a nombre NETALIA, S.L. ❑ Transferencia bancaria a nombre de NETALIA, S.L. a: La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia) ❑ Domiciliación Bancaria (con renovación automática, previo aviso) Indique su número de cuenta: ❑ Tarjeta de crédito ❑ VISA ❑ MASTERCARD Número de su tarjeta: Fecha de caducidad: / (imprescindible) Firma y/o sello a de Puede enviar sus datos por Fax al 91 499 13 64, o por teléfono al 91 666 74 77, o por email a la dirección [email protected], o también puede enviarlos por correo postal a la siguiente dirección: de 2005 Usted autoriza a la mecanización de estos datos. El responsable y destinatario de éstos es Netalia, S.L. Usted tiene derecho a acceder a sus datos, modificarlos y cancelarlos cuando lo desee. Sus datos no serán cedidos en ninguna de las formas posibles a terceras partes y no se utilizarán más que para el buen funcionamiento de su suscripción a la revista dotNetManía y para informarle de las actividades comerciales que realice la editorial Netalia, S.L. Si no desea recibir información comercial de dotNetManía marque la casilla siguiente ❑ Netalia, S.L. C/ Robledal, 135 28529- Rivas Vaciamadrid (Madrid) dnm.inicio.fundamentos dnm.lenguajes.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 lenguaje 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 lector 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 Visual Basic, (que a partir de esta versión deja de llamarse .NET para pasar a usar la versión de Visual 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 desarrollo (o editor). menú “Herramientas>Opciones>Proyectos y Soluciones> Valores predeterminados de VB”, tal como se muestra en la figura 1. 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úmero 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 lenguaje y del entorno de desarrollo de Visual Basic 2005, quisiéramos indicar unas recomendaciones que cualquier desarrollador que quiera tomarse en serio la escritura de código con Visual Basic. Option Strict On:Ayuda a escribir mejor código Guillermo “Guille” Som es Microsoft MVP de Visual Basic desde 1997. Es redactor de dotNetManía, miembro de Ineta Speakers Bureau Latin America, mentor de Solid Quality Learning Iberoamérica y autor del libro Manual Imprescindible de Visual Basic .NET. http://www.elguille.info La primera de ellas es que seleccione la opción de comprobación estricta del código, (Option Strict On), ya que esta opción, a pesar de lo que muchos piensan, nos ayudará a evitar muchos errores antes de compilar el código, ya que aprovecha una de las características exclusivas del entorno de desarrollo (o editor) de Visual Basic: la compilación en segundo plano mientras escribimos. Para que esta opción esté activada en todos los proyectos que creemos, debemos seleccionarla mediante el ¿Dónde están mis ficheros? La segunda es indicar que, debido a cómo se manejan los proyectos y las configuraciones de los mismos en Visual Studio 2005, hay ciertos ficheros, que aparentemente han desaparecido, entre ellos el fichero AssemblyInfo, las declaraciones de los controles añadidos a los formularios y las referencias a los ensamblados externos: referencias y referencias Web. Realmente estos ficheros no han desaparecido. En el caso de la definición de los controles de los formularios, estos están en un fichero aparte, de forma que aprovecha una de las novedades de VB2005: las clases parciales. Para poder mostrar todos estos elementos que antes teníamos en el explorador de soluciones, tendremos que pulsar en el segundo botón de la barra de herramientas del explorador de soluciones, (ver figura 2). << dnm.lenguajes.vb Como vemos en la figura 2, ese botón tiene también la misma funcionalidad de las versiones anteriores de mostrar todos los ficheros y directorios de la carpeta en la que tenemos nuestro proyecto. Además nos muestra algunos de los ficheros con un símbolo más (+) que nos indica que hay algo más. Aunque ese “algo más” que hay oculto normalmente está generado por el propio entorno, por tanto, no deberíamos modificarlos directamente. Propiedades del proyecto: Mejor organizado y más asequible Como hemos comentado, muchas de las opciones que el IDE de Visual Basic 2005 nos oculta es porque podemos asignarlas mediante ventanas de propiedades, como puede ser la de las propiedades del proyecto, que ahora tiene una nueva presentación por fichas que son más fáciles de manejar y que recopila otras configuraciones que anteriormente estaban disponibles en otros menús o en ficheros de configuración. Por ejemplo, los valores contenidos en el fichero AssemblyInfo están asequibles desde un cuadro de diálogo que se accede desde la ficha “Aplicación”, tal como podemos ver en la figura 3, en la que además podemos ver el resto de fichas de configuración, entre ellas la de referencias. Para acceder a esta ventana de configuración, podemos hacerlo de la misma forma que en versiones anteriores, seleccionando el proyecto y bien usando el botón secundario del ratón o bien desde el menú “Proyecto”, seleccionaremos la opción “Propiedades”, con Visual Basic 2005 también podemos hacer doble clic en el elemento Novedades en el lenguaje Para poder ofrecer mayor funcionalidad, el propio lenguaje de Visual Basic se ha visto mejorado con nuevas instrucciones, de forma que no sea necesario acudir a la librería de clases de .NET para poder disfrutar de nuevas características. Para ser justos, debemos decir que muchas de las novedades incluidas en el propio lenguaje de Visual Basic 2005 son características que ya incluía su compañero de viaje C#; esto lo pone a un nivel que antes no tenía, y por lo que ha sido muy criticado e incluso etiquetado como “lenguaje de juguete”. A partir de esta versión de Visual Basic, si bien aún no incluye todas las características que muchos hemos solicitado, podemos afirmar que quién no saque el máximo rendimiento a este lenguaje, no será un problema propio del lenguaje, sino una falta de visión de los desarrolladores de versiones anteriores que aún no acaban de adaptarse. Confiamos que este artículo motive a aquellos que no se deciden a dar el salto final. Compatibilidad con el CLS Debido a que algunas de las novedades que incluye Visual Basic 2005 son características que no están definidas en el CLS (Common Language Specifications), en esta versión el atributo que indica que el código usado en nuestra aplicación es compatible con esas especificaciones (CLSCompliant) ya no se incluye por defecto en el fiche- <Assembly: CLSCompliant(True)> Esto hará que el compilador nos advierta de esa incompatibilidad en nuestro código. Aunque no debemos asustarnos por ser “incompatibles”, ya que esto solamente afectará a los proyectos de tipo Librería de clases (DLL) que queramos usar con otros lenguajes de .NET, y si ese lenguaje es C#, podemos tener la certeza de que nuestra DLL será compatible, ya que las características del lenguaje que hacen a VB2005 incompatible con el CLS son las que han tomado “prestadas” de C#. Tipos numéricos sin signo En toda su historia, el lenguaje BASIC nunca ha tenido tipos numéricos sin signo, salvo el tipo Byte. En esta versión se incluyen todos los que actualmente existen en la plataforma .NET: Uint16, UInt32 y UInt64. Lo novedoso es que se han añadido palabras clave al lenguaje para representar a esos tipos de datos: UShort, UInteger y ULong respectivamente. También se ha incluido el tipo SByte que es un tipo de datos entero de 8 bits “con signo”. Todos estos tipos de datos no son compatibles con las especificaciones de .NET, por tanto, debemos tener cuidado a la hora de usarlos como valor devuelto por una función o propiedad o como tipo de datos usado como parámetro de cualquier método. Para mejorar la lectura, sobre todo cuando trabajamos con constantes <<dotNetManía Figura 2. Mostrar todos los archivos de un proyecto de VB2005. ro AssemblyInfo, cosa que antes siempre ocurría, debido a que el código generado por todas las versiones anteriores a la 2005 eran totalmente compatibles con las especificaciones comunes del lenguaje, por la sencilla razón de que no disponía características que lo hicieran incompatiFigura 3. Propiedades del proyecto e información ble. Por tanto, si queremos del ensamblado. que el compilador compruebe dicha compatibilidad con el CLS, debemos añadir la “My Project” del explorador de solusiguiente línea de código al mencionaciones (ver figura 2). do fichero: 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 nuevos tipos. Estos sufijos empiezan con la letra U y pueden ser: US para el tipo UShort, UI para el tipo UInteger y UL para el tipo ULong. 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 Instrucción Continue Esta instrucción nos permitirá continuar un bucle sin necesidad de tener que alcanzar el código que hace que se repita. Y su utilidad está en que nos evitará usar condiciones para que en la repetición del bucle no “pase” por una parte del código. Por ejemplo, si tenemos un bucle For y parte del código contenido en dicho bucle no siempre debe ejecutarse, lo que hasta ahora hacemos es algo como esto: For... Código que siempre se ejecuta If <condición> Then Código a ejecutar solo si se cumple la condición End If Next Si usamos la instrucción Continue, el seudo-código quedaría de esta forma: For... Código If Not Código cumple Next que siempre se ejecuta <condición> Then Continue For a ejecutar solo si se la condición [ ] <<dotNetManía NOTA 50 Esto mismo, en los viejos tiempos del GoTo, se solucionaba dando un salto desde el IF a la línea en la que está el Next,pero... ¿quién usa ya el GoTo? Nadie,pero aún así, en Visual Basic 2005 se sigue soportando esta instrucción e incluso utilizando IntelliSense para mostrar la línea a la que se realizará el salto. ¡Así nos va! Visual Basic se ha visto mejorado con nuevas instrucciones, de forma que no sea necesario acudir a la librería de clases de .NET para poder disfrutar de nuevas características La instrucción Continue se puede usar con cualquiera de los bucles soportados por Visual Basic: Do/Loop, While y For/Next, usándose de la misma forma que la instrucción Exit, es decir, para continuar un bucle Do/Loop usaremos Continue Do, y para continuar uno del tipo While usaremos Continue While. El operador IsNot Con este operador las condiciones usadas para comprobar si un tipo por referencia no es de un tipo determinado resultarán más fáciles de escribir y consecuentemente el código resultante será más legible. Hasta ahora si, por ejemplo, queríamos comprobar si una variable no contenía un valor nulo, lo hacíamos así: If Not variable Is Nothing Then ... Usando este operador, el código anterior quedaría de esta forma: If variable IsNot Nothing Then... Como podemos comprobar, resulta más legible esta segunda forma. Este operador sólo podemos usarlo con variables y tipos por referencia. Ya que para los tipos por valor podemos usar el operador distinto de (<>), que sería el equivalente. to u objetos indicados después de Using. Esto nos garantiza que siempre se llamará al método Dispose, con la ventaja añadida de que esa llamada al método que liberará los recursos se hará incluso si se produce algún error que no tengamos controlado. Using sería equivalente a usar un Try/Finally, de forma que en el bloque Finally llamemos al método Dispose del objeto. Por tanto, los objetos que podemos usar con esta instrucción deben implementar la interfaz IDisposable, que es la que garantiza que dicho objeto tenga ese método. La forma de usar esta instrucción es: Using variable As New Recurso Código a ejecutar End Using El ámbito de la variable declarada con la instrucción Using será el propio bloque de código. En caso de que indiquemos más de un objeto con la misma instrucción, los tendremos que separa con comas: Using variable As Recurso, variable2 As Recurso2, variable3 Código a ejecutar End Using En este caso, definimos dos variables junto a la instrucción Using, además de usar otra variable definida anteriormente. La instrucción Using Declaración explícita del índice inferior de los arrays Esta es una instrucción de bloque, es decir, el contenido estará definido por la instrucción Using y acabará con End Using. Después de Using indicaremos uno o varios objetos que utilizarán algún recurso del sistema. Cuando acabe el código contenido en el bloque, ese recurso se liberará llamando al método Dispose del obje- Los arrays de .NET, y por extensión los arrays de Visual Basic 2005, a diferencia de lo que ocurría en Visual Basic 6,0 y anteriores, siempre tienen el valor cero como índice inferior. Esto en principio no supone ningún problema, al menos si hemos “cambiado el chip” que teníamos al usar los arrays de VB6, ya que en esa << dnm.lenguajes.vb versión podíamos indicar un rango de índices de la forma <valor inferior> To <valor superior>. Pero al igual que ocurría en VB6, también podemos declarar arrays sin indicar ese rango de valores, el problema es que al usar esa forma de declarar, en la que sólo se indica un valor, es que dicho valor representa el índice superior del array, de forma que si tenemos esta declaración: Dim nombres(5) As String Aparentemente estamos declarando un array con cinco elementos, pero en realidad son seis los elementos: desde 0 hasta 5, ambos inclusive. Para solventar este tipo de declaraciones, que puede ser confusa para los desarrolladores de C++ o C#, en esta nueva versión de Visual Basic se ha añadido la instrucción (por llamarla de alguna forma), 0 To, la cual se podrá usar en la declaración de los arrays para que quede más claro que realmente estamos definiendo un array con elementos desde cero hasta el valor indicado después de To, usando el ejemplo anterior, ahora quedaría de esta forma: Dim nombres(0 To 5) As String Con lo que podemos comprobar que se consigue mayor claridad. con la sobrecarga y conversiones, también se indican algunos consejos de “buen uso”. Y cómo no tenemos todo el espacio que sería necesario, veremos sólo unos ejemplos de cómo hacer eso mismo desde Visual Basic 2005. Definir una sobrecarga Lo primero que debemos saber es que los operadores que nosotros podemos definir en realidad son funciones estáticas o compartidas, es decir, son métodos que siempre están disponibles en el tipo en el que lo definimos y siempre devuelven un valor. Pero, en lugar de usar la instrucción Function para definirlas, usaremos la nueva instrucción Operator seguida del operador que queremos sobrecargar. En el fuente 1 tenemos la declaración de una estructura en la que hemos sobrecargado el operador de la suma. La decisión de qué es lo que ocurre cuando se suman dos valores de este tipo, la tomamos nosotros y es el código que utilizaremos dentro de la declaración del operador. En este caso, creamos un nuevo objeto a partir del resultado de sumar los valores de las propiedades X e Y, y es ese nuevo objeto el que devolvemos. Con el resto de operadores haríamos lo mismo. Y para usar este operador sobrecargado, lo haríamos igual que con cualquier otro tipo de datos definido previamente en las clases de punto NET, tal como vemos en el fuente 2. Dim p1 As Dim p2 As Dim p3 As p3 = p1 + New Punto(10, 15) New Punto(22, 33) Punto p2 Fuente 2. Uso del operador sobrecargado del tipo Punto Public Structure Punto Public X As Integer Public Y As Integer Public Sub New(ByVal x As Integer, ByVal y As Integer) Me.X = x Me.Y = y End Sub ' 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) End Operator End Structure Fuente 1. Definición de la estructura Punto con sobrecarga del operador + Esta es otra de las características que Visual Basic ha heredado de los lenguajes de la familia C. Con la primera podemos crear nuestras propias versiones de los operadores aritméticos y lógicos, de forma que podamos definir el comportamiento que tendrá, por ejemplo, el operador suma (+) en una clase o estructura que nosotros definamos; la segunda nos permite indicar cómo se realizarán las conversiones de nuestros tipos con respecto a otros tipos de datos, ya sean definidos en la propia librería de clases de .NET Framework o con otros tipos. Del tema de la sobrecarga de operadores y conversiones, desde el punto de vista de un desarrollador de C#, ya lo vimos en el número 9 de dotNetManía, en ese artículo, además de explicar todo lo relacionado Como podemos comprobar, la sintaxis usada es: Public Shared Operator + (expresión izquierda, expresión derecha) As Punto Public Shared es porque los operadores siempre estarán disponibles y deben pertenecer al propio tipo de datos. Operator + indica que estamos sobrecargando un operador, en este caso el de la suma. Los dos parámetros usados representarán a la expresión izquierda y derecha respectivamente; dichas expresiones pueden ser de cualquier tipo, pero siempre deben representar a un valor de tipo Punto. El valor devuelto es del tipo Punto, de forma que se genera un nuevo Punto con el resultado de sumar los dos indicados como argumentos del operador. Una cosa importante que debemos saber es que solamente podremos usar las sobrecargas que hemos definido, en este caso solo tenemos creada una sobrecarga de la suma de dos valores de tipo Punto, por tanto si pretendemos hacer esto: p3 = p1 + 15 Se producirá un error, por la sencilla razón de que no hemos definido qué es lo que tenemos que hacer para sumar un Punto con un entero. La primera solución será definir esa sobrecarga, es decir, el argumento de la izquierda de tipo Punto y el de la derecha de tipo Integer: Public Shared Operator + (ByVal p1 As Punto, ByVal i As Integer) As Punto Return New Punto(p1.X + i, p1.Y) End Operator <<dotNetManía Sobrecarga de operadores aritméticos y conversiones personalizadas 51 << dnm.lenguajes.vb Mediante la sobrecarga de operadores podemos definir el comportamiento de nuestros tipos al usar los operadores aritméticos y lógicos El problema es que con esta sobrecarga sólo podemos hacer que el código anterior funcione, pero este otro volverá a fallar: p3 = 25 + p1 Porque no hemos definido la sobrecarga de la suma de un entero y un tipo Punto (en ese orden). Por tanto, la solución será crear una nueva sobrecarga del operador en la que se indiquen los parámetros en ese mismo orden. ¿Y si quisiéramos definir sobrecargas para más tipos de datos? Pues lo mismo... tendríamos que definir dos sobrecargas para cada uno de los tipos de datos que queramos soportar, cada una de ellas definiendo el tipo en el “lado” correcto de la operación. Tedioso ¿verdad? Efectivamente hacer esto sería muy “cansado”, pero afortunadamente podemos aprovechar una característica del compilador de Visual Basic conocida como promoción de tipos. La promoción de tipos no es ni más ni menos que la conversión “automática” de un tipo en otro diferente. Por ejemplo, si tenemos una variable de tipo Short (entero de 16 bits) y queremos guardar su valor en otra de tipo Integer (entero de 32 bits), no tenemos que hacer ningún tipo de conversión, ya que el compilador “sabe” cómo convertir un valor Short en un Integer. Y esta sabiduría la podemos aprovechar nosotros usando otra de las nuevas características de Visual Basic 2005: la conversión personalizada de tipos. <<dotNetManía Definir conversiones de datos 52 De la misma forma que podemos sobrecargar un operador, podemos sobrecargar la conversión de datos, particularmente la instrucción CType, de forma que podamos indicar cómo actuará el compilador cuando se encuentre con una conversión de cualquier tipo al nuestro o del nuestro a otro tipo. Como sabemos, existen dos tipos de conversiones: las implícitas, también llamadas de expansión o promoción, es decir, las que usamos sin necesidad de hacer ninguna conversión de datos, por ejemplo, cuando convertimos un valor Short en uno de tipo Integer, estamos “promocionando” el valor entero de 16 bits en otro de 32 bits; el otro tipo de conversión es la llamada de reducción y es el tipo de conversión que hay que hacer explícitamente, es decir, debemos indicar que queremos convertir un tipo en otro diferente. Este segundo tipo de conversiones se usan cuando se puede producir una pérdida de información, por ejemplo, si queremos guardar en una variable de 16 bits el contenido de una de 32 bits, es muy posible que se produzca pérdida de información, ya que el valor de 32 bits posiblemente no pueda convertirse en otro de menos capacidad. Sabiendo esto, podemos afirmar que las conversiones implícitas se harán siempre que esa conversión no produzca pérdida de información y para realizarla no tenemos que indicar ninguna conversión. Por otra parte, las conversiones explícitas, que son las que tenemos que indicar expresamente que nuestra intención es hacer una conversión entre dos tipos de datos, las usaremos cuando se pueda producir alguna pérdida de información y/o se pueda producir alguna excepción. En Visual Basic las conversiones implícitas se definen usando la instrucción Widening en la declaración del operador CType: Pero si lo que pretendemos es convertir un tipo Punto a entero, podíamos devolver el contenido de la propiedad X; en este caso es conveniente definirla como una conversión explícita, ya que perderemos 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 de un tipo Punto a uno entero–: Public Shared Narrowing Operator CType( ByVal p1 As Punto) As Integer Return p1.X '+ p1.Y End Operator Y podemos usarla haciendo una conversión explícita: Dim i As Integer = CType(p3, Integer) Console.WriteLine( “valor de CType(p3, Integer) = {0}”, i) Como lo que estamos haciendo con ese CType es convertir la variable p3 en un entero, podemos usar la función de conversión CInt en su lugar, obteniendo el mismo resultado: Dim i As Integer = CInt(p3) [ ] Public Shared Widening Operator CType( ByVal x As Integer) As Punto Return New Punto(x, 0) End Operator En este caso estamos declarando una conversión implícita de Integer a Punto, con lo cual podemos hacer algo como esto: Dim p4 As Punto = 15 NOTA Cuando hacemos sobrecargas de operadores o conversiones en nuestros propios tipos, al menos uno de los parámetros o el tipo devuelto debe ser del mismo que el tipo en el que se declaran,esto es para que no podamos definir operadores o conversiones de tipos de los que no tengamos la declaración. Conversiones automáticas Como hemos comentado anteriormente, el compilador de Visual Basic ya sabe cómo hacer ciertas conversiones implícitas, por tanto, si le “enseñamos” cómo hacer una conversión del tipo Punto a un entero de 32 bits, Visual Basic sabrá cómo convertir “automáticamente” un Punto a un entero de menor capacidad: Dim s As Short = 12 Dim p5 As Punto = s Console.WriteLine(“valor de p5 = {0}”, p5) << dnm.lenguajes.vb Los tipos generics nos permiten crear colecciones fuertemente tipadas en las que el tipo “real” es el indicado en el constructor Dim l As Long = 12345678901234567890L Dim p6 As Punto = CType(l, Punto) Console.WriteLine(“valor de p6 = {0}”, p6) El problema surgirá, como en este caso, si el contenido de la variable l es mayor de la capacidad de un entero de 32 bits, lo que producirá un error de desbordamiento (overflow) en tiempo de ejecución. La solución sería, por un lado cambiar las opciones de compilación para que no se tengan en cuenta las excepciones causadas por desbordamiento de enteros, o bien, definir la sobrecarga de conversión para que utilice un valor Long en lugar de uno entero. Por supuesto, el valor Long indicado en la declaración del operador lo tendríamos que convertir en uno entero, y deberíamos hacer nuestras comprobaciones por si se produce un error de desbordamiento. Pero con esta nueva definición del operador de conversión nos aseguramos de que podemos indicar cualquier tipo entero con signo para que se asigne automáticamente a un valor de tipo Punto. Lo mismo es aplicable a las conversiones entre tipos Double y Single, si definimos la conversión de Double, el compilador de VB se encargará de hacer la otra conversión. Sobrecarga de operadores lógicos Además de los operadores aritméticos, podemos sobrecargar los operadores lógicos, los que utilizamos para hacer comparaciones y, como veremos, también podemos sobrecargar el comportamiento de nuestro tipo en los casos que tenga que devolver un valor verdadero o falso. Empecemos con los operadores lógicos. Como sabemos, siempre que hacemos una comparación, ésta se puede hacer de dos formas distintas, por ejemplo, podemos comprobar si dos valores son iguales, y también podemos hacer la comprobación de si son distintos. Debido a esta dualidad de los operadores lógicos, cuando sobrecargamos uno de ellos, debemos sobrecargar también el complementario, y en el caso del operador igual (y distinto) deberíamos crear una sobrecarga del método Equals, de forma que también devuelva un valor que se ajuste a la forma de comprobar la igualdad de dos objetos de nuestro tipo de datos. La forma de declarar estos operadores es similar a la que ya hemos visto, aunque, en estos casos, el valor devuelto debe ser un valor de tipo Boolean, ya que eso es lo que se espera cuando hacemos algún tipo de comparación. Por ejemplo, podríamos definir los operadores igual y distinto de nuestro tipo Punto tal como se muestra en el listado del fuente 3. [ ] NOTA Es recomendable que siempre que sobrecarguemos los operadores igual y distinto, sobrecarguemos el método Equal, aunque, a diferencia de C#,Visual Basic no nos avisará de que no hemos realizado esta sobrecarga. En estos casos, también se recomienda sobrecargar el método GetHashCode. Operadores IsFalse y IsTrue Estas dos nuevas instrucciones de Visual Basic 2005 sólo se pueden usar para crear sobrecargas, en este caso para sobrecargar el comportamiento de nuestro tipo cuando debe devolver un valor ' Sobrecarga de los operadores igual, distinto y sobrecarga de Equals Public Shared Operator =(ByVal p1 As Punto, ByVal p2 As Punto) As Boolean Return (p1.X = p2.X AndAlso p1.Y = p2.Y) End Operator Public Shared Operator <>(ByVal p1 As Punto, ByVal p2 As Punto) As Boolean ' Podemos llamar a la sobrecarga de la igualdad Return Not (p1 = p2) End Operator ' Equals nunca debe producir una excepción, ' por tanto, si el argumento no es de tipo Punto, devolvemos False Public Overrides Function Equals(ByVal obj As Object) As Boolean If TypeOf obj Is Punto Then Return Me = CType(obj, Punto) Else Return False End If End Function Fuente 3. Definición de los operadores igual y distinto Como podemos observar en el fuente 3, sólo hemos codificado el operador igual, para el operador distinto, y la sobrecarga del método Equals utilizamos la definición de la sobrecarga de igualdad. verdadero o falso. Estas dos instrucciones equivaldrían a sobrecargar los valores True y False para que se adecuen a nuestro tipo. Al igual que ocurre con los operadores de comparaciones, se deben sobrecargar los dos operadores. <<dotNetManía 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 posteriormente utilizar la sobrecarga que asigna un Integer a un Punto. El código que tendríamos que usar (tal y como tenemos las sobrecargas) sería el siguiente: 53 << dnm.lenguajes.vb ' Sobrecarga de IsFalse y IsTrue Public Shared Operator IsFalse(ByVal p1 As Punto) As Boolean Return p1.X = 0 AndAlso p1.Y = 0 End Operator Public Shared Operator IsTrue(ByVal p1 As Punto) As Boolean Return p1.X <> 0 OrElse p1.Y <> 0 End Operator Fuente 4. Sobrecarga de los operadores IsTrue y IsFalse, para usar nuestros tipos en comparaciones En el fuente 4 podemos ver el código de estas dos sobrecargas en el tipo Punto. ¿Qué operadores podemos sobrecargar? En la tabla 1 podemos ver los operadores que podemos sobrecargar en Visual Basic. Los indicados como unarios significa que el operador sólo reciben un argumento, los binarios, por otra parte, reciben dos argumentos, que representan a las expresiones situadas a la izquierda y a la derecha del operador. [ ] NOTA El operador de asignación (=) no se puede sobrecargar,ni tampoco los operadores de incremento,pero si los usamos, el compilador sabrá lo que tiene que hacer con ellos, y si hemos definido una sobrecarga,la usará.Por ejemplo, si hacemos esto: p1 += 1, el compilador usará la sobrecarga de la suma ya que ese código sería equivalente a este otro: p1 = p1 + 1. Tipo Operadores Unario Binario +, -, IsFalse, IsTrue, Not +, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor Conversión (unario) CType <<dotNetManía Tabla 1. Los operadores que podemos sobrecargar en Visual Basic. 54 Novedades de .NET Framework 2.0 Con total seguridad, las novedades que más llaman la atención, no sólo de Visual Basic, sino también de C#, son las incorporadas en el propio .NET Framework. ¿Quién a estas alturas no ha oído mencionar los tipos generics? Seguro que todos los lectores. Y si, por esas casualidades de la vida, el que lee aún no sabe qué son los tipos generics, está de suerte, ya que en este mismo número y de la mano de Mario del Valle y de Miguel Katrib (ambos del grupo WEBOO) han escrito un estupendo artículo que trata en profundidad esta nueva incorporación de .NET Framework 2.0, aunque desde el punto de vista del desarrollador de C#, pero si quiere saber cómo usar estos tipos de datos en Visual Basic 2005, puede descargar gratuitamente el número 8 de dotNetManía en el que tratamos los generics desde la perspectiva del desarrollador de Visual Basic. De los tipos generics hablaremos muy poco, ya que, tal como hemos comentado, está ampliamente tratado en este mismo número y en el número 8 de esta revista, pero desde que se publicó el artículo para Visual Basic 2005 hasta ahora han pasado unos meses y el artículo anterior se basaba en la versión beta 1, y como se ha añadido nueva funcionalidad para los desarrolladores de Visual Basic, trataremos esas novedades, aunque sea brevemente. Pero primero veamos cómo podemos usar los tipos generics, para que nos sirva como recordatorio y también de paso para comprender cómo utilizarlos en Visual Basic, por tanto, veamos el código fuente 5 en el que declaramos una colección que sólo acepte tipos de datos Cliente. Dim col As New List(Of Cliente) Dim c As New Cliente("Juan", 33) col.Add(c) col.Add(New Cliente) col(1).Nombre = "Pepe" Fuente 5. Ejemplo de colección generic con valores de tipo Cliente Como ya han explicado nuestros compañeros, la ventaja de este tipo de colecciones es que el tipo de datos utilizado por la colección col realmente es de tipo Cliente, con lo cual ganamos en rendimiento, ya que .NET no se ve obligado a convertir los valores almacenados en Object y tampoco tenemos que hacer conversiones a la hora de utilizarlos, tal como podemos ver en la figura 4, el compilador “sabe” cuál es el tipo de datos que almacena la colección y, por tanto, nos permite el uso de IntelliSense a la hora de acceder a los valores almacenados. Figura 4. IntelliSense nos muestra los tipos almacenados en las colecciones generic. Los tipos de restricciones que podemos hacer En Visual Basic 2005, las restricciones que podemos hacer en nuestros tipos generic pueden ser como en C#, y entre las diferencias que han surgido desde que se publicó el artículo del número 8 de dotNetManía, tenemos que ya se puede indicar si el tipo puede ser un tipo por valor o un tipo por referencia; para estos casos, usaremos en la lista de restricciones las instrucciones Structure y Class respectivamente. En el código mostrado en el fuente 6, hemos definido una clase que utiliza generics con restricciones para que el tipo usado sea por referencia e implemente la interfaz IComparable. ' Tipo Generic con restricciones ' el tipo indicado debe ser un tipo por ' referencia e implementar IComparable Public Class UnGeneric(Of T As _ {Class, IComparable}) Fuente 6. Definición de una clase generic con restricciones << dnm.lenguajes.vb ] Las restricciones las podemos usar tanto en las declaraciones de clases generic como en los métodos que reciban parámetros genéricos Tipos por valor con valores indefinidos (Nullable types) En este mismo número, en el artículo de nuestro compañero Octavio Hernández sobre las novedades de C#, habla sobre estos tipos de datos, y para no confundir mucho las cosas, utilizaré la misma traducción que él le ha dado al original inglés Nullable types: tipos por valor anulables, ya que el uso de tipos por valor con valores indefinidos resulta un poco largo. A diferencia de C#, Visual Basic 2005 no incluye instrucciones o palabras propias del lenguaje para tratar estos nuevos tipos de datos, para ello tendremos que esperar a la nueva versión, en la que se incorpora una sintaxis parecida a la de C#. Pero como no estamos hablando de lo que se incluirá en VB, sino lo que se incluye en la versión que este mismo mes se lanza, veremos cómo usar este tipo de datos, ya que nos resultarán muy útiles particularmente en las aplicaciones con las que accedemos a bases de datos. 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 al que también podemos asignar un valor nulo como a los tipos por referencia.” Los tipos por valor anulables que utilizaremos en Visual Basic será el tipo generic Nullable(Of T), es decir, siempre indicaremos el tipo por valor que queremos que contenga, de forma que, si el valor contenido es un valor nulo, indicará que dicho tipo no contiene un valor válido. Y esa es la verdadera validez de este tipo de datos. Como hemos comentado anteriormente esta circunstancia es muy útil cuando trabajamos con valores contenidos en bases de datos, ya que uno de los estados de esos datos puede ser el “indefinido”, es decir, un valor nulo. Dicho valor nulo no representa un valor real. Por ejemplo, si tenemos esta declaración: Dim nBool As Nullable(Of Boolean) La variable nBool puede contener tres valores: Nothing (o nulo, que indica que no está asignado), True o False (que son los dos valores válidos para los tipos Boolean). Como vemos, esto difiere de una variable declarada con el tipo Boolean, la cual, por defecto, tendrá un valor False, mientras que al definir la variable con Nullable(Of Boolean) tenemos la opción de aceptar un valor indefinido (nulo). Pero aquí no acaba todo, ya que podemos usar las propiedades y métodos de esta estructura para averiguar si tiene un valor válido e incluso para asignar un valor por defecto en el caso de que aún no tenga un valor válido. Para saber si una variable de tipo Nullable contiene un valor, podemos usar la propiedad HasValue, esta devolverá verdadero si contiene un valor válido para el tipo de datos con el que la hemos definido o un falso si no lo tiene. También podemos usar el método GetValueOrDefault para obtener el valor contenido en la variable (si no es nulo) o el que indiquemos. Y debido a que todos los tipos por valor siempre tienen un valor predeterminado, al usar este método tenemos dos sobrecargas, una en la que no se indica ningún argumento, en cuyo caso devolverá el valor predeterminado y la otra en la que indicamos el valor que se utilizará en el caso de que no esté definido el valor. Si en lugar de asignar un valor (en este caso el 15), queremos que devuelva el valor predeterminado para el tipo entero (que es el 0), la asignación anterior la tendremos que hacer así: Dim i As Integer = nInt.GetValueOrDefault() Debido a que la variable nInt en el fondo es un tipo entero, podremos usarla en las mismas situaciones que el resto de variables Integer, incluso podemos asignarle valores resultantes de una expresión que de cómo resultado un valor entero. Pero debido a que en realidad no es una variable Integer sino del tipo Nullable(Of Integer), también podemos asignarle un valor Nothing con lo que conseguiríamos ponerla en un estado “anulable”. Conclusiones Realmente son muchas las novedades que incorpora Visual Basic 2005, pero lamentablemente es imposible explicarlas todas en el espacio dedicado a un artículo. Afortunadamente en otros artículos de este monográfico sobre la nueva versión de Visual Studio se han tratado otros temas que de alguna forma también son válidos para Visual Basic, como son los distintos niveles de accesibilidad para los bloques Get y Set de las propiedades o las clases parciales que se ha tratado en el artículo de las novedades de C#, o las novedades Los tipos por valor anulables que utilizaremos en Visual Basic será el tipo generic Nullable(Of T), es decir, siempre indicaremos el tipo por valor que queremos que contenga Por ejemplo, si declaramos una variable de tipo anulable que sea de tipo entero, y en el caso de que el valor que contiene sea nulo podríamos indicar en el método GetValueIrDefault que devuelva el valor 15, y si tiene un valor válido, que devuelva dicho valor. Esto lo podemos hacer con el siguiente código: Dim nInt As Nullable(Of Integer) ... Dim i As Integer= nInt.GetValueOrDefault(15) en el acceso a datos, que podemos ver en el artículo de Jorge Serrano, en el que nos cuenta las novedades de las aplicaciones Maestro-Detalle, donde podemos “saborear” algunas de esas novedades y de los nuevos asistentes del entorno integrado. Otro de los temas que tampoco hemos tratado es sobre un “objeto” especial y exclusivo para los desarrolladores de Visual Basic: My, el cual fue tratado en el número 8 de esta revista. En el código de este artículo se incluyen ejemplos de algunas de las novedades que no hemos tenido oportunidad de tratar. <<dotNetManía [ NOTA 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, ciertas 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 voz alta a quien no le gusta estas formas de autogeneración de código, ya que yo soy de esos cabezotas a los que le gusta casi de forma enfermiza, controlar el código que escribe para dotarlo de la calidad y control que quiero que tenga mi código, por eso, pienso que no me hace ninguna gracia que un entorno por muy bueno que sea, como efectivamente lo es Visual Studio 2005, me autogenere cierta parte de código… como que no me da confianza, para qué engañarnos. Pero muchas veces, nos podemos sorprender, y eso es lo que me ha pasado a mí con el asistente para la generación de aplicaciones de tipo maestro-detalle en Visual Basic 2005 Express Edition, motivo por el cuál me he decidido a escribir este artículo. ¿Maestro qué? Jorge Serrano es redactor de dotNetManía. Es Ingeniero Informático y MVP de VB y de .NET. Es Webmaster de PortalVB.com y autor de diferentes libros y artículos técnicos. Jorge está entre los mejores profesores y conferenciantes sobre la tecnología .NET de nuestro país. Casi todos saben lo que digo cuando hablo de una aplicación maestro-detalle. Si hemos programado en versiones anteriores de Visual Basic, ya sea para la plataforma .NET o no, sabremos que hacer este tipo de aplicaciones nos consume una gran parte de tiempo, recursos, y lo que es más importante, dinero. Las aplicaciones maestro-detalle buscan relacionar unos datos maestros con un conjunto de datos detalle. Algo obvio ¿verdad? Imaginemos por ejemplo, una tabla de familias de productos y su correspondiente tabla de productos. Indudablemente, una familia de productos determinada, tendrá 1 ó más productos de detalle, y un produc- to pertenecerá sólo a 1 familia de productos. Extendamos pues esto, a una aplicación genérica y tendremos la mecánica normal de una aplicación de tipo maestro-detalle. Visual Studio 2005 y en su caso Visual Basic 2005 Express Edition, nos facilita las herramientas a través de las cuales podemos generar rápidamente una aplicación completa de gestión maestro-detalle. Preparando la base de datos Supongamos que tenemos nuestra base de datos ya preparada. Para no dar muchas vueltas y a modo de ejemplo, crearemos dos tablas denominadas tbl_FAMILIAS y tbl_PRODUCTOS . La estructura de estas tablas son las que se muestran en la figura 1 y figura 2. Figura 1. Estructura de la tabla tbl_FAMILIAS. Figura 2. Estructura de la tabla tbl_PRODUCTOS. << dnm.lenguajes.vb Estas dos tablas, estarán relacionadas como por ejemplo, como se muestra en la figura 3. Seleccionaremos el origen de los datos, que para nosotros será “Base de datos”, y pulsaremos a continuación el botón “Siguiente” dentro del asistente. 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. Primer paso, configuración de la fuente de datos La primera tarea que deberemos realizar en el entorno de desarrollo, es la de configurar la fuente de datos. Para ello, he iniciado una nueva aplicación Windows con Visual Basic 2005 Express Edition, y he seleccionado la opción “Datos > Mostrar orígenes de datos”. De esta manera, iniciaremos la ventana de orígenes de datos del entorno, que será el lugar dentro del cuál configuraremos la fuente de datos con la que vamos a trabajar para crear nuestra aplicación maestro-detalle. Dentro de esta ventana, haremos clic con el ratón sobre la opción “Agregar” nuevo origen de datos. De esta forma, se abrirá el asistente de configuración del origen de datos como se muestra en la figura 4. Figura 5. Opción de conexión de datos. Aquí, podremos seleccionar el botón “Nueva conexión…” para establecer una nueva conexión en el caso de no tenerla creada. En mi caso, tengo creada ya una conexión, por lo que la utilizaré y pulsaré el botón “Siguiente” y pondré un nombre a esa conexión de la aplicación con la base de datos como se indica en la figura 6. Nuestra tarea ahora, será la de preparar las tablas del origen de datos con el objetivo principal, de que éstas se comporten como datos de tipo maestro-detalle. Segundo paso, preparación del origen de datos Figura 6. Conexión establecida con la base de datos. Figura 4.Asistente para la configuración de orígenes de datos. Figura 8. Origen de datos añadido al entorno. En esta ventana, pulsaremos nuevamente el botón “Siguiente”. De esta manera, accederemos a la ventana que contiene los objetos de la base de datos, y dentro de la cuál desplegaremos las tablas y seleccionaremos las tablas que hemos creado anteriormente, tal y como se indica en la figura 7. Hasta ahora, hemos añadido como origen de datos, una nueva conexión con la tabla o tablas que queremos que formen parte de nuestra aplicación maestro-detalle, pero todavía no hemos indicado que tabla actuará como tabla maestra y que tabla actuará como detalle. Eso es justamente lo que haremos a continuación. La tabla maestra para nosotros, será la tabla tbl_FAMILIAS , mientras que la tabla detalle será la tabla tbl_PRODUCTOS. Inicialmente nos centraremos en la tabla tbl_FAMILIAS, para ello y acudiendo a la ventana “Orígenes de datos”, desplegaremos los campos de esta tabla como se muestra en la figura 9. <<dotNetManía Lo único que tenemos que hacer ahora, es añadir algunas filas de datos a nuestras tablas, y así, estaremos ya listos de preparar nuestra aplicación maestro-detalle con Visual Basic 2005 Express Edition. En esta ventana, pulsaremos el botón “Finalizar”. Nuestra nueva conexión, aparecerá ahora añadida a la ventana “Orígenes de datos” como se muestra en la figura 8. 57 << dnm.lenguajes.vb Figura 9.Tabla tbl_FAMILIAS desplegada en el origen de datos. Observaremos en nuestro caso, no sólo los campos de la tabla tbl_FAMILIAS, sino los campos que de otra tabla, que por algún tipo de relación están enlazados con esta tabla. Haremos clic entonces sobre el campo FAMILIA_ID primero y sobre el campo DESCRIPCION después, para abrir la lista desplegable y seleccionar la opción Label como se indica en la figura 10. Representa los datos volcados dentro de un control DataGrid. Representa los datos volcados dentro de un control estándar como por ejemplo un control TextBox y que reflejaría los datos detalle de la información. No representa ningún control como tipo de objeto de volcado de los datos. Dentro del menú contextual anterior, seleccionaremos la opción de volcado de datos dentro de controles estándar o Detalles. De esta manera, tenemos lista nuestra tabla o datos maestros, ahora pasaremos entonces, a preparar los datos de detalle. Para realizar esta acción, modificaremos en primer lugar y si lo deseamos, el tipo de controles que queremos que se utilicen para mostrar los campos de las tablas como se indicaba en la figura 10 y que es el resultado que puede verse en la figura 11. Figura 11. Modificación de los campos para la tabla de detalle. <<dotNetManía Figura 10. Campos de tipo Label. 58 De esta manera, habremos cambiado el tipo de estos campos, de tipo TextBox a tipo Label . Es decir, serán campos que no podremos editar. Al ser la tabla maestra, no nos interesa en principio que se cambien sus valores, por lo que hemos optado para que se muestren como tipo Label. A continuación, haremos clic sobre la tabla tbl_FAMILIAS abriendo nuevamente la lista desplegable que aparece a su costado. Una vez hecho esto, observaremos un menú contextual dentro del cuál, encontraremos las siguientes opciones: A continuación prepararemos esta tabla para que actúe como tabla detalle. Para ello, deberíamos seleccionar esta tabla y seleccionar de la lista desplegable la opción “DataGrid”, que es la opción que se utiliza en el entorno de desarrollo por defecto. Una vez que hemos finalizado esto, deberemos incrustar o insertar los datos de las tablas maestro-detalle en nuestra aplicación, que es lo que veremos a continuación. Windows, la tabla maestra. Para ello, arrastraremos y soltaremos la tabla tbl_FAMILIAS en el formulario Windows como se muestra en la figura 12. Figura 12. Insertando los datos maestros en el formulario. Nuestra tabla maestra quedará entonces insertada en nuestro formulario como se muestra en la figura 13. Figura 13.Tabla maestra insertada en nuestro formulario. Si observamos el entorno de desarrollo, veremos que no sólo se han insertado los campos de la tabla tbl_FAMILIAS, sino que además, se han añadido varios componentes y controles a nuestra aplicación. Lógicamente, podemos personalizar y manipular los controles y componentes insertados en el formulario, pero ahora mismo, lo que nos interesa una vez insertada la tabla maestra, es insertar la tabla detalles. Para ello, arrastraremos y soltaremos ahora, la tabla tbl_PRODUCTOS al formulario de nuestra aplicación. De esta manera, aparecerá en nuestro formulario un control DataGrid que corresponde con los datos de detalle de nuestra aplicación tal y como se muestra en la figura 14. Tercer paso, insertando en nuestra aplicación los datos maestro-detalle Lo primero que haremos será insertar en nuestra aplicación o formulario Figura 14. Control DataGrid insertado en el formulario de la aplicación. << dnm.lenguajes.vb DataSource y dentro de la lista desplega- Si observamos el código generado por el asistente, veremos que se trata de un código bastante limpio Lo que Visual Basic 2005 Express 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 encontraremos en la ventana del explorador de soluciones con el nombre PRUEBAS_maestro_detalle.xsd. De todos los modos, si ejecutamos nuestra aplicación ([F5]), observaremos que los datos maestro-detalle no están aún relacionados entre sí como se muestra en la figura 15. ¿Qué es lo que falta? ble que aparecerá, deberemos seleccionar la opción correspondiente al campo de relación entre la tabla maestra y la tabla detalle, y que en mi caso es el campo FK_tbl_PRODUCTOS_tbl_FAMILIAS como se indica en la figura 16. Figura 16. Seleccionando la relación de las tablas maestrodetalle en el control DataGrid. Una vez asignada la relación, volveremos a ejecutar la aplicación ([F5]) y observaremos que ahora sí, nuestras tablas maestro-detalle están relacionadas entre sí como se indica en la figura 17. Ahora bien, el control de navegación de datos BindingNavigator –uno de los controles nuevos del .NET 2.0– contiene diferentes opciones que nos permitirán añadir, modificar y actualizar, borrar y guardar datos. El control DataGrid también nos facilitará estas tareas. Aunque nuestra tarea podría haber concluido aquí, podemos personalizar nuestra aplicación hasta el nivel que deseemos. Por eso, nuestro trabajo puede continuar desde aquí, sabiendo que el asistente nos ha ahorrado una gran cantidad de trabajo. el control de navegación de datos BindingNavigator contiene diferentes opciones que nos permitirán añadir, modificar y actualizar, borrar y guardar datos Figura 15.Aplicación en ejecución mostrando que los datos no están relacionados. Evidentemente, relacionar los datos de ambas tablas. Esto es lo que veremos en el siguiente punto. Cuarto paso, creando la relación de los datos maestrodetalle Esta es quizás la tarea más sencilla de todo el proceso, pero a la vez es la más importante, ya que nos permitirá relacionar los datos maestro-detalle para mostrarlos con cierta lógica. Accederemos a los datos de detalle de la tabla PRODUCTOS haciendo clic sobre el control DataGrid y desplegando la ventana de “Propiedades” ([F4]). Dentro de la ventana de “Propiedades”, deberemos acudir a la propiedad Figura 17. Ejecución final de nuestra aplicación maestro-detalle. Los detalles finales de nuestra aplicación maestro-detalle Ya hemos concluido el trabajo de la preparación y programación de nuestra aplicación maestro-detalle, aunque como hemos podido observar, mucha, mucha programación no ha habido que digamos. Si observamos el código generado por el asistente, veremos que el código insertado no contiene instrucciones o acciones fuera de lugar de lo que sería una aplicación maestro-detalle realizada por nosotros mismos. Se trata de un código bastante limpio. El asistente de generación de aplicaciones maestro-detalle nos aporta una herramienta “amiga” que nos facilita enormemente el tiempo de desarrollo y puesta en marcha inicial de una aplicación tipo maestro-detalle. Aunque el asistente nos proporciona la base de este tipo de aplicaciones, no es menos cierto que a partir de aquí, comienza nuestra tarea real en el desarrollo, pues es muy común que queramos personalizar el comportamiento de nuestra aplicación para realizar diferentes acciones. Lo que está claro es que hay dos factores a tener en cuenta a la hora de usar este asistente. El primero es que nos ahorra tiempo, recursos y dinero. El segundo por si no fuera ya importante el primero, es que el código generado por este asistente es limpio, y los retoques que habría que hacer no son pesados pues el código creado por el asistente a mi modo de ver, es un código muy ordenado, lo cuál se relaciona nuevamente con el primer factor de tiempo, recursos y dinero. <<dotNetManía Conclusiones 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 programador. 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 abordar sólo aquellas características que efectivamente despuntan como novedad o mejora relevante, ya que tal es el cúmulo de innovaciones, que posiblemente nos harían falta varios artículos para detallarlas todas. Dado que podemos abordar este tema desde diferentes perspectivas, nos hemos decidido a detallar los nuevos aspectos del IDE de Visual Studio 2005 (VS2005 en adelante) siguiendo aproximadamente el ritmo que nos marcaría el trabajo con un proyecto Visual Basic de tipo Windows, es decir: creación del proyecto, diseño del interfaz visual, escritura del código y depuración. Y ya sin más dilación vamos a entrar en materia, que hay muchas cosas que contar. Creación de proyectos, configuración y ajustes del IDE Luis Miguel Blanco es redactor de dotNetManía. Es consultor en Alhambra-Eidos. Ha escrito varios libros y decenas de artículos sobre la plataforma .NET (lalibreriadigital.com) El modo de creación de un proyecto ha variado ligeramente en VS2005. Ahora, el cuadro de diálogo de “nuevo proyecto” agrupa dentro de cada lenguaje diversas categorías de plantillas de proyecto en función de las aplicaciones que tengamos instaladas en nuestra máquina, pudiendo elegir desde la clásica aplicación Windows, hasta la novedosa Windows Presentation Foundation (más conocida como Avalon). Ver la figura 1. El lector se preguntará a buen seguro dónde han ido a parar las plantillas para proyectos Web. El moti- Figura 1 vo reside en que ahora VS2005 separa totalmente este tipo de proyectos del resto. Si queremos crear una aplicación ASP.NET, tendremos que elegir la opción de menú “File > New > Web Site”, apareciéndonos el diálogo específico para la creación de proyectos Web: “ASP.NET Web Site”, “Web Service”, etc. En este diálogo también seleccionaremos el lenguaje de programación a utilizar, e incluso si queremos que el sitio Web sea creado al modo clásico, usando IIS, o en una ruta de archivos, con lo cual se hará uso de un servidor Web virtual, lo que nos libera de la obligación de tener instalado IIS en la máquina de desarrollo. Una vez creado el proyecto, debemos detenernos en su mejorado acceso y manipulación de propiedades, las cuales se muestran en una completísima ventana que las organiza en una serie de pestañas, desde las que podemos configurar todos los aspectos necesarios: nombre de ensamblado, formulario inicial y de presentación, referencias, recursos, etc. Ver la figura 2. << dnm.plataforma.net Una de las novedades importantes a nivel de configuración del IDE, consiste en la capacidad de poder guardar todos los ajustes establecidos en el entorno de trabajo dentro de un archivo en formato XML con extensión .VSSETTINGS. Empleando el menú “Tools > Import and Export Settings” realizaremos esta operación mediante un sencillo asistente, con lo que podremos llevar nuestra configuración favorita a otra máquina, evitando el tedioso trabajo de tener que volver a configurar todo manualmente. La figura 3 muestra este asistente. Otro de los aspectos incómodos en el trabajo con el IDE, residía en el cambio de posición y acoplamiento de las diferentes ventanas que lo componen, ya que en algunos casos era realmente difícil depositar una ventana en el lugar deseado. A partir de ahora, esta tarea ya no va Figura 3 Diseñadores y ventanas adicionales Cuando vamos a diseñar un formulario, la caja de herramientas es el primer elemento al que solemos recurrir para arrastrar y soltar los controles que compondrán el interfaz de usuario; en esta versión, la ventana “Toolbox” contiene más categorías de controles, per- Figura 5 a revestir problema, puesto que al mover una ventana aparecerán los indicadores de posicionamiento que vemos en la figura 5; simplemente con situar la ventana sobre uno de ellos, quedará colocada en su nuevo emplazamiento. Mejoras en el editor de código Son las más importantes con diferencia, ya que el trabajo que dedicamos a la escritura de código, normalmente representa el porcentaje más alto de nuestro tiempo global de desarrollo. En primer lugar, si abrimos el editor para ver el código de la clase del formulario, notaremos la falta del código generado por el diseñador, el cual se encuentra ahora dentro de una clase parcial, en un archivo aparte con una denominación del estilo NombreFormulario. Designer.VB, lo cual nos proporciona una mayor claridad y limpieza de código. Este archivo se encuentra oculto en el explorador de soluciones, por lo que debemos pulsar 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 posibilidad de incluir comentarios XML, al estilo de C#, que nos permitan documentar adecuadamente el código. Pues bien, nuestro deseo se ha hecho realidad, ya que ahora, al escribir tres comillas simples en la cabecera de una 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 visualizarán en el ToolTip correspondiente, como vemos en la figura 6. Entre las incorporaciones realizadas a la tecnología Intellisense podemos destacar las opciones de auto corrección, que subrayan una palabra clave mal escrita, ofreciéndonos una lista de posibles correcciones. Igualmente será subrayado un identificador que pertenezca a un tipo que se intente utilizar antes de haber sido instanciado. Por otra parte, para que de un rápido vistazo podamos comprobar cuáles son las nue- <<dotNetManía Figura 2 mitiéndonos tener desplegada más de una categoría al mismo tiempo. Por otro lado, a la hora de alinear los controles en la superficie del formulario, contamos con unas estupendas guías visuales, que facilitan en gran medida su organización, y evitarán en muchos casos el uso de las opciones del menú “Format”. También se van a ver reducidos nuestros “viajes” a la ventana de propiedades gracias a los Smart Tags (Etiquetas Inteligentes) que acompañan a muchos de los controles, y que vienen representados por un pequeño icono en forma de flecha, en la parte superior derecha del control. Al pulsar dicha etiqueta, aparecerá un pequeño diálogo con las operaciones más frecuentes que se realizan sobre el control, pudiendo efectuarlas “in situ”. La figura 4 muestra un ejemplo del diseñador de formularios. 61 << dnm.plataforma.net ciones, pero además, contamos con la posibilidad de crear nuestros propios recortes personalizados mediante 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 conteniendo todos los diferentes bloques de código organizados 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 verde y amarillo, avisándonos de las líneas grabadas y las pendientes respectivamente. Veamos unos ejemplos en la figura 7. Figura 8 Figura 7 A través del diagrama de clases, podemos diseñar visualmente el esqueleto de una clase, con la particularidad 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. La figura 9 nos muestra esta ventana del diagrama. Existen ciertas operaciones cuyo código normalmente repetimos hasta la saciedad en todas nuestras sesiones de trabajo. Para ahorrar tiempo en la escritura 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 <<dotNetManía A través del diagrama de clases, podemos diseñar visualmente el esqueleto de una clase, con la particularidad de que el editor de código y el diagrama se encuentran sincronizados 62 El IDE nos proporciona una enorme cantidad de estas piezas de código para resolver multitud de situa- Otro de los mecanismos que nos puede ayudar a agilizar la escritura es Refactoring, que nos permite reestructurar nuestro código de una manera rápida y fácil. Por ejemplo, supongamos que estamos escribiendo un fragmento de código y estimamos que puede ser candidato a convertirse en un método independiente; lo que tenemos que hacer es seleccionar dichas líneas de código, y con un clic derecho sobre las mismas, elegiremos 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 seleccionadas, y Refactoring nos creará el método con dichas líneas, situando una llamada al mismo en el emplazamiento original, como vemos en la figura 10. << dnm.plataforma.net Figura 11 En algunas ocasiones, para realizar pruebas, comenzamos a codificar usando los nombres por defecto que genera el IDE: Form1, Class1, etc., y al terminar, 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 significativos, 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 necesarios a lo largo de todo el código. Novedades del depurador En primer lugar tenemos que anunciar la vuelta al depurador de una de las características clásicas de Visual Basic: Editar y Continuar, ahora también disponible para C#. Sí en efecto, volvemos a contar en el IDE con la posibilidad de modificar el código al mismo tiempo que lo estamos depurando, lo que supone un importante aumento de productividad, evitando en muchas ocasiones tener que cancelar la ejecución, modificar y volver a ejecutar, con el retraso que ello supone en el tiempo global de desarrollo. Respecto a la consulta de información en tiempo de depuración, tenemos como novedad los Data Tips, consistentes en una viñeta flotante que visualiza los valores contenidos en los miembros de una clase propia o de la plataforma .NET. Tan sólo hemos de situar el ratón sobre la variable que alberga el objeto, y el data tip con su contenido será visualizado. Adicionalmente, también tenemos visualizadores en diferentes formatos para estos valores, dependiendo de cuál sea el valor que estamos consultando; si hay un visualizador disponible lo sabremos porque a su lado aparece un icono de lupa. Ver la figura 11. Figura 12 Cerrando el IDE Y esta ha sido la relación de primicias más remarcables con las que desembarca el nuevo y flamante Visual Studio 2005. Como hemos comentado al comienzo de este artículo, hay muchas más, entre las que podríamos mencionar de forma breve, la capacidad de la ventana “Inmediato” para evaluar expresiones en tiempo de diseño; la nueva ventana “Error List”, que muestra los errores producidos, por lo que ya no se usa la ventana “Task List” para este menester; los atributos del depurador, que permiten personalizar el modo en el que el depurador visualiza la información; el nuevo sistema de ayuda, con capacidades mejoradas de búsqueda, almacenamiento para entradas favoritas de la documentación, etc. En definitiva, una nueva versión de un gran entorno de desarrollo de aplicaciones, que potencia nuestra capacidad de trabajo al tiempo que la simplifica. <<dotNetManía Figura 10 Cuando se produce un error en tiempo de ejecución, entra en acción el “Asistente de Excepciones”, 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 detalle del problema, a la documentación de .NET, etc. Ver la figura 12. 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 modelo 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 desarrolladores de complementos (add-ins) que hemos estado “quejándonos” durante los últimos tres años de las complicaciones, a nuestro juicio innecesarias, que tenían los complementos de Visual Studio .NET 2002/2003 y, por fin, en esta nueva versión de Visual Studio la creación de complementos se ha simplificado notablemente y se han introducido interesantes mejoras. Estas complicaciones eran consecuencia de la tecnología COM (ActiveX) que hereda el IDE de Visual Studio actual de sus versiones 5.0 y 6.0 de finales de los 90 (recordemos que Visual Studio 2005 sigue sin ser una aplicación .NET). No sólo eso, sino que los bugs más indeseables del modelo de extensibilidad han sido corregidos. Para los lectores que no lo sepan, el nuevo sitio Web “MSDN Product Feedback Center” (http://lab.msdn.microsoft.com/productfeedback) permite enviar sugerencias y bugs a los equipos de desarrollo de los productos de Microsoft (no a todos todavía), y funciona realmente bien, con respuestas rápidas (al menos durante las fases beta de los productos). Nuevo IDE, nuevos ensamblados Carlos J. Quintero es Microsoft MVP de .NET desde principios del año 2004. Es autor del popular complemento MZTools 3.0 para VB6,VB5 y VBA, y de MZ-Tools 4.0 para Visual Studio .NET 2002/ 2003, ambos disponibles en http://www.mztools.com Lo primero que llama la atención del proyecto generado por el asistente para la creación de complementos (menú “Nuevo proyecto”, nodo “Otros tipos de proyectos”, “Extensibilidad”) es que algunas de las referencias han cambiado de nombre y de versión: • El ensamblado EnvDTE.dll, que contiene la mayor parte del modelo de extensibilidad de Visual Studio ahora tiene la versión 8.0.0.0, aunque contiene idéntica funcionalidad al anterior EnvDTE.dll versión 7.0.3300.0. • El ensamblado EnvDTE80.dll, nuevo en esta versión, contiene toda la funcionalidad nueva que Microsoft ha añadido en Visual Studio 2005. Han preferido hacerlo así, con dos ensamblados, para no correr riesgos de romper la compatibilidad hace atrás modificando el ensamblado EnvDTE.dll. • El ensamblado Office.dll, que contenía la funcionalidad de barras de botones prestada de Microsoft Office, ha sido reemplazado por el nuevo ensamblado Microsoft.VisualStudio.CommandBars.dll. Han hecho esto para tener un ensamblado más pequeño que contenga sólo lo necesario para las barras de botones de Visual Studio, sin elementos innecesarios que contenía la DLL de Microsoft Office. Aparte de estos ensamblados que el asistente añade como referencias, existen otros dos que, dependiendo de la funcionalidad de nuestro complemento, necesitaremos añadir: • El ensamblado VSLangProj80.dll, que contiene la extensibilidad específica de los proyectos de Visual Basic .NET y C# (Visual Studio .NET 2002 proporcionaba el ensamblado VSLangProj.dll, y Visual Studio .NET 2003 proporcionaba VSLangProj2.dll). • El ensamblado VsWebSite.Interop.dll, nuevo en esta versión, proporciona la extensibilidad específica para el nuevo modelo ASP.NET 2.0, que elimina la necesidad de archivos de proyecto para aplicaciones Web y considera como sitio Web todo el contenido de un directorio. << dnm.plataforma.net se pueden seguir usando las formas anteriores de registrar un complemento, pero la nueva forma de registro es mucho más fácil Nuevo registro de complementos Entre los archivos generados por el asistente, hay otro que llamará nuestra atención: el que tiene la extensión .addin. Como explicamos en el número 18 de dotNetManía, los complementos de Visual Studio .NET 2002 o 2003 tenían que ser registrados de dos maneras: • 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 la DLL del complemento como componente ActiveX para que Visual Studio la pudiera encontrar y cargar. • Como complemento de Visual Studio, para que aparezca en el Administrador de Complementos: esto se hacía añadiendo unas entradas en el registro de Windows (HKEY_CURRENT_USER\Software\Microsoft\ VisualStudio\7.1\AddIns para Visual Studio .NET 2003) pero ahora se puede hacer a través de un archivo XML con extensión .addin ubicado en unas carpetas determinadas. Visual Studio 2005 busca archivos con la extensión .addin en las carpetas que aparecen en el diálogo que se muestra pulsado el menú “Herramientas”, “Opciones”, nodo “Seguridad de complementos/macros”. La figura 1 muestra dicho diálogo (tomado de la versión inglesa de Visual Studio 2005). Como podemos observar, hay varias carpetas donde Visual Studio 2005 buscará los archivos con la extensión .addin. Unas carpetas son específicas para el usuario de la sesión de Windows (las que comienzan por %USERPROFILE% o %VSAPPDATA%), por lo que un archivo .addin en dicha carpeta hará que el complemento sólo esté disponible para ese usuario, y otras son para todos los usuarios (por ejemplo, las que comienzan con %ALLUSERSPROFILE% o %VSCOMMONAPPDATA%). Habrá que tener esto en cuenta a la hora de crear el setup para nuestro complemento. <?xml version="1.0" encoding="UTF-16" standalone="no"?> <Extensibility xmlns="http://schemas.microsoft.com/AutomationExtensibility"> <HostApplication> <Name>Microsoft Visual Studio</Name> <Version>8.0</Version> </HostApplication> <Addin> <FriendlyName>MyAddin</FriendlyName> <Description>MyAddin</Description> <Assembly>MyAddin.dll</Assembly> <FullClassName>MyAddin.Connect</FullClassName> <LoadBehavior>0</LoadBehavior> <CommandPreload>0</CommandPreload> <CommandLineSafe>0</CommandLineSafe> </Addin> </Extensibility> Fuente 1 Por supuesto, se pueden seguir usando las formas anteriores de registrar un complemento, pero la nueva forma de registro es mucho más fácil. El archivo con la extensión .addin es un archivo XML cuyo contenido es como el que se muestra en el fuente 1. Como podemos ver, las etiquetas XML dentro de la etiqueta <AddIn> son similares a las entradas que teníamos que añadir al registro de Windows para registrar nuestra DLL como complemento de Visual Studio, excepto la etiqueta <Assembly>, que permite especificar el nombre de la DLL, y la etiqueta <FullClassName>, que permite especificar la clase del complemento que implementa el interfaz IDTExtensibility2, necesario para cargar un complemento. Esta información antes se obtenía registrando el complemento como componente COM. Las etiquetas dentro de la etiqueta <HostApplication> son las que permiten saber cuál es el host para el que está pensado el complemento, que en nuestro caso será Microsoft Visual Studio, versión 2005 (8.0). En realidad hay dos archivos con la extensión .addin: uno reside en la propia carpeta del código fuente, y está ahí para que siempre acompañe al código fuente cuando 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 reside en la carpeta C:\Documents and Settings\<user>\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. Figura 1 Como hemos dicho, toda la nueva funcionalidad de la extensibilidad de Visual Studio 2005 reside en el ensamblado EnvDTE80.dll. Si examinamos este ensamblado con <<dotNetManía Nuevas clases del modelo de objetos 65 << dnm.plataforma.net el Examinador de Objetos, veremos que tiene muchas clases y métodos que terminan en “2”, para diferenciarlos de los del ensamblado anterior EnvDTE.dll. La clase más importante es EnvDTE80.DTE2, y es que ahora el parámetro application del método OnConnection del complemento, del tipo Object, se puede convertir al tipo EnvDTE80.DTE2 que tiene los mismos métodos y propiedades del antiguo EnvDTE.DTE, y otros nuevos que se han añadido en esta versión. Algunos métodos han cambiado de “firma” (signature), en especial los relacionados con botones y barras de botones. Por ejemplo, la propiedad DTE2. CommandBars ya no devuelve un objeto del tipo Microsoft.Office.Core.CommandBars como ocurría antes, ni siquiera del tipo Microsoft.VisualStudio.CommandBars.Com mandBars del nuevo ensamblado para las barras de comandos como cabría esperar, sino que devuelve el tipo Object. Según Microsoft, esto es necesario para algunas optimizaciones internas de Visual Studio. El caso es que deberemos hacer una conversión de tipos que antes no era necesaria. La lista de nuevas clases y métodos es bastante larga, por lo que no la vamos a detallar aquí. Baste mencionar que otra de las novedades más interesante son los nuevos eventos TextDocumentKeyPressEvents. BeforeKeyPress y TextDocumentKeyPressEvents. AfterKeyPress, también muy demandados, ya antes sólo era posible detectar cambios en el código fuente al cambiar de línea, Otra de las novedades más interesante son los nuevos eventos TextDocumentKeyPressEvents.BeforeKeyPress y TextDocumentKeyPressEvents.AfterKeyPress pero ahora podemos hacerlo a nivel de pulsación de tecla. Y por fin parece que el modelo de código (FileCodeModel) es más consistente entre los distintos lenguajes de programación (Visual Basic, C#, Visual J#) y los métodos para añadir código (funciones, parámetros, etc.) ya funcionan en todos los lenguajes, tal vez porque los use el nuevo diseñador de clases de algunas versiones de Visual Studio 2005. Nuevos tipos de botones Como se aprecia inmediatamente al ver Visual Studio 2005 por primera vez, sus botones son ahora “más bonitos”, como los de Microsoft Office 2003, ya que usan bitmaps TrueColor y no los bitmaps de 16 colores de las versiones anteriores. Esto significa que si no queremos que nuestro complemento “desentone”, tendrá que usar unos bitmaps que sean igual de vistosos, usando TrueColor. Aparte de esta mejora estética, en Visual Studio 2005 podemos crear nuevos tipos de botones, mientras que antes estábamos limitados a los botones de pulsar solamente. Por ejemplo, ahora podemos crear controles del tipo ComboBox o TextBox en nuestras barras de botones, o usar botones desplegables como las listas Most Recently Used (MRU). Para ello se emplea el nuevo método EnvDTE80.Commands2.AddNamedCommand2, que proporciona nuevos parámetros para especificar el tipo de control que se creará en las barras de botones a partir del comando. Por otro lado, la nueva clase EnvDTE80.Window2 expone una nueva propiedad CommandBars que da acceso a las barras de botones de las toolwindows de Visual Studio 2005, algo que antes no era posible. El fuente 3 muestra el código fuente de un complemento que añade un botón a la barra de botones del Explorador de Soluciones. Este botón podría realizar alguna función útil dentro de dicha ventana, por ejemplo, contraer los proyectos de la solución (esto se deja como ejercicio 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 Dim Dim Dim objWindow2 As Window2 colCommandBars As CommandBars objCommandBar As CommandBar objCommand As Command = Nothing <<dotNetManía m_objDTE2 = CType(application, DTE2) m_objAddIn = CType(addInInst, AddIn) 66 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 objCommand = m_objDTE2.Commands.Item(m_objAddIn.ProgID & "." & m_NOMBRE_COMANDO) Catch Fuente 2 (Continua...) << dnm.plataforma.net End Try Try ' Si el comando del add-in no está creado, lo crea If objCommand Is Nothing Then objCommand = m_objDTE2.Commands.AddNamedCommand(m_objAddIn, _ m_NOMBRE_COMANDO, "Mi comando", "Mi comando", True, 59) End If ' Obtiene la ventana del Explorador de soluciones objWindow2 = CType(m_objDTE2.Windows.Item(EnvDTE.Constants.vsWindowKindSolutionExplorer), Window2) ' Obtiene su barra de comandos colCommandBars = DirectCast(objWindow2.CommandBars, CommandBars) objCommandBar = colCommandBars.Item("Explorer") m_objCommandBarControl = CType(objCommand.AddControl(objCommandBar), CommandBarControl) Catch ex As Exception System.Windows.Forms.MessageBox.Show(ex.ToString) End Try End Select End Sub Public Sub OnDisconnection(ByVal disconnectMode As ext_DisconnectMode, _ ByRef custom As Array) Implements IDTExtensibility2.OnDisconnection Try If Not (m_objCommandBarControl Is Nothing) Then m_objCommandBarControl.Delete() End If Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub Public Sub QueryStatus(ByVal CmdName As String, _ ByVal NeededText As EnvDTE.vsCommandStatusTextWanted, _ ByRef StatusOption As EnvDTE.vsCommandStatus, _ ByRef CommandText As Object) Implements EnvDTE.IDTCommandTarget.QueryStatus Try If CmdName = m_objAddIn.ProgID & "." & m_NOMBRE_COMANDO Then StatusOption = vsCommandStatus.vsCommandStatusSupported Or vsCommandStatus.vsCommandStatusEnabled End If Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub Public Sub Exec(ByVal CmdName As String, _ ByVal ExecuteOption As EnvDTE.vsCommandExecOption, _ ByRef VariantIn As Object, ByRef VariantOut As Object, _ ByRef handled As Boolean) Implements EnvDTE.IDTCommandTarget.Exec Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub (...continuación ) Fuente 2 <<dotNetManía Try If CmdName = m_objAddIn.ProgID & "." & m_NOMBRE_COMANDO Then MessageBox.Show(CmdName & " ejecutado.") End If 67 << dnm.plataforma.net También se ha eliminado la necesidad de tener que usar Visual C++ para crear la DLL satélite que proporciona los bitmaps para los comandos de nuestro complemento. Aunque sigue siendo necesaria una DLL satélite (parece que no, Microsoft no ha escuchado aún la sugerencia de eliminarla o hacerla opcional), ahora se puede usar una DLL “manejada” (no nativa Win32) creada usando Visual Basic .NET o C# a la que añadiremos nuestros recursos de tipo bitmap. <<dotNetManía No más shim control para toolwindows 68 Aunque habíamos hablado en algún artículo anterior de las toolwindows, esas ventanas que se adhieren a los bordes de Visual Studio (como la Lista de Tareas o el Explorador de Soluciones), no habíamos explicado cómo crear nuestras propias toolwindows para nuestro complemento, y por una buena razón: era tremendamente complicado. La forma de crear toolwindows era usando la función DTE.Windows.CreateToolwindow, que recibe como parámetros la instancia del complemento, el ProgID del control ActiveX que se alojará en la ventana (el contenido de estas ventanas se proporciona mediante un control de usuario), un GUID que identificará la toolwindow, y el caption de la ventana. Haciendo un poco de historia, en Visual Basic 5.0 o 6.0, donde todo era ActiveX, no había problema: nuestro complemento podía tener un control de usuario que era registrado como componente ActiveX, y se pasaba su ProgID a esa función. Pero en Visual Studio .NET 2002 y 2003 surgió el problema: mientras que nuestros complementos eran DLL .NET con controles de usuario que no eran ActiveX, la función CreateToolWindow exigía que se pasara un control ActiveX. La “solución” de Microsoft, un tanto peculiar, fue proporcionar a través de uno de los ejemplos de su sitio Web (ni siquiera era proporcionado por Visual Studio .NET) un control ActiveX llamado shim control que era el que se le pasaba a dicha función. Dicho control, escrito en C++ con tecnología ATL ininteligible para el desarrollador típico de Visual Basic, tenía una Otra buena noticia: ahora crear toolwindows es muy fácil, ya no hace falta el shim control ni ActiveX función que había que llamar para alojar nuestro control de usuario .NET. Este shim control ha sido causa de innumerables quebraderos de cabeza para los desarrolladores de complementos, ya que Microsoft liberó 3 versiones del mismo, algunas no oficiales, que corregían problemas con los aceleradores de teclado (la tecla [&] en una etiqueta para acceder a un control) y requería que cada desarrollador cambiase los diversos ProgID y CLSID que empleaba este control ActiveX para que no entrase en conflicto con los controles shim de otros complementos. Después de esta complicada explicación, otra buena noticia: ahora crear toolwindows es muy fácil: ya no hace falta el shim control ni ActiveX. Para ello, se emplea la nueva función EnvDTE80.Windows2.CreateToolwindow2. Esta función, como la antigua, recibe como parámetros la instancia del complemento, un GUID identificador, el caption de la ventana, y como nuevos parámetros, el ensamblado y la clase del control de usuario .NET que queremos alojar en la ventana. El fuente 4 muestra cómo crear una toolwindow en nuestro complemento que aloja un control de usuario llamado UserControl1. Con esto finalizamos este artículo sobre las novedades en la extensibilidad de Visual Studio 2005. Como siempre, el Examinador de Objetos nos ayudará a explorar todas sus posibilidades, aunque conviene indicar que la documentación de Microsoft en MSDN sobre este tema [1] ha mejorado mucho y ahora es más detallada que antes, por lo que conviene empezar por ahí. Bibliografía [1] “Automation and Extensibility for Visual Studio”, http://msdn2.microsoft.com/ library/xc52cke4(en-us,vs.80).aspx Public Sub OnConnection(ByVal application As Object, _ ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _ ByRef custom As Array) _ Implements IDTExtensibility2.OnConnection Dim Dim Dim Dim colWindows2 As Windows2 objWindow As Window objUserControl As Object objAssembly As System.Reflection.Assembly _applicationObject = CType(application, DTE2) _addInInstance = CType(addInInst, AddIn) Select Case connectMode Case ext_ConnectMode.ext_cm_AfterStartup, ext_ConnectMode.ext_cm_Startup Try colWindows2 = DirectCast(_applicationObject.Windows, Windows2) objAssembly = System.Reflection.Assembly.GetExecutingAssembly() objWindow = colWindows2.CreateToolWindow2(_addInInstance, _ objAssembly.Location, _ "MiAddin.UserControl1", "Mi ventana", _ "{5FD1A8D8-26B1-4ed2-97D9-9CB8160CD8D3}", objUserControl) objWindow.Visible = True Catch ex As Exception System.Windows.Forms.MessageBox.Show(ex.ToString) End Try End Select End Sub Fuente 4 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. 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, ahora con .NET Compact Framework 2.0, además se amplia. << Novedades .NET Compact Framework 2.0 José Miguel Torres colabora habitualmente con dotNetManía. Es técnico superior en desarrollo de aplicaciones informáticas y trabaja como arquitecto de software en el departamento de tecnologías de la información de MRW .NET Compact Framework (.NET CF a partir de ahora) forma parte de .NET Framework con lo que muchas de las mejoras ofrecidas en .NET Framework también están disponibles para .NET CF. Obviamente, la limitaciones de este modelo de desarrollo hace que ciertas clases o métodos, propiedades o eventos de las mismas no estén disponibles. Pese a ello, tanto la cantidad de nuevas características, como la mejora del rendimiento, son notables. .NET CF ocupa 1,55 Mb (ROM) en Pocket PC 2002 y anteriores y 1,35 Mb (ROM) en Pocket PC 2003 y superiores. Los requisitos de memoria en el terminal son de 0,5 Mb RAM, con un tamaño de aplicación que oscila entre los 5Kb y los 100 Kb, en la mayoría de los casos. Es compatible con dispositivos Pocket PC y Smartphone con Windows Mobile 2003 Second Edition, Windows CE .NET 4.x y 5.0, quedando para próximas versiones la edición Phone Edition. La velocidad del motor de ejecución del CLR es mayor, así como de las librerías más utilizadas como XML o ADO.NET. En la versión anterior –y quien haya desarrollado sobre la misma lo sabe– muchas de las ventajas de .NET Framework no estaban disponibles y eran muy frecuentes las llamadas mediante Platform Invoke (P/Invoke) directamente a las API del sistema operativo. La interoperabilidad COM o COM Interop, que tan grandes ventajas hemos obtenido desde .NET Framework, ya sea dentro de un marco de migración o de un contexto de interoperabilidad, desde .NET CF 1.x no estaba disponible. Esto hacía que dichos componentes COM que por un lado o bien teníamos desarrollados de versiones anteriores o bien utilizábamos de componentes de otro tipo (por ejemplo, el acceso a Pocket Outlook Object Model), nos veíamos obligados a crear una librería de “llamada puente” o wrapper como se conoce en inglés, que interactuara con los componentes COM para la llamada desde código administrado. Pues bien, COM Interop es una de las novedades de .NET CF 2.0, aunque no estará tan extendida como en .NET Framework y entre otras mejoras se han extendido los Type Marshaling, con nuevos tipos y tipos “embebidos”. De la misma forma, el simple acceso al registro del sistema o a los puertos COM derivaban en una llamada P/Invoke a la API, ahora, .NET CF 2.0 provee la clase RegistryKey para el acceso al registro, y puede utilizar las clases de .NET Framework para el acceso a los puertos serie. La seriación es también una de las gratas novedades, así como el pleno soporte a las nuevas características de Microsoft SQL Server 2005 Mobile Edition e incluso a la seguridad, transaccionalidad y eficacia de los servicios de mensajería MSQS (Message Queuing). A nivel de seguridad, también remarcar el soporte a la criptografía y a los certificados X509, la relación entre ensamblados a través del atributo Friend Assembly y soporte a la autenticación NTLM e IPv6, la próxima generación de protocolos para Internet. Para las aplicaciones desarrolladas con .NET CF 1.x, podremos ejecutarlas en dispositivos con .NET CF 2.0 configurándolo de manera explícita, sin necesidad de modificar código. Para migrar las aplicaciones de .NET CF 1.x a .NET CF 2.0, Visual Studio 2005 ofrece una Upgrader, que permite migrar automáticamente mediante un asistente. << dnm.laboratorio.net Visual Studio 2005 Figura 1. Plataformas y tipos de aplicación disponibles. Al crear un nuevo proyecto, lo que más llama la atención es que los formularios sobre los que se diseña son, en cuanto a apariencia y funcionalidad, como los que se ejecutan en tiempo de ejecución, así, en un proyecto Smartphone, podemos saber exactamente la apariencia y posición, de un ComboBox (figura 2), en tiempo de diseño. Esto es lo que con el término inglés conocemos como what you see is what you get. Además esta funcionalidad tiene un motivo extra, y es que con la aparición de Windows Mobile 5.0, la resolución de Figura 2. Las posibilidades en tiempo de diseño de Visual Studio 2005 son extraordinarias. las PDAs pueden variar, así, podemos encontrarnos con terminales con resoluciones de 240x320 hasta 480x640 pasando por 480x480. De esta manera, la importancia del alineamiento de los controles para la flexibilidad de aplicaciones que puedan ser utilizadas bajo distintas resoluciones se soluciona con el soporte conocido en .NET Framework como anchoring y docking. El funcionamiento de estas dos propiedades es exactamente igual que en .NET Framework. Una de las curiosidades que más me ha llamado la atención, es que en arrastrar un control originario de la plataforma PocketPC a una proyecto bajo plataforma Smartphone, Visual Studio 2005, automáticamente, ofrece controles apropiados para Smartphone que lo sustituyan (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, agregarlo a la barra de herramientas y hacer uso de él dentro cualquier proyecto compatible. En versiones anteriores, la creación de un control personalizado era posible aunque no era visual. Otras novedades a remarcar son las que podemos 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 documentación del proyecto “al día” con los diagramas UML iniciales. Novedades en Windows Forms Entre las novedades, destacar que se ha mejorado significativamente el soporte gráfico de los formularios en cuanto a la seriación de bitmaps (como objeto), es decir la posibilidad de grabarlos en ficheros, soporte para iconos de alta resolución o soporte de degradado de color para fondo del formulario. Se ha añadido la capacidad de que Figura 3. .NET CF, ofrece la posibilidad de creación de controles de usuarios.disponibles. <<dotNetManía Visual Studio 2005 es también la evolución de eMbedded Visual C++ 4.0 (eVC++). De esta forma, dentro del entorno de desarrollo de Visual Studio 2005 podremos trabajar tanto con nuestros antiguos proyectos de Visual Studio .NET 2003 como los desarrollados en eVC++ 4.0; además podremos tenerlos en una misma solución. La principal característica es que el desarrollo de dispositivos 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, nuevas características orientadas sobre todo a la productividad. En resumen, aporta lo mejor de Visual Studio .NET 2003 y eVC++ 4.0, todo en un mismo producto. Con Visual Studio 2005 podemos desarrollar para tres tipos de plataformas: SmartPhone, Pocket PC, Windows CE, inicialmente puesto que con la instalación del SDK de PocketPC 5.0 y Smartphone 5.0 se añaden Pocket PC Magneto y Smartphone Magneto respectivamente. En cada una de las plataformas podemos seleccionar el tipo de aplicación que deseemos, ya sea de Windows Forms, de librería de clases, aplicación de consola (o aplicación no gráfica). Sí, han leído bien, en esta versión existe soporte integrado para Smartphone, sin necesidad de instalar ningún tipo de SDK. Además, podemos cambiar el tipo de aplicación ya creada de Consola, por ejemplo, a Windows Forms, al menos, con mayor facilidad que antes. 71 << dnm.laboratorio.net Clase Descripción hasta cuatro. Los nuevos emulaMuestra y gestiona documentos o archivos. DocumentList dores podrán comparClase específica de Pocket PC, para la utilización de botones de hardtir carpetas. Hasta ahoHardwareButton ware de dichos dispositivos. ra el intercambio de Permite el acceso a todos los tipos de acceso disponibles del dispoficheros se realizaba InputMethodCollection sitivos (InputPanel, Keyboard…) desde el ordenador Clase específica de SmartPhone,para tipo de acceso AlphaABC,T9,etc. InputMode escritorio compartienProporciona efectos de texto. LogFont do una carpeta y desde Permite manejar el evento Hibernar. Mobile Device el emulador obteníaA partir de Windows Mobile 2003 SE, esta clase permitirá la orienmos los ficheros; en ScreenOrientation tación de la pantalla en grados (90-180-270). esta versión, la comTabla 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 principal cuando éste se cierre. Soporte la introducción de Windows Mobile 5.0, para DirectX y Direct3D (aunque sólo la resolución de los dispositivos podrá estará disponible para versiones posteriocambiar y, por tanto, los emuladores res de Windows Mobile). Se han añadiharán lo mismo; podremos configurar do características específicas para las platanto la resolución como la orientación taformas Pocket PC y Smartphone, en de la pantalla. cuanto a controles se refiere (ver tabla 1 Visual Studio 2005 y Windows y figura 3). Mobile 5.0 SDK suministrarán 15 emuladores distintos, por lo que además se incorporará una nueva herramienta de administración de emuladores conocida como Device Emulator Manager (DEM). Además DEM es una pieza fundamental para la comunicación entre ActiveSync y los emuladores ya que en ella recaeFigura 4. La creación de nuevos controles se ha orientado a las rá la responsabilidad de necesidades reales y específicas de cada plataforma. conexión y desconexión entre ambos. Debido al la multi-resolución que ofrecerá Windows Mobile 5.0, y además de las Visual Studio 2005 + Windows propiedades anchoring y docking, comentaMobile 2005 + SQL Mobile das anteriormente, los formularios serán 2005 = Un nuevo escenario Auto-Scrollables. Además tendremos acceso al portapapeles del sistema y a eventos del teclado de los dispositivos. .NET Compact Framework sigue creciendo y ampliándose. Cada vez son más los controles y clases que resuelven Emuladores o facilitan las tareas de su versión anteVisual Studio2005, ofrece una mayor rior, y eso es de agradecer. Pero el auténcantidad de emuladores con unas caractico potencial de .NET CF 2.0 está ligaterísticas mejoradas y nuevas. Los emulado tanto a SQL Mobile 2005 como a dores ofrecerán soporte para ActiveSync, Windows Mobile 2005. .NET CF 2.0, con lo que será posible conectarlos al escribajo sistemas operativos Windows torio y sincronizándolos como si de un Mobile 2005, además de todo lo mendispositivo físico se tratara, la cual cosa cionado (incluyendo el soporte para facilitará las aplicaciones RAPI. Asimismo DirectX y Direct3D), contendrá librela cantidad de puertos COM aumentará rías para el acceso a Pocket Outlook <<dotNetManía Notification 72 Muestra y responde a notificaciones de usuario. Figura 5. Device Emulator Manager facilitará la configuración de los emuladores. Object Model bajo código administrado, pudiendo acceder a contactos, correo electrónicos, mensajes SMS, sin necesidad de COM Interop. Contendrá librerías también administradas para telefonía, pudiendo tener el control de llamadas y tiempos, por ejemplo. Un administrador de dispositivo (Device Management) que promete hacer aparcar el código nativo para el acceso a configuraciones del sistema sin tener que echar mano de las API, mediante el objeto de configuración del sistema (Configuration System Object). Figura 6. Nuevos Componentes administrados con Windows Mobile 5.0. Como ven se nos presenta un gran abanico de posibilidades, en cuanto al nuevo motor de acceso a datos, como de nuevas características del nuevo sistema operativo, que hace que .NET CF 2.0 no sea más que un importante marco de desarrollo hacía una nueva era orientada a la programación administrada en el desarrollo de dispositivos móviles en plataforma Microsoft. Más información: http://www.desarrollomobile.net/dotNetMania/dotNETC F2005 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 interacción perfecta entre comunidad de desarrolladores y Microsoft que nunca antes se había visto. << Muchas mejoras propuestas, implementadas; muchas correcciones propuestas y realizadas; y muchas novedades deseadas, e implementadas para dar soporte al futuro de los productos de Microsoft desarrollados sobre esta plataforma. El resultado, un Framework más estable –si cabe–, robusto –que ya lo era mucho– y potente –más clases que nunca– que el anterior. Sincronizando la salida del Framework 2.0 con uno de los servidores .NET más esperado –Yukon o SQL Server 2005– vienen de serie con las BCL del sistema: las nuevas clases de acceso a datos, ya conocidas como ADO.NET 2.0. Ampliando lo que comentaba en el párrafo anterior, ADO.NET 2.0 incluye numerosas mejoras de las clases que ya conocemos del Framework 1.1; pero que también nos regala numerosas novedades que harán las delicias de los más fanáticos. Eso unido a cambios “estructurales” que no nos habían cuajado de la versión anterior, cierran un círculo que perfecciona aún más esta tecnología de acceso a datos de Microsoft. Se amplían aún más las máximas de Sencillez, productividad e integración. Con esto se quiere decir que las mejoras no se reducen a clases nuevas, sino a ampliaciones de las existentes. Y se reduce aún más el código Pepe Hevia colabora habitualmente con dotNetManía. Es arquitecto de software senior en AlhambraEidos.Tiene las certificaciones de MCAD, MCSD.NET y MCT en .NET Framework. Ha escrito varios libros sobre la plataforma .NET (lalibreriadigital.com) [ NOTA ADO.NET 2.0 lejos de mantener el status quo,ha mejorado sus herramientas a la par que ofrece multitud de novedades que simplificarán el desarrollo de los sistemas de n-capas.Y, como no, proporciona unas clases que aprovechan al máximo la potencia del nuevo SQL Server 2005 ] del desarrollador, empaquetando aún más funcionalidad en los métodos y propiedades ya conocidos. Pero siempre desde la perspectiva de no cambiar lo que ya funciona. Es por esto que las migraciones a ADO.NET 2.0 muchas veces pasarán por el mero hecho de recompilar con los nuevos compiladores y las nuevas versiones. Pero a los que quieran aprovechar el nuevo Framework, eso sí, avisarles de que hay muchas e interesantes herramientas. Veámoslas poco a poco… Proveedores .NET y conexiones a datos Esto ya os suena a todos. Pero recordemos que en el Framework 1.1 existían unos pequeños flecos. Flecos que seguro a más de uno no os han afectado, pero a los que nos dedicamos a las arquitecturas de software nos han supuesto en algunos casos –y aunque existían otras alternativas– auténticos dolores de cabeza. Cosas como información de metadatos del sistema, afinidad de las transacciones, carga dinámica de proveedores, abstracción de conexiones… y pocas cosas más, que se han resuelto con éxito en esta nueva versión. Proveedores .NET: Interfaces, abstracción y factorías de clases En primer lugar a los proveedores .NET. Recordad que son el conjunto de “drivers” que nos comunican con los sistemas gestores de datos de un determinado fabricante. De esta forma, SQL Server cuenta con un proveedor nativo .NET encapsulado en el espacio de nombres System.Data.SqlClient; los conectores de compatibilidad con OleDb están en System.Data.OleDb; en uno de los número anteriores de dotNetManía se hablaba de los recien- << dnm.ado.net En esta nueva versión,las factorías de clases permitirán el desarrollo de aplicaciones independientes del proveedor .NET ] 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 queremos trabajar. Nuestro código dependerá de con qué espacio de nombres trabajemos. Esto bien argumentado no debería ser ningún problema. Pero qué ocurre si queremos que nuestro código de negocio sea –hasta cierto punto– independiente del sistema gestor. Alternativas: XML, encapsular objetos en familias de clases más abstractas, usar interfaces o crear clases proxy… pero es un follón de análisis y de código que ya no nos hace tan productivos en determinadas situaciones. La solución a esto: los interfaces de ADO.NET y las factorías de clases. Los interfaces de ADO.NET son aquellas especificaciones que los ingenieros de Microsoft establecen en el espacio de nombres System.Data –y muchas de las novedades en System.Data.Common– para que los fabricantes de sistemas gestores puedan implementar sus proveedores. De esta forma, cualquiera que sepa cómo funcionan estos interfaces podrá manejar cualquier proveedor .NET. Asimismo, todo un conjunto de clases implementadas de serie en la BCL podrían usar código de terceros gracias a estos interfaces. De hecho, estos interfaces son IDbConnection, IDbTransaction, IDbCommand, IDbParameter, e IDbDataReader así como la clase adaptadora IDbDataAdapter. ¿Os suenan no? El problema es que, en muchos casos, estos interfaces son extendidos por fabricantes que ofrecen más funcionalidad que la establecida. El problema es que el fabricante entonces puede crear nuevos métodos o propiedades 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 se han ampliado los interfaces para hacerlos más ricos y abarcar más casos del estándar ANSI SQL. Esto claro, sin perder la compatibilidad hacia atrás, ya que los nuevos requisitos quedan recogidos en las clases abstractas DbConnection, DbCommand… etc. Posibilitando que la sobrecarga de interfaces ofrezcan más funcionalidad que antes. Y así, esta pequeña laguna se resuelve. Pero, ¿y qué pasa con la independencia del SGBDR?... Para solucionar esta otra laguna, existen las factorías de clases. El problema que siempre nos hemos Public IDbConnection DameConexion(string fabricante,mCadConexion) { IDbConnection conexion; if (fabricante.equals("SqlServer")) conexion=new SqlConnection(mCadConexion); else if(fabricante.equals("Oracle")) conexion=new OracleConnection(mCadConexion); return conexion; } Public IdbConnection DameComando(string fabricante,IdbConnexion conex, string comandoSQL) { IDbCommand comando; if (fabricante.equals("SqlServer")) comando=new SqlCommand(comandoSQL,conex); else if(fabricante.equals("Oracle")) comando=new OracleCommand(comandoSQL,conex); return comando; } //ejemplo de uso de este tipo de codigo... DbConnection conex=DameConexion("SqlServer"); DbCommand comando=DameComando("SqlServer",conex, "select * from tabla"); DbDataReader datos=Commando.ExecuteQuery(); ... Fuente 1. Lo que hemos tenido que hacer con ADO.NET 1.1 –a grandes rasgos, claro– Toda la funcionalidad de la carga de los proveedores y la complejidad de su inicialización queda encapsulada en un método público y estático, de forma que la podamos usar sin instanciar ninguna clase. De esta forma, empleando un interfaz de tipo DbConnection y una llamada al método “cargador” nos daría todo el problema resuelto. Esta forma de trabajar es a lo que se denomina factorías de clases. Son clases especiales que tienen constructores públicos y estáticos cuya misión es la encapsular la creación de otras clases. Esto quiere decir que empleando la clase DbProviderFactory y el cargador <<dotNetManía [ NOTA encontrado en el uso de proveedores .NET es el de la carga dinámica de proveedores. ¿Por qué? Porque las clases ADO se almacenan en el GAC y esto impide que podamos trabajar de forma directa con el cargador de clases de .NET. En segundo lugar, las propias cadenas de conexión están ligadas a sus proveedores, 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. 75 << dnm.ado.net DbProvidersFactory podremos des- CreateConnection preocuparnos de todo esto y reducir al máximo las líneas de código. La cosa está en que los nuevos proveedores ADO.NET deberán registrarse en una pequeña base de datos de drivers en ejecución y dejar que las factorías hagan el trabajo por nosotros. El enlace: la cadena de conexión. Ese sencillo string que usábamos en VB6 y que gracias al comando “provider=” nos daba todo hecho. En en este caso, el código que hemos visto antes (fuente 1) quedaría resumido en dos partes: una que afecta al fichero XML de configuración del ensamblado principal y una segunda con el código operativo... CreateCommand CreateCommandBuilder CreateConnectionStringBuilder CreateDataSourceEnumerator CreateParameter CreatePermission Tabla 1. Nuevos métodos de los interfaces para abstraernos de la creación de objetos de datos. // Recogemos la cadena de connexion de un fichero de configuración string provstring = ConfigurationSettings.AppSettings.Get("DbProvider"); string cadConexion= ConfigurationSettings.AppSettings.Get("ConnectionString"); //La factoría de clases nos devuelve el proveedor DbProviderFactory prov = DbProviderFactories.GetFactory(provstring); //Y ya tenemos nuestra connexion disponible. IDbConnection conexion= fact.CreateConnection(); conexión.ConnectionString=cadConexion; ... Fuente 2. Las factorías de clases permiten la carga dinámica de proveedores .NET a partir de la cadena de conexión. <<dotNetManía Enumeración de servidores CreateDataAdapter <appSettings> <add key="DbProvider" value="System.Data.SqlClient"/> <add key="ConnectionString" value="Server=localhost;Database=Northwind; Integrated Security=true;"/> </appSettings> </configuration> 76 Fuente 3. Metadatos en una línea de código CreateConnection <?xml version="1.0" encoding="utf-8" ?> <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> Puesto que el resto de los interfaces han visto ampliada su funcionalidad, ya no tendremos que preocuparnos de crear las clases XxxCommand y sucesivas… ya que las mismas clases factoría ya nos proporcionarán sus propios mecanismos de creación de objetos de datos. Así de simple y así de abstracto. Siento el trabajo que muchos de nosotros hemos realizado para esto antaño, pero así son las cosas. ¡Mejor! DataTable t = conexion.GetSchema("Tables"); t.WriteXml("tables.xml"); ¡Ah!, y esperad, que aún no acaba lo bueno relativo a conexiones. Gracias a las implementaciones de los últimos estándares ANSI SQL, las clases de conexión nos ofrecerán, en perfecto formato XML, los metadatos obtenidos de las consultas a las vistas de esquema de los servidores de datos, conocidas como INFORMATION_SCHEMA. Imaginad la comodidad y potencia que esto nos ofrece. Esta es una nueva utilidad que nos permitirá poder explotar la detección de servidores a lo largo y ancho de una red. Debido a su utilidad puede que no todos los proveedores la soporten (por ejemplo, Oracle que solo cuenta con una base de datos). En el caso de clientes SQL Server, esta utilidad nos dotará de la posibilidad de poder recoger en un objeto DataTable todos los servidores SQL Server registrados en una red. Sus utilidades, están claras. Esta utilidad se encuentra en la clase DbEnumerator. Y será bueno que le preguntéis a la factoría si el proveedor que cargáis la soporta o no… Funcionalidades que existen y avisados quedáis. Constructor de cadenas de conexión De siempre ha existido una utilidad en OLEDB que permitía a los entornos de desarrollo abrir un cuadro de diálogo que permitía al usuario seleccionar los servidores y sus atributos para abrir una conexión –os recomiendo un artículo que escribí del tema y que tenéis en mi Web http://www.heviatec.net en la sección de artículos–. Este diálogo se puede abrir empleando interop utilizando las clases de servicio de OLEDB. Pero para .NET no contamos con nada parecido, exceptuando una nueva utilidad de ADO: DbConnectionStringBuilder. Mediante esta interfaz podremos crear cadenas de conexión personalizadas por el usuario empleando propiedades y métodos, sin tener que preocuparnos por la sintaxis específica de cada proveedor. Esto quiere decir que cada .NET Provider, heredando de esta clase, podrá proporcionar mecanismos encapsulados de generación de cadenas de conexión, reduciendo así los errores derivados de la mala gestión de este “pequeño” detalle. No llega a ofrecer un cuadro de diálogo, pero sÍ un potente mecanismo de creación de cadenas de conexión al igual que CommandBuilder << dnm.ado.net genera sentencias SQL DML a partir de una instrucción SELECT. Otra utilidad es la de parsear una cadena de conexión, y permitir al desarrollador tratar cada elemento de forma individual. Lo dicho, una utilidad que a más de uno le vendrá bien. [ NOTA Las utilidades de los proveedores .NET se han ampliado para acoger las mejoras de los estándares ANSI SQL como, por ejemplo, la recuperación de Metadatos. ] Mejoras en el pool de objetos En la versión anterior de ADO.NET, no todos los proveedores soportan el pool de conexiones. Unicamente los proveedores de SQL Server y Oracle admitían esta funcionalidad –entre otros pocos servidores más particulares–. Pero OLEDB y ODBC no eran capaces de soportar estas características tan beneficiosas para la optimización de las conexiones. En esta versión se mantiene la misma línea aumentando la granularidad de la generación de las conexiones; la posibilidad de especificar un tiempo de espera personalizado de espera al iniciar la conexión y una valiosa funcionalidad que nos permitirá cerrar todas las conexiones abiertas de un pool con un solo método del objeto DbConnection: ClearPool por el cual cerramos las conexiones abiertas de un determinado pool o bien ClearPools, la cual nos permite cerrar todas las conexiones del pool de un determinado DomainApp. Sin duda, una solución a problemas específicos que seguro más de uno se ha encontrado (ya que el cierre no siempre es automático, depende de otros factores). ra de trabajar, de forma que podamos trazar y depurar cualquier mínimo problema que se presente con la información adecuada para poder actuar en consecuencia. Todo un esfuerzo por parte de los desarrolladores de esta tecnología. Relativo a comandos y a recuperaciones de datos No sólo los procedimientos de conexión han tenido cambios. Algunas mejoras en el lanzamiento de comandos han sido introducidas en el interfaz IDbCommand, responsable de que un cliente ejecute instrucciones SQL en el servidor. Estas mejoras se pueden ver examinando el nuevo conjunto de métodos que despliega esta clase, que agregan métodos 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 más de una situación nos hemos visto lanzando comandos SQL que conllevan un alto tiempo de ejecución de servidor o bien un tiempo de espera superior a la media debido a la carga de la red. Para evitar que un cliente se quedara “cuajado” en estas delicadas situaciones, nos hemos visto en la necesidad de meter estos tipos de operaciones en hilos de ejecución, de cuyo control hemos sido responsables nosotros –cayendo de nuevo en la falta de productividad y menor tolerancia a fallos–. Ahora, los métodos Execute principales cuentan con sus hermanos BeginExecuteXxx de forma que mediante delegados, ADO.NET nos avisará de cuando ha terminado una determinada ejecución sea del tipo que sea y siendo la causa que sea. Lo cual, sí permitirá entornos de alto rendimiento con el mínimo esfuerzo. Eso sí, no podemos abusar de estas cosas, puesto que el esfuerzo a nivel de sistema no es gratis en entornos no preparados para este tipo de situaciones (véase Windows Me, 98…etc, si es que aún quedan en algún rescoldo de la humanidad). Pero no podemos dejar de lado las mejoras de DbDataReader. Aunque luego se comentará, es bueno 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 información asociada. Esto nos será extremadamente útil a la hora de poder investigar problemas relativos a problemas en las conexiones, problemas en la ejecución de consultas… dando mucha más información que la que sólo podíamos recuperar con los mensajes OLEDB, que quedaban bastante limitados. Tanto las clases de los proveedores como las utilidades de ADO.NET comunes comparten esta mane- 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 información asociada. <<dotNetManía Trazabilidad 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 datos recuperados del servidor. De hecho, todas las mejoras están recogidas en los nuevos tipos de datos, entre ellos el nuevo tipo XML. Sí, sí… poder recuperar un XML empotrado en una columna empleando una sencilla función GetXxxx(). Y como esto, otros tantos de tipos más… todo un lujo. Las mejoras del cliente de SQL Server 2005 Hasta aquí lo que son mejoras que afectan a todos los .NET providers. Pero hablando de uno en particular, qué menos que comentar la estrella del momento: el .NET Provider de SQL Server 2005. Este nuevo sistema gestor traerá consigo líneas y líneas de artículos por su nuevo look y comportamiento. Es lógico pensar que muchos de los cambios de ADO.NET tienen que pasar por adaptarse a las mejores de este sistema gestor. Centrándonos en System.Data.SqlClient, se nos ofrece nuevo: <<dotNetManía MARS 78 No es que nos vayamos hasta Marte a descubrir nuevas cosas, no. Es el nuevo mecanismo de recuperación de múltiples conjuntos de resultados empleando una sola conexión. En las versiones anteriores el problema que existía –aunque más bien oculto al desarrollador– era el de lanzar comandos simultáneos sobre la misma conexión activa. Puesto que la limitación impuesta es la de tener un cursor por conexión ya sea por llamada a un procedimiento almacenado, ya sea por un comando directo, ya que en los servidores se generan cursores implícitos. Intentar lanzar dos comandos seguidos falla en ADO.NET 1.1 si los realizamos sobre el mismo objeto Connection, llevando a un desarrollador a abrir más objetos Connection de los que tenía previstos. Pero en ADO.NET eso ya está superado y podremos hacer a través de una conexión “lo que nos de la gana” en este sentido. 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. Transacciones No es que hayan cambiado mucho las cosas en este sentido, pero lo que sí se ha hecho es integrar en el cliente las funcionalidades del nuevo espacio de nombres System.Transactions por el cual se pueden obtener transacciones promocionadas. Esto va de hacer posible que se puedan tener varias conexiones a varias instancias de SQL Server y conseguir que se activen de forma “automática” las transacciones distribuidas en el caso de participar del mismo objeto Transaction. Eso es toda una ventaja sobre todo en aplicaciones de servidor o de grandes sistemas de información escalables donde la información puede estar distribuida en múltiples servidores. Protección ante caídas Hablando de sistemas empresariales, es necesario también tener en cuenta la alta disponibilidad de los servidores. Una cosa es que contemos con un cluster de SQL Server y eso ya de por sí nos ofrezca una alta seguridad de forma transparente y otra muy distinta que nos pidan sistemas robustos en el caso de no disponer de estas tecnologías. Para eso SQL Server 2005 cuenta con unas herramientas de control de fallos basadas en tecnologías de mirroring de la base de datos, por los cuales si uno de los espejos falla puede activarse el otro. Pero es en este momento cuando el cliente puede llegar a perder la conexión y necesitar reconectarse, si no con la misma, con otra fuente. Para minimizar el impacto de estas caidas, el cliente SQL Server proporciona de forma transparente el control de estas situaciones, retomando el control al iniciarse subsiguientes operaciones SQL tras la caída. Impresionante. Y todo controlado con un sencillo comando agregado a la cadena de conexión. Soporte de nuevos tipos de datos Como parte de las muchas novedades de SQL Server 2005, están sus nuevos tipos de datos. Tipos que van desde refinamientos de los ya existentes –como los nuevos MAX BLOB , del estilo a VARBINARY(MAX)–, hasta integración de tipos ya conoci- << dnm.ado.net Herramientas de migración y copia masiva de datos.Tareas “bulk copy” Otra de las enormes mejoras que se han incluido en este proveedor, es la capacidad de poder implementar mecanismos de transferencia masiva de datos, de una forma similar a cómo operan los conocidos mecanismos DTS de SQL Server. Las tareas bulk copy permitirán que podamos transferir información –por ejemplo, de un DataSet– desde un origen a un destino, como si de una instrucción SQL se tratase, simplificando, en mucho, este tipo de procesos a como se hacían anteriormente en ADO.NET 1.1. Algo similar a lo que podemos en el código fuente 4: // Cargar un Dataset con datos y procesarlo ... // Copiar los datos a SQL Server string cadConexion = GetCadenaConexion(); SqlBulkCopy bcp = new SqlBulkCopy(cadConexion); bcp.DestinationTableName = "Empleados"; bcp.WriteToServer(dsEmpleados); Fuente 4.Transferencias de datos Entre las posibilidades que nos brinda esta clase tan particular, estará la capacidad de coger datos tanto de un DataSet como de un objeto de tipo Reader –lo cuál nos brindará infinitas posibilidades a la hora de recoger los datos de origen–. La potencia de los eventos de datos Una utilidad fantástica que .NET traía de serie, era la que nos permitía capturar eventos del sistema de archivos para poder actuar en consecuencia. Pues bien, a todos los que trabajamos con objetos desconectados, ¿cuántas veces nos ha hecho falta algo similar? Y ¡qué complejo a podido llegar a ser! Pues bien, gracias a los mecanismos nuevos de SQL Server 2005, ya es posible estar “al loro” de estos tantos para actuar en consecuencia. Para ello se nos proporciona la interesante clase SqlDependency por la cual podremos capturar eventos sobre datos –por ejemplo, un cambio de datos en una fila– empleando para ello los omnipresentes delegados. Imaginaos la utilidad de esta clase en entornos Web a la hora de combinarlo con el objeto Cache o en entornos de clientes desconectados de cualquier tipo de cliente .NET. Las posibilidades son muy interesantes, con el mínimo esfuerzo. Pero cuidado, que os veo, que esto normalmente conllevará a recargar determinadas partes del DataSet… pero no abuséis de ello en entornos de alta transaccionalidad y multitud de filas. Antes que nada, echadle cabeza… SqlCommand comando = new SqlCommand("SELECT au_id, au_lname FROM dbo.authors", conexion); // Registrar el delegado de dependencia SqlDependency depend = new SqlDependency(comando); depend.OnChanged += new OnChangedEventHandler(OnDatosCambiados); conn.Open(); SqlDataReader rdr = cmd.ExecuteReader(); // procesar los datos recuperados ... void OnDatosCambiados(object caller, SqlNotificationEventArgs e) { MessageBox.Show("Los datos origen han cambiado: "+e.Info); } Fuente 5.Capturar eventos sobre los orígenes de datos Otra forma de hacer las cosas, que ya comentaremos con más detalle en otros artículos, lo proporcionan las nuevas colas de SQL Server 2005. A través de “conexiones” a colas de eventos mediante subscripciones SQL y empleando la clase SqlNotificationRequest podremos tanto capturar eventos como reaccionar en consecuencia empleando prototipos de comunicaciones asíncronas. Todo un mundo… Mejoras en las tecnologías desconectadas de los datos No podíamos terminar este artículo sin hablar de otro gran segmento del acceso a los datos. Y es el de las clases desconectadas. Nuestra querida mega-clase, DataSet. En esta clase más que novedades, hay multitud de mejoras. Todas ellas relacionadas con su optimización y flexibilidad. La mejor de esas modificaciones está en el objeto DataTable, que podríamos decir que ahora es un poco más granular que antes. ¿Qué quiero decir?, pues que ahora es capaz de hacerse persistente y poder vivir independientemente de un DataSet. Esto que no parece mucho, aporta muchas ventajas a la hora de tratar tanto los orígenes de datos como la gestión del pro- <<dotNetManía dos como el XML; llegando hasta el avanzado UDT o USer Defined Type que pasa por auténticas clases .NET. Todos estos nuevos tipos están recogidos en el espacio de nombres System.Data.SqlTypes y agrega las nuevas enumeraciones SqlUdt o SqlXml, que junto con el método GetValue( ) eliminan cualquier limitación que se le pudiera achacar a este mecanismo de intercambio de datos (capaz de devolver clases, streams XML…etc). 79 << dnm.ado.net pio DataSet, que podía llegar a manejar volúmenes de información considerables. [ NOTA ] Casi todas las mejoras de los objetos desconectados son transparentes al programador. 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 sensiblemente las comunicaciones en muchos casos aplicados al negocio. Es más, ahora será posible implementar sistemas muy optimizados pudiendo intercambiar, en procesos de Remoting, datos empleando DataSet. ¡Una pasada! Más cositas que a más de uno le puede interesar: a) La posibilidad de trabajar con Datasets de “solo lectura” con la nueva clase DataTableReader. b) La posibilidad de poder crear tablas a partir de vistas. c) La posibilidad de indexar campos de un DataTable que optimizan los procedimientos DML en tablas. d) Búsquedas rápidas de filas, empleando métodos 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 transparentes al desarrollador, y que optimizarán aún más la ejecución del código. <<dotNetManía Visual Studio 2005: Más herramientas que nunca 80 de datos y los mecanismos de filtro y ordenació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 nuevos Reporting Services de SQL Server 2005. Todo un lujo. Para terminar, que no hay casi más hueco… hablar de otra de las estrellas desde la cual poder explotar al máximo el acceso a los datos: Visual Studio 2005. Así como las versiones anteriores ya ofrecían multitud de herramientas muy prácticas para el acceso a los datos, Visual Studio 2005 no se queda atrás y nos ofrece: a) Una nueva paleta ampliada de controles para el acceso a los datos. De ellos, los más interesantes son BindingSource –encapsula un origen Figura 1. La paleta y los nuevos controles en acción. b) Soporte nativo de acceso a SQL Server 2005. Entre los que se incluye la creación de un proyecto SQL, editores para crear objetos de todo tipo y un potente editor de código gestionado a nivel de base de datos. c) Smarttags (etiquetas inteligentes) para la rápida configuración de los controles de datos. Figura 2. SmartTags de datos en acción. En fin, que podríamos hablar de todo ello con mucha más profundidad, pero eso lo dejaremos a futuros artículos… ya que, de nuevo, Microsoft ha conseguido que podamos derramar chorros de tinta con una nueva versión que lejos de haberse quedado estancada, ha ofrecido multitud de mejoras y multitud de añadiduras que harán que el desarrollo de proyectos de datos sea más interesante, sencillo y productivo aún de la que ya era. De nuevo, me quito el sombrero. dnm.arquitectura Visual Studio 2005 Team System La diversidad de metodologías existentes, procedimientos y herramientas actuales dificulta en gran medida la ejecución de proyectos de software. Por otro lado, la multitud de tecnologías y su complejidad agrava más esta situación, y se ve multiplicada tanto en las áreas de sistemas como de desarrollo. << Como consecuencia, las aplicaciones complejas de hoy día requieren equipos multidisciplinares para desarrollar y desplegar estas soluciones. Quizás el mayor reto con el que se encuentran nuestros profesionales es la comunicación entre ellos. Visual Studio Team System facilita esta comunicación y la extiende a todos los miembros del equipo de desarrollo a lo largo del ciclo de vida de las aplicaciones. ¿Qué es Visual Studio Team System? Visual Studio Team System es un conjunto de herramientas que integran orientación de procesos, arquitecturas prescriptivas, y herramientas de ciclo de vida para la consecución de despliegue de soluciones sobre sistemas Windows. Visual Studio Team System incluye herramientas que proporcionan soporte a todo el equipo de desarrollo, estas son: nológicos diseñar soluciones orientadas a servicios que pueden ser validadas contra sus propios entornos operacionales. • Visual Studio Edición para Desarrolladores de Software. Fundamentalmente incorpora herramientas de desarrollo avanzadas que permiten a los equipos aumentar su productividad e introducir un alto nivel de calidad desde el principio y durante todo el ciclo de vida de la aplicación. • Visual Studio Edición para Testeadores de Software. Herramientas avanzadas de pruebas de carga que permiten a los equipos verificar el rendimiento de aplicaciones antes del despliegue. • Visual Studio Team Foundation Server. Herramientas de colaboración de equipos basadas en servidor que permiten a las organizaciones gestionar y seguir el progreso y estado de los proyectos con menos esfuerzo. Figura 1. Visual Studio 2005 Team System. Por Alberto Ruiz • Visual Studio Edición para Arquitectos de Software. Las características más relevantes de esta edición se centran en los diseñadores visuales que permiten a los arquitectos y responsables tec- VSTS 2005 dispone de capacidades para realizar la captura de requisitos de los proyectos y establece mecanismos de trazabilidad sobre estos durante todo el ciclo de vida del proyecto. Adicionalmente es posible realizar la captura de requisitos con herramientas tales como Microsoft Excel o herramientas de terceras compañías como por ejemplo Borland CaliberRM. Cualquier elemento planeado o trazado por el equipo de proyecto es gestionada por la base de datos de work items. Un work ítem es un registro de base de datos que Visual Studio Team Foundation utiliza para trazar las asignaciones y estados de un trabajo determinado. En función de la metodolo- <<dotNetManía Gestión de proyectos 81 << dnm.arquitectura gía aplicada al proyecto pueden variar los tipos de work items. Por ejemplo, en MSF Agile se definen cinco tipos diferentes que son: escenarios, requisitos de calidad de servicio, tareas, bugs y riesgos. VSTS 2005 provee la conversión de datos desde otros sistemas de tracking incluyendo Rational ClearQuest, Bugzilla y PVCS. plantillas metodológicas (MSF v4 Formal y Agil), así como terceros frabricantes generarán plantillas para dicho entorno. La gestión de plantillas se realiza desde el “Process Template Manager”, haciendo posible la importación o exportación manual de metodologías que son implementadas en forma de ficheros XML. Figura 3. Process Template Manager. <<dotNetManía Figura 2. Work Items. 82 Microsoft Project Server y Visual Studio 2005 Team System se complementan en la gestión de tareas y recursos. Mientras Project Server está diseñado para una gestión de alto nivel de recursos a través de múltiples proyectos, VSTS 2005 esta diseñado para gestionar el ciclo de vida de desarrollo completo. A través de procesos de importación, exportación y sincronización de datos se comparte la información de ambos sistemas de un modo sencillo y fiable. Tanto Microsoft Excel como Microsoft Project disponen de un add-in que incorpora Team System y que facilita la sincronización de estos documentos y los work items relacionados del proyecto. Otro aspecto a destacar es que no se requiere el entorno de Visual Studio para gestionar los proyectos; existe una versión independiente con características para gestión de proyectos que constituye el cliente de Visual Studio Team Foundation. Las plantillas metodológicas son una nueva característica de Team System que permite a los equipos configurar y personalizar los procesos en Visual Studio 2005. Las plantillas modifican el servidor de Team Foundation para adecuarlo a los procesos del equipo, tipos de work items, reglas, políticas de protección, documentación de procesos, etc. Inicialmente Team System incorporará varias Conviene no confundir las plantillas metodológicas con las plantillas empresariales que permiten crear marcos de trabajo con políticas y restricciones personalizadas, complementando a las primeras. Las plantillas empresariales ya existentes en VS2003 continúan siendo soportadas en VS2005. Análisis y Diseño En las fases de análisis y diseño, Team System incorpora diseñadores de sistemas distribuidos para reducir la complejidad del desarrollo y despliegue de aplicaciones orientadas a servicios. El conjunto esta compuesto por: • Application Connection Designer. Permite a los arquitectos y desarrolladores definir aplicaciones que serán configuradas en sistemas de despliegue. • Logical Datacenter Designer. Será utilizado para crear diagramas que representen la estructura lógica del centro de datos con objeto de comunicar información relevante para el desarrollador acerca del entorno de despliegue. • System Designer. Asistirá en la composición de aplicaciones dentro de cada sistema final. • Deployment Designer. Enlazará las aplicaciones dentro del sistema lógico de servidores modelado sobre un diagrama de centro de datos lógico. Estos diseñadores facilitan el diseño a los arquitectos de aplicaciones orientadas a servicios mientras que los desarrolladores pueden trabajar con el código generado manteniendo los cambios del código sincronizados con el diseño visual. << dnm.arquitectura Los arquitectos de infraestructura también pueden crear abstracciones lógicas de sus centros de datos y validarlos contra las restricciones de la aplicación o centro de datos diseñado por el arquitecto de aplicaciones sobre un despliegue real. Los informes generados desde esta validación ayudan a documentar el despliegue final. Los diseñadores de sistemas distribuidos, ofrecen restricciones y validaciones contra Web Service Enhancements (WSE), Seguridad IIS, Seguridad SQL, y ASP.NET. A modo de ejemplo, esto permite asegurar que un componente que requiere un tipo de seguridad, sólo podrá ser distribuido sobre un sistema que soporte ese tipo de seguridad. Entre algunas otras características sobresalientes en este apartado, cabe destacar que las configuraciones de los servidores Web basados en IIS descritas en el modelo pueden ser replicadas automáticamente desde un servidor ya existente evitando tener que volver a parametrizar todos los detalles del host para duplicar el elemento. Los lenguajes soportados para los diseñadores de sistemas distribuidos en primera instancia serán Visual C++ (Extensiones Manejadas), Visual Basic y Visual C#. Sin embargo, el diseñador de clases soportará todos los lenguajes .NET suministrados por Microsoft. Desde el punto de vista de la extensibilidad se ha creado un modelo para Herramientas de desarrollo avanzadas Las herramientas de análisis estático de código que acompañan a Visual Studio 2005 permiten detectar defectos en el código inspeccionando el código fuente o los binarios sin necesidad de ejecutarlos. PREFast o FxCop son herramientas de este estilo. Estas herramientas se integran con el proceso de compilación produciendo advertencias o errores en la lista de errores de Visual Studio y facilitando la navegación hasta el defecto con un solo clic. <<dotNetManía Figura 4. Diagrama de un Datacenter lógico. la primera release de los diseñadores de sistemas distribuidos que permite obtener acceso a los servicios básicos o clientes (servicios Web, aplicaciones Web, aplicaciones Windows, servicios externos o bases de datos externas). Más adelante se publicará un SDK que ampliará estas funcionalidades. Dynamic System Initiative (DSI) es una amplia iniciativa de Microsoft para unificar hardware, software, y proveedores de servicios alrededor de una nueva 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 operaciones de IT con los requisitos operacionales de las aplicaciones. En tiempo de diseño permitirá a través de Visual Studio capturar las políticas de software y describir los requisitos operaciones de la aplicación. En tiempo de despliegue, la descripción de la aplicación permitirá al sistema operativo automatizar el despliegue completo de la aplicación y alojar dinámicamente un conjunto distribuidos de servidores, almacenamiento, 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 construcción de aplicaciones de un dominio específico como aplicaciones orientadas a servicios, los diseñadores de sistemas distribuidos son más idóneos. Es posible encontrar más información sobre diseñadores de sistemas distribuidos en http://msdn.microsoft.com/ vstudio/teamsystem. 83 << dnm.arquitectura Aunque las herramientas ya disponen de reglas para el análisis estático, es posible agregar nuevas reglas a través de las extensiones. Figura 5. Análisis de código. Application Verifier es una herramienta de Visual Studio que expone instrumentación ya presente en el sistema operativo Windows. La instrumentación realiza verificaciones en los programas en ejecución dentro de áreas seleccionadas como consumo de memoria, utilización de secciones críticas o modo de utilización. Permite detectar problemas de solapamiento de memoria, bloques alojados en el heap, reutilización después de borrado, doble borrado y contaminación del heap. En el área de secciones críticas detecta operaciones que pueden conducir a deadlocks o pérdida de recursos. En la parte de modo de utilización detecta intentos de reutilización de manejadores que ya no son válidos. Code profiler es un mecanismo de Visual Studio Team System que periódicamente interrumpe la ejecución de una aplicación para determinar qué función se está ejecutando. Mantiene un conteo para cada función que es mostrado sobre una estadística una vez finalizada la ejecución del profiler para determinar el rendimiento medio de cada función analizada. Sin embargo, esta funcionalidad no estará disponible para aplicaciones 64 bits hasta siguientes versiones de Team System. <<dotNetManía Herramientas de testeo 84 Las pruebas en Visual Studio Team System son gestionadas a través del Test Manager, que es un visor de los tipos de pruebas asociados a un proyecto. Los tipos que se pueden incluir en el visor son: pruebas manuales, unitarias y pruebas de carga. pasar de una base de datos Visual Source Safe a Team System. Por último, cabe destacar que el nuevo sistema de control de código fuente exFigura 6. Test Manager. pone un conjunto de API que permiLos proyectos de test son proyectos ten ser consumidas por terceras herrade Visual Studio estándar creados espemientas y que pueden integrarse con cíficamente para contener las pruebas. Visual Studio facilitando la personalizaEste tipo de proyectos permite a los usuación de procesos en la gestión de la conrios establecer una línea clara entre el figuración de cada organización. código desarrollado y el código utilizado para el aseguramiento de la calidad. Por otro lado Team System incluye en el Framework de Test un sistema de gestión que permite distribuir las pruebas en máquinas locales y Figura 7. Gestión de código fuente. remotas. Realizando una comparación rápiConclusión da entre Visual Studio Team Test y Application Center Test podríamos decir que las características que dan A medida que las aplicaciones cresoporte a las pruebas de carga son cen en complejidad, los equipos de desacompletamente nuevas, mientras que rrollo necesitan los mismos principios el resto de prestaciones soportadas por RAD de simplicidad y flexibilidad para ACT han sido ampliamente mejorair escalando con ellos. Reducir la comdas. Entre las características que plejidad significa aumentar la productiactualmente no están incorporadas se vidad, ahorrando costes mientras se encuentra el soporte para la automareducen los tiempos de desarrollo. Con tización de pruebas de interfaz de Visual Studio Team System las organiusuario (GUI), sin embargo, este tipo zaciones pueden: de funcionalidades serán suministra• Reducir la complejidad de disdas por herramientas de terceros que tribución de modernas soluciose integrarán en Visual Studio. nes orientadas a servicios, optimizándolas para los entornos operacionales. Control de código fuente • Facilitar colaboración entre Visual Source Safe continúa acomtodos los miembros de un equipañando a Visual Studio como una solupo de software, incluyendo anación individual o para pequeños equilistas de negocio, jefes de propos. Team System incluye un servidor yecto, arquitectos, desarrollay una gestión de la configuración susdores, testers, y directores de tentada sobre base de datos que es capaz operaciones. de escalar entre un gran número de • Personalizar y extender sus proequipos y proyectos. pios procesos internos y marcos En la versión final del producto de trabajo o elegir entre más de existirá un proceso de migración para 450 productos adicionales. 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 posible.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, ¿podré seguir escribiendo código manualmente? ¿Es arrastrar-y-soltar el futuro de la programación? La mayoría de las cosas que conozco hoy se remontan a hace quince años, cuando la única forma de programar aplicaciones Windows era utilizando el SDK. Se 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 inventaron primero, Visual Basic, y después, los asistentes. Empecé a jugar con los asistentes en Visual Studio 4.0. En ese momento, un asistente era simplemente una librería de MFC, que debía registrarse e integrarse con el IDE de Visual Studio. El asistente creaba un proyecto con un número predeterminado de ficheros para formar una aplicación con un conjunto de capacidades definidas por el usuario. Estaba dirigiendo un Dino Esposito es redactor de dotNetManía. Formador, consultor y escritor afincado en Roma. Miembro del equipo de Wintellect, Dino está especializado en ASP.NET y ADO.NET. Puede enviarle sus consultas a [email protected] el único asistente realmente bueno, es el que construyes tú mismo (o que consigues conocer al detalle). Utiliza los asistentes para ahorrar tiempo, no para aprender programación ¿ ¿Hay vida más allá de los asistentes en Visual Studio 2005? ¿Es arrastrar y soltar el futuro de la programación? ? grupo de desarrollo, y los asistentes me ofrecieron una excelente herramienta para escribir código más rápidamente, y de acuerdo con un conjunto de premisas corporativas. En ese momento, era un fan de los asistentes, aunque, en realidad, era un fan de los asistentes personalizados. ¿Qué es un asistente personalizado? Uno que te escribes tú mismo para ayudarte a ti y a tu equipo a desarrollar con ciertas características, más 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 cultivos normales y los biológicos. Usualmente, no sabemos qué es lo que contienen los vegetales que compramos en un supermercado. Pero si lo cultivas tú mismo, sabes mucho de ellos. La moraleja de esto es que muchos asistentes de Visual Studio esconden código de la vista predeterminada y transmiten una sensación de omnipotencia. Haces “clic” y el código se despliega ante tus ojos. ¿Es eso lo que quieres? ¿Sabes realmente lo que hace ese código? Por ejemplo, el control SQLDataSource, hace que la paginación a través de un origen de datos sea trivial. Pero si no conoces exactamente cómo funciona, podrí- ¿ Lo que no soporto de Visual Studio 2003, es que plantea restricciones tales como IIS, Extensiones de Servidor de FrontPage y el uso de proyectos. Me va a pasar lo mismo con Visual Studio 2005 ? Visual Studio 2005, trae buenas noticias a los programadores. Lo primero y más importante, IIS ya no es un requisito estricto. De hecho, el producto incorpora un servidor Web local que hace que IIS sea opcional, al menos para testeo rápido y depuración. El servidor Web local es una versión ligeramente mejorada de Cassini, una herramienta que se lanzó originalmente con WebMatrix. Es importante tener en cuenta que el servidor local representa solamente la opción predeterminada. Si abres un proyecto a partir de un directorio virtual de IIS, Visual Studio utilizará IIS para depurar la aplicación. El servidor Web embebido es solamente un pequeño archivo de código ejecutable, y no puede reemplazar las características de un servidor completo como IIS. Funciona sólo con páginas individuales, y no inclu- ye ninguna de las características adicionales de IIS, tales como la metabase. En otras palabras, utiliza libremente el servidor local para propósitos de depuración, pero no te fíes plenamente de él para la distribución de la aplicación. ¿Qué es un DiffGram? Es la representación XML del estado de un DataSet, incluyendo filas actuales, cambios realizados, y errores pendientes en filas de la tabla. Visual Studio 2005 soporta múltiples formas de abrir 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 ficheros. También puedes acceder a la instalación local de IIS, navegar por la jerarquía de directorios virtuales existente, y acceder a las raíces virtuales o crear nuevas entradas. Puedes abrir sitios Web existentes mediante el protocolo FTP y luego crear y editar archivos. Sin embargo, debe de tenerse acceso al sitio FTP y permisos sobre los directorios correspondientes. El directorio debe de existir, porque Visual Studio no puede crear nuevos sitios Web vía FTP. Además, Visual Studio 2005 no compila todo el código del sitio en un único ensamblado, como la versión anterior. En su lugar, utiliza el nuevo modelo de compilació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 ficheros .ASPX, sino en los de extensiones .CS o .VB e incluso los de recursos. Esto desemboca en una especie de compilación dinámica para las clases de soporte “codebehind”. Sin embargo, hay que ir con cuidado. Evitar la compilación explícita de toda la aplicación tiene un costo que debe ser tenido en cuenta. La distribución al servidor Web debe de constar obligatoriamente de ficheros .VB o .CS. Y aunque los ficheros de código fuente no pueden ser solicitados explícitamente al servidor, están ahí con el riesgo potencial de que un atacante pudiera acceder a ellos y poner en riesgo la propiedad intelectual. Para evitar esto, dispones de dos opciones: precompilar todo el sitio para distribuir ensamblados ya construidos en el sistema local, o compilar los ficheros de código a un único ensamblado. La pre-compilación del sitio es otra de las características más interesantes de ASP.NET 2.0 (no de Visual Studio 2005), que permite <<dotNetManía as terminar con código ineficiente que nunca serías capaz de escribir en Visual Studio .NET 2003. Parafraseando un viejo lema del cine, el único asistente realmente bueno, es el que construyes tú mismo (o que consigues conocer al detalle). Utiliza los asistentes 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 desarrolladores, tales como IIS, Extensiones de Servidor de FrontPage, y el uso de proyectos. ¿Me va a pasar lo mismo con Visual Studio 2005?, a no ser que solucione este tipo de problemas… Por supuesto, estamos hablando de Visual Studio 2005 y aplicaciones ASP.NET. Por supuesto, la versión 2005 suministra una forma mucho más sencilla y amigable de construir aplicaciones ASP.NET. Las mejoras clave, realmente solucionan muchos de los 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, necesidad de soluciones .SLN para construir, no ya aplicaciones, sino una simple página, o falta de opciones alternativas al “code-behind”. [email protected] [email protected] << dnm.todotnet.qa 87 88 [email protected] [email protected] <<dotNetManía << dnm.todotnet.qa IIS ya no es un requisito estricto. De hecho, el producto incorpora un servidor Web local que hace que IIS sea opcional, al menos para testeo rápido y depuración distribuir aplicaciones Web en un formato listo para usarse, preservando así la propiedad intelectual, y evitando, además, ese pequeño retraso inicial en las peticiones, debido a la compilación dinámica de recursos. Por último, pero no menos importante, Visual Studio 2005 soporta la edición de ficheros individuales, y no requiere de un proyecto para la edición simple de un fichero en disco. De modo que, si hacemos doble-clic en un fichero .ASPX en el explorador de Windows, se lanza Visual Studio 2005, permitiendo la edición independiente. A diferencia la versión precedente, IntelliSense y el coloreado del código fuente funciona correctamente. La página puede verse, además, directamente en el navegador Web a través del servidor Web local. He estado investigando últimamente con Visual Studio 2005. Y tengo razones a favor y en contra del paradigma de correspondencia 1 a 1 entre los ficheros en disco y los nodos del Explorador de Soluciones. La razón por la que no me gusta, es que si tengo directorios con montones de ficheros (por ejemplo, ficheros gráficos) las operaciones de copiar y pegar son muy lentas, por no mencionar las operaciones tipo chek-in y checkout con Visual SourceSafe. ¿Sugerencias? Parece que esta es una de las preguntas más frecuentes 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 cuenta que Visual Studio no muestra todos los ficheros y carpetas en el Explorador de Soluciones, sino que se omi- ¿ tengo razones a favor y en contra del paradigma de correspondencia 1 a 1 entre los ficheros en disco y los nodos del Explorador de Soluciones ? ten ciertos archivos y carpetas ocultos, y lo mismo sucede con las carpetas virtuales de IIS. De forma que, para ocultar un directorio demasiado grande de la vista del explorador, basta con marcar la carpeta como un directorio virtual de IIS. Nada cambia en la aplicación, pero se obtienen una serie de beneficios asociados. Por ejemplo, puedes reutilizar tus imágenes más fácilmente (o cualquier otro recurso), en otras aplicaciones y almacenarlos en cualquier parte del servidor Web. El contenido de un directorio virtual, es automáticamente excluido 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 proyectos entre máquinas distintas. ¿Existe finalmente una forma de transportar la configuración del IDE de forma fácil y cómoda? Supongo que eres un típico adicto al trabajo (como yo) y no puedes estar en casa unas pocas horas por la noche sin hacer algo. De ahí la necesidad de transvasar la configuración del IDE de la máquina del trabajo al PC de casa. ¿Estoy en lo cierto? Francamente, espero que no. ¿ A menudo tengo la necesidad de mover proyectos entre máquinas distintas. ¿Existe finalmente una forma de transportar la configuración del IDE de forma fácil y cómoda? ? Típicamente, cuando trabajas con Visual Studio, desarrollas macros, reordenas menús, defines nuevos valores predeterminados, añades nuevos controles a la Caja de Herramientas, creas nuevas plantillas de proyecto y defines nuevos colores y tipos de letra. Toda esta información no es fácil de catalogar si tienes que hacerlo manualmente. Por suerte, Visual Studio 2005, suministra una nueva caja de diálogo de “Importación/Exportación de configuraciones”, desde el menú de “Herramientas”. Seleccionas el conjunto de valores de configuración que quieres almacenar 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 mover el fichero a la máquina de destino e importarla. No puede ser más fácil. Traducción por Marino Posadas << dnm.biblioteca.net dnm.biblioteca.net Visual C# 2005:A developer's notebook Jesse Liberty Editorial: O'Reilly ISBN: 059600799X Páginas: 239 Publicado: Abril, 2005 Idioma: Inglés No se trata de una obra de iniciación, no obstante. Se asumen conocimientos suficientes de la versión anterior del lenguaje, de forma que el libro se centra fundamentalmente en lo que es nuevo, y lo hace con la profundidad suficiente para no dejar cabos sueltos. Pro C# 2005 and the .NET 2.0 Platform Andrew Troelsen Editorial: APress ISBN: 1590594193 Páginas: 1.032 Publicado: 2005 Idioma: Inglés Autor de otras 6 obras relacionadas con la programación, Troelsen obtuvo su máximo reconocimiento con la publicación de “COM and .NET interoperability” y “Visual Basic .NET and the .NET Platform: an advanced guide”, que se situaron en los best sellers de Amazon dentro de su género. Bien, pues, esta obra ya ha vendido más que las otras dos, y va en camino de batir todos sus registros anteriores. Se trata de una obra extensa, en la que se recorren, no solo las novedades lingüísticas, sino (y más importante en este caso), todas las novedades de las librerías de .NET Framework 2.0, usando C# como lenguaje base para todos los ejemplos de código. En fin, una revisión en profundidad de todo lo disponible en esta versión, muy recomendable para programadores que conozcan la versión anterior y quieran actualizar software o pensar en software hecho con la nueva versión a la luz de lo ya conocido. <<dotNetManía << El lenguaje C# sigue acumulando interesantes cambios estructurales y semánticos para mantenerse como “lingua franca” y referente de las novedades en lenguajes de desarrollo, como nos decía el mes pasado Jeff Prosise. Jesse Liberty, que ya nos había convencido con sus obras anteriores, y especialmente, con su “Programming C#”, aborda en esta pequeña obra justamente lo que necesita el desarrollador de C# que quiere actualizar sus conocimientos a la nueva versión. 89 << dnm.desvan noticias.noticias 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á siendo distribuido gratuitamente para versiones anteriores de Windows, formará parte de Windows Vista, en un esfuerzo por suministrar mejores servicios básicos de seguridad para los usuarios no corporativos. La noticia se inscribe dentro de la política iniciada por la compañía acerca de la importancia de la seguridad, y coincide casi en el tiempo con el anuncio de un nuevo software, Microsoft Client Protection, cuya disponibilidad en beta parece próxima. Dentro de esta línea estaría la presencia de Windows OneCare Live, un sistema antivirus y anti-spyware que parece uno de las consecuencias Documentos y código en la Red Script para automatizar el asistente de grabación de CD en Windows XP : Fernando Muñoz el webmaster de Fermu's Website (http://www.fermu.com/content/view/ 262/2/lang,es) nos trae este interesante ejemplo de código de script, producido por él (que no quiere atribuirse su autoría) y que puede además darnos ideas para otros usos similares. << de la adquisición de Sybari Software por Microsoft hace algún tiempo. Curiosamente, hace unos días, Microsoft invitó a un numeroso grupo de “hackers éticos”, a investigar vulnerabilidades en su software, en el evento de seguridad Blue Hat. Y, casi de forma paralela, Tony Chor (Lead Program Manager para IE7) mostraba en Malasia algunas de las nuevas características de IE7 Beta 2, enfatizando en el hecho de que no se trata de un conjunto de nuevos parches, sino de un cambio profundo a nivel de estructura, con la seguridad en mente en todo momento. Utilidades del mes DonationCoders. Este mes queremos dedicar esta sección, no a un producto concreto sino al sitio especializado DonationCoders, en el que participan varios autores, algunos de los cuales han aportado utilidades notables. Uno de ellos, Skrommel, presenta una utilidad que recomendamos (Process Guard), que monitoriza (y avisa, a voluntad) situaciones límite del sistema (respecto al uso de memoria, puertos, disco, etc). Pero todo el sitio es realmente útil. http://www.donationcoders.com. <<dotNetManía Sitios recomendados 90 VBaccelerator: Sitio con notables aportaciones de código fuente, especialmente en Visual Basic .NET. Sin haberlo hecho a propósito, una de las novedades actuales es un código fuente en VB.NET que permite mediante las API Image Mastering API (IMAPI) controlar el proceso de grabación, selección de contenidos y producción de CD (http://www.vbaccelerator.com/home/NET/Code/Libraries/Writing_CDs/Writing_Data_CDs/ article.asp). WWWCoder: Interesante sitio con artículos y código fuente sobre desarrollo en .NET de cara a la programación Web y cliente/servidor. Actualiza con bastante frecuencia. Disponible en http://www.wwwcoder.com/main/ Default.aspx
Documentos relacionados
PON: P2P Over .NET PON: P2P Over .NET
Administración Pilar Pérez ([email protected]) Asesor Técnico/Coordinación Marino Posadas ([email protected]) Redactores Antonio Quirós, Dino Esposito, Guillermo 'guille' Som...
Más detalles