visual basic.net • c# • delphi • asp.net • ado.net … · visual basic.net • c# •...

60
Entrevista a Nuria Oliver Investigadora de Microsoft Research en EEUU ¿Qué es WSE 2.0? Una visión de alto nivel de qué es WSE y cómo se integra con .NET dotNetManía nº16 junio 2005 • 6,00 (España) Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET De igual a igual: ¿es legal el intercambio de ficheros en la Red? Acceso a datos y contenedores de datos ToDotNet Q&A Generando hojas Excel con ASP.NET • Creación de complementos en Visual Studio .NET • Interfaces • Herencia: ¿To be or not to be? ¿Qué es WSE 2.0? Una visión de alto nivel de qué es WSE y cómo se integra con .NET Entrevista a Nuria Oliver Investigadora de Microsoft Research en EEUU MVP Online Aviso para navegantes Comunidad.net El sitio de “El Guille”, un sitio con más de ocho años de historia

Upload: phamcong

Post on 22-Sep-2018

269 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Entrevista a Nuria OliverInvestigadora de Microsoft Research en EEUU

¿Qué es WSE 2.0?Una visión de alto nivel de qué es WSE y cómo se integra con .NET

dotNetManíanº

16 ju

nio

2005

• 6

,00

€(E

spañ

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

Legal

dotNetManíawww.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

De igual a igual: ¿es legal el intercambio de ficheros en la Red?

Acceso a datos y contenedores de datosToDotNet Q&A

Generando hojas Excelcon ASP.NET • Creación

de complementos enVisual Studio .NET •

Interfaces • Herencia:¿To be or not to be?

¿Qué es WSE 2.0?Una visión de alto nivel de qué es WSE y cómo se integra con .NET

Entrevista a Nuria OliverInvestigadora de Microsoft Research en EEUU

MVP OnlineAviso para navegantes

Comunidad.netEl sitio de “El Guille”, un sitio conmás de ocho años de historia

Page 2: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía
Page 3: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Ya es público: Hawaii es el nombre en cla-ve de la “segunda siguiente versión” de VisualStudio, o sea, la que seguirá a Orcas, que es elnombre en clave de la que seguirá a Whidbeyque, a su vez, siguió a Everett y ésta a Rainier...¡Cómo me gustan los codenames! ¿No me diráque Hawaii no suena bien? Para SQL Serveraún no sabemos cuál será el codename de la“segunda siguiente versión” de SQL Server2005. Sólo sabemos que el de la siguiente ver-sión será Acadia, y que muy probablementese llamará SQL Server 2007. Y un triste adiósa Magneto porque a partir mayo es WindowsMobile 5.0. Me pregunto por qué no dejaránestos codenames como definitivos, ¡a mí me gus-tan más!

Bienvenidos al número 16 de junio de2005 de dotNetManía.

En este número entrevistamos a la pri-mera mujer –será difícil llegar a la paridaden esto por ahora–: Nuria Oliver, una joveninvestigadora española que realiza sus tra-bajos de investigación para MicrosoftResearch en EEUU.

Éste es un mes de estrenos: de caras nue-vas, de nuevos autores que aportarán tambiéncosas nuevas y de una nueva sección: dnm.ini-cio.*, dirigida por “El Guille” y dedicada adifundir las bases de .NET Framework desdeun punto de vista teórico (dnm.inicio.funda-mentos), y desde un punto de vista práctico(dnm.inicio.taller) y que no sólo vendrá biena los que están empezando –¿a estas alturas?se preguntará; pues sí, aún hay muchas perso-nas que están empezando o que no lo hanhecho todavía–, sino también a algunos pro-fesionales que a pesar de serlo y ejercer comotales, tienen algunas lagunas y que nos vienendemandado artículos de este tipo. Ojo, que noserá una sección para dummys ni mucho menos.

Empezamos por dar la bienvenida a unamujer: Reyes García, la primera también,quien empieza colaborando con Braulio Díez,con el artículo “Generando hojas Excel conASP.NET”, siguiendo éste con su visión prác-tica que, al menos a mí, tanto me gusta.

Tengo que dar la bienvenida igualmen-te a César de la Torre, de uno de losMicrosoft Gold Partner: Renacimiento,quien nos escribe el artículo “¿Qué esMicrosoft WSE?”. Espero que podamoscontar más con él para que nos cuente másen profudidad sobre las especificacionesWS-* y, sobre todo de Indigo.

Y también doy la bienvenida a Carlos J.Quintero, autor de las MZTools y MVP deVisual Developer .NET quien nos escribe de loque más sabe, de cómo crear complementosen Visual Studio .NET en su artículo “Creaciónde complementos en Visual Studio .NET”.Espero que Carlos quiera seguir escribiendosobre estos temas que de seguro le interesará.

En la sección arquitectura y metodologí-as Daniel Mazzini escribe un buen artículosobre los patrones Delegado y SuperclaseAbstracta. Tenemos planes para continuarhablando de patrones básicos, de creación, deUI y UIP, de estructura y de comportamiento.

Dino Esposito, como siempre explican-do cosas complejas con sencillez, toca temascomo el acceso a datos, remontándose a lososcuros tiempos del RDO hasta ADO.NETy también nos ayuda a elegir entre la grancantidad de clases de colecciones que hay enel .NET Framework.

No se pierda el próximo mes que tene-mos un extenso monográfico de SQL Server2005, donde han colaborado muchas perso-nas para hacerle llegar la mejor información.

Espero que le guste.do

tNet

Man

ía<<

3

HawaiidotNetManía

Dedicada a los profesionales de la plataforma .NET

Vol. II •Número 16 • Junio 2005Precio: 6€ (España)

EditorPaco Marín

([email protected])

AdministraciónPilar Pérez

([email protected])

Asesor Técnico/CoordinaciónMarino Posadas

([email protected])

RedactoresAntonio Quirós, Dino Esposito, Guillermo

'guille' Som, Jorge Serrano, José ManuelAlarcón, Luis Miguel Blanco, MiguelKatrib (Grupo Weboo) y Pedro Pozo.

Colaboradores habitualesÁngel Esteban, Braulio Díez, Eladio

Rincón, Erich Bühler, Fernando Nogueras,Jorge Crespo Cano, José Miguel Torres,Miguel Egea, Octavio Hernández, PabloAbbate, Pepe Hevia, Rodrigo Corral y

Salvador Ramos.

Además colaboran en este númeroCarlos J. Quintero, César de la Torre, José

Antonio Suárez Lozano y Reyes García

Edición y Suscripciones.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

PublicidadMediadev

Sophie Mancini ([email protected])Tf. 93 426 22 57 - 670 99 74 64

Fax. 93 423 11 40

ImprimeGráficas Vallehermoso

www.graficasvallehermoso.com

ISSN1698-5451

Depósito LegalM-3.075-2004

<<

dnm.editorial

Page 4: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

16dnm.sumario

dnm

.sum

ario

De igual a igual: ¿es legal el intercambio de ficheros en la Red? 10-11La legalidad de las copias de las obras de creación, y especialmente de las musicales ycinematográficas, efectuadas por usuarios finales mediante el recurso a las redes deintercambio de ficheros de igual a igual (p2p) ha sido defendida y contradicha en numerosasocasiones en España. Tal vez sea el momento para hacer una aproximación al fenómenocon una cierta mayor distancia y, especialmente, dejando al usuario la opción de elegircual debe ser su conducta al respecto.

Entrevista a Nuria Oliver 12-14Nuria Oliver es investigadora en Microsoft Research en Estados Unidos. Previamenteestuvo en el mítico Media Lab del MIT (Massachusetts Institute of Technology). Sutrabajo se basa fundamentalmente en la interacción de las máquinas con el ser humanoa través de la percepción de éstas del mundo que les rodea.

Generando hojas Excel con ASP.NET 15-19Hoy en día las hojas Excel se han convertido en un estándar para representar informaciónfinanciera, de control de stock, etc. Cuando hablamos de ASP.NET solemos tener asociadoel HTML como formato de representación de la información, otras alternativas nos hacenpensar en problemas de rendimiento, o herramientas con un coste elevado, ¿existe algunaforma sencilla de hacer esto con .NET?

¿Qué es Microsoft WSE? 20-26Microsoft WSE es un nuevo módulo de componentes .NET que permite extender elmarco de trabajo de .NET Framework 1.1 para poder desarrollar servicios WebXML con características avanzadas. WSE es algo que, sin embargo, al no tenerlodisponible directamente con Visual Studio 2003 no es muy conocido por el momento,pero si se quiere desarrollar un servicio Web XML complejo, hoy en día, la únicaopción es basarse en WSE 2.0. La intención de este artículo es simplemente dar unavisión de alto nivel de qué es WSE y cómo se integra mediante SOAP con .NET 1.1y Visual Studio 2003.

Creación de complementos en Visual Studio .NET 28-34Aunque Visual Studio .NET es uno de los mejores entornos de desarrollo jamás creados,siempre habrá funcionalidades que echemos en falta. Afortunadamente Microsoft ya pensóen ello y nos permite añadir nuestras propias funcionalidades a medida mediantecomplementos, que aprenderemos a crear en este artículo.

Interfaces.Yo implemento, tu implementas,... ¡implementemos todos! 36-39En este primer artículo de esta nueva seccción explicamos los Interfaces. Los interfaces sonunos de esos elementos de .NET Framework que juegan un papel bastante importante,pero que, a pesar de estar por todas partes, aparentemente pasan desapercibidas...

Herencia: ¿To be or not to be? 41-46En este artículo se demuestra por medio de patrones cuando la herencia es una buenaopción y algunos síntomas que nos pueden indicar cuando usarla se puede convertir en unproblema y cómo resolverlo.

dnm.mvp.online 47-48Aviso para navegantes

dnm.comunidad.net 50-51El sitio de “El Guille”, un sitio con más de ocho años de historia

dnm.todotnet.qa 52-54Acceso a datos y contenedores de datos.

dnm.biblioteca.net 57ADO.NET and System.Xml 2.0 (Alex Homer, Dave Sussman y Mark Fussel)C# 2.0: Practical Guide for Programmers (Michel de Champlain y Brian Patrick)

dnm.desvan 58

Page 5: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía
Page 6: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

6

dnm.noticias<<dnm.noticias

Microsoft celebró el Developer Days de Madridn

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

sMicrosoft reunió a cerca de mil desarrolladores a los que hizo partícipes delas novedades tecnológicas de Visual Studio Studio 2005 y SQL Server 2005

Microsoft organizó el día 17 demayo en los cines Kinépolis, elMicrosoft Developer Day de Madrid alque asistieron alrededor de 1000 per-sonas. Éste es un evento gratuito queorganizan también en otros muchoslugares del mundo, las oficinas localesde Microsoft con el apoyo de losRegional Directors y otros partners,donde se reúne a la comunidad de desa-rrolladores, para hacerles partícipes delas novedades tecnológicas y que pre-tende ser un punto de encuentro entreMicrosoft y los desarrolladores.

Este año, las conferencias tuvieroncomo denominador común las nuevascaracterísticas y mejoras de Visual Studio2005 y SQL Server 2005.

Después de la pequeña charla de pre-sentación de Mauricio Ulargui, directorde desarrolladores .NET de MicrosoftIbérica, empezaron las charlas técnicascon Alejandro Mezcúa, de byteabyte.netcon su sesión “Dispositivos móviles enVisual Studio 2005”. En esta sesión sevieron las principales novedades y dife-rencias de .NET Compact Framework2.0 con respecto a la versión anterior. Dela misma forma, se mostró cómo se hamejorado Visual Studio paraincorporar nueva funcionalidadorientada al desarrollo para dis-positivos. Por último, se hizo hin-capié en las mejoras con respectoal acceso a datos y se demostrócómo crear y utilizar bases de datosSQL Mobile desde dentro delentorno de desarrollo de VisualStudio 2005.

En la siguiente ponencia,Leonardo Díez, de Danysoft,expuso su charla “Novedades en

el entorno de ejecución .NET2.0”, una de las más esperadas,en la nos habló del soporte para64 bit del nuevo CLR y de lalibrería de clases, así como de ladepuración, con las nuevascaracterísticas, como la tandemandada “editar y continuar”a la que estaban acostumbradoslos desarrolladores de VisualBasic 6 y que ahora volveremos atener, incluso los desarrolladores de C#,así como de otras mejoras del depura-dor. Además habló, cómo no, de los

genéricos (generics), y de sus ven-tajas y desventajas. Terminó conun extenso resumen de las nove-dades de los lenguajes VB.NETy C#.

Después de un merecidodescanso, vino la ponencia“Desarrollo de clientes inteli-gentes: Windows Forms 2.0 yVisual Studio Tools for Office”que expuso Pablo Peláez, deVisual Programming y RegionalDirector de Microsoft, en la quenos explicó cómo desarrollarpara MS Office 2003 desde

.NET con esta nueva versión, desde lasnovedades, como la integración del dise-ño, el soporte para controles adminis-trados, las mejoras del modelo de pro-gramación, las nuevas capacidades de lacaché, el soporte ClickOnce, etc.

Entonces intervino César de laTorre, de Renacimiento, uno de losprofesionales que más sabe de WebServices en este país y que, sin embar-go, nos habló de ASP.NET 2.0 :-). Sucharla fue “Novedades en el desarrollode aplicaciones Web ASP.NET 2.0”. Porsupuesto, tuvo que hablar sobre las nue-vas master pages, los themes y skins y los

profiles como una de las novedades másdifundidas y también solicitadas por losdesarrolladores, así como un breve repa-so a los nuevos controles. Pero no menosimportante, por no decir que más, eraaprender sobre el acceso a datos y com-ponentes de negocio. Con los nuevoscontroles como el GridView o elDetailsView y, sobre todo, cómo tra-bajar en dependencia de la caché deSQL. Por último, un vistazo a los nue-vos servicios de seguridad y Webparts.

Después de la comida, FernandoGuerrero, de Solid Quality Learning,que como Regional Director estuvo ensu primer DevDays. Su conferencia“SQL Server 2005 para desarrolladores”en la que hizo un repaso a todas las nove-dades de SQL Server 2005 que al menosnos sirvió para tener una visión genéri-ca de las principales novedades:Integación del CLR, mejoras de T-SQL,XML y SQL Server 2005, especialmen-te del Service Broker (del que hablará másextensamente en el próximo número dedotNetManía) y algunas de las mejorasde ADO.NET.

Enseguida nos relajamos un pococon la ponencia “Gestión del ciclo devida completo de un proyecto software:Visual Studio Team System”, tambiénmuy esperada y en la que Pablo Peláez,David Salgado y David Carmona (estos

últimos de Microsoft Ibérica)nos explicaron de una formadivertida la utilidad de las edi-ciones Team System.

Para finalizar, PabloMotos, un cómico español,consiguió hacernos reír un ratocon uno de sus monólogos y asírelajarnos un poco después deuna jornada maratoniana.

Sirve este DevDays comoaperitivo de su hermano mayor:Tech-Ed 2005.

Mauricio Ulargui

David Salgado,David Carmona y Fernando Guerrero

Page 7: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dnm.noticias<<

dnm.noticias

dotN

etM

anía

<<

7

Microsoft acaba de hacer pública el con-junto de herramientas para el desarrolladorde Longhorn WinFx que comprende porahora a Avalon, el próximo susbsitema depresentación e Indigo, el próximo subsiste-ma de comunicaciones, y que actualmenteestaban sólo disponibles para suscriptores aMSDN o betatester.

Estas tecnologías están disponibles paraser ejecutadas desde Windows XP oWindows Server 2003 y están pensadas paraque los desarrolladores podamos empezar aexperimentar con estas nuevas tecnologíasantes de la aparición del sistema operativoWindows Longhorn.

Esta beta 1 RC soporta Visual Studio2005 Beta 2 y .NET Framework 2.0 Beta 2.

Al conjunto se le ha llamado “Avalon”and “Indigo” Beta1 RC, y puede des-cargarse de la página de descargas deMicrosoft o llegar desde los centros dedesarrollo de Avalon (http://msdn.micro-soft.com/longhorn/understanding/pillars/ava-lon) o Indigo (http://msdn.microsoft.com/Longhorn/understanding/pillars/Indigo) don-de además podrá encontrar toda la infor-mación que precise.

Más información sobre Indigo en este mis-mo número en el artículo “¿Qué es WSE?”

Avalon e Indigo Beta1 RC públicadotNetManía nº 17 julio/agosto:Monográfico SQL Server 2005

Estamospreparandopara el próxi-mo número,el del verano,un mono-gráfico sobreMicrosoftSQL Server2005, en unnúmero quetendrá más

páginas de lo habitual y con el que espe-ramos poder repartir entre los suscripto-res la última versión CTP de SQL Server2005 (aún por confirmar). Por supuesto,contaremos con algunos de los mejoresprofesionales.

El borrador del índice es el siguiente:- Una nueva generacion de sistemas de ges-

tión de la información (FernandoBocigas).

- Entrevista a Paul Flessner (vicepresiden-te senior de aplicaciones de servicdor enMicrosoft)(aún por confirmar) y a CésarGalindo-Legaria (del equipo de desarrollode SQL Server 2005 en Redmond)(Marino Posadas).

- Alta Disponibilidad en SQL Serveer 2005(Miguel Egea).

- Business Intelligence en SQL Server 2005(Salvador Ramos)

- Introducción a SMO: SQL Server 2005como modelo de objetos programable(Marino Posadas)

- Service Broker (Fernando Guerrero)- Soporte XML en SQL Server 2005

(Eladio Rincón)- Integración del CLR en SQL Server 2005.

Ejecutando código administrado desde elnúcleo del motor de datos.(Luis MiguelBlanco)

- T-SQL 2005, más productivo que nunca(Pepe Hevia)

- SQL Server 2005 Mobile Edition, conti-núa la evolución (José Miguel Torres)

- SQL Server 2005 Express Edition, elmenor de la familia (Pedro Pozo).

Además de algunos contenidos extrasen algunas de las secciones habituales,como:TodotNet Q&A, MVP online,biblioteca, desván, opinión, etc.

Solid Quality Learning University celebró su primer SQLUSummit en Madrid

Estos seminarios los impartieron un total de12 mentores de Solid Quality Learning, exper-tos en diferentes especialidades, llegados hasta

Madrid tanto desde diferentes lugares de España como desdevarios países de América. Estos mentores son en su gran mayo-ría MVP y Directores Regionales de Microsoft, y enfocaron el even-to desde una vertiente puramente práctica y tendente a ofrecerconsejos concretos a los asistentes al mismo.

El objetivo de este summit era el de ofrecer formación avan-zada y de calidad a los usuarios avanzados de SQL Server y .NETde España. Un total de 75 profesionales asistieron a este evento,desde importantes empresas y entidades públicas, formando ungrupo de sumo interés por la variedad de sistemas y necesidadesespecíficas que reunía, enriqueciendo enormemente el eventocon sus experiencia particulares.

El evento cubrió temas de .NET pero fundamentalmente enlo que se refiere a técnicas de acceso y representación de datos,

para enlazar sin fricciones con la temática general de los semi-narios de SQL Server.

Este evento, que va a tener una periodicidad anual en cadaciudad, se trasladará tras el verano al otro lado del Atlántico, paravolver a España de nuevo el año 2006. Mientras tanto este mis-mo tipo de evento va a ser organizado en los Estados Unidos deNorte América y otros países de habla inglesa.

Durante los días 25 al 29 de mayo pasados,Solid Quality Learning organizó de comúnacuerdo con Microsoft Ibérica,el primer SQLU Summit en España

Page 8: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

8

dnm.noticias<<

dnm.noticias

Según publica Darryl K. Taft deeWEEK en su artículo “'Hawaii': A VisualStudio Paradise for Developers?”, la nue-va versión que sucederá a Orcas se llama enclave Hawaii. Quizá lo menos importantesea lo del nombre, sobre todo si tenemosencuenta que en el citado artículo se ase-gura que será una versión totalmente remo-delada de Visual Studio.

Según la citada fuente, mientras queWhidbey nos ayudará a acercarnos aLonghorn, Orcas será la versión que nospermitirá “cabalgar” en lo que la compañíallama “la ola de Longhron” y conectar conlas nuevas características de dicho sistemaoperativo. Hawaii vendrá poco después deOrcas, para aportarnos más funcionalidadespecífica de Longhorn.

Según Tony Goodhew, product mana-ger de Microsoft, “estamos sentando lasbases para una completa rearquitectura deVisual Studio post Orcas”. Sin determinarla fecha, se piensa que Microsoft tiene pen-sado tener en el mercado estas dos versio-nes antes de 2010.

Sin embargo, largo nos lo fían, estare-mos pendientes de Orcas, como haceAnders Hejlsberg, que está trabajandoduramente en la mejora de los compilado-res para la siguente versión.

Si está interesado, puede leer el artícu-lo completo (en inglés, eso sí) en:(http://www.eweek.com/article2/0%2C1759%2C1815855%2C00.asp)

Hawaii, sucesor de OrcasNuevo Microsoft Windows Mobile 5.0Microsoft presentó Windows Mobile 5.0 (Magneto) enel Mobile & Embedded DevCon

Desde el año 2000 que apa-reció el primer Pocket PC 2000y más tarde 2002, hasta losWindows Mobile 2003, 2003Second Edition y finalmente5.0 (¿por qué no le habrán lla-

mado Windows Mobile 2005?) han pasa-do sólo 5 años en los que hemos asistidoa un avance y aceptación increíble deestos dispositivos.

Bill Gates hizo público el anuncio dela disponibilidad, a partir del 10 de mayo,de Windows Mobile 5.0, la nueva plata-forma para dispositivos móviles en la con-ferencia Microsoft Mobile & EmbeddedDevCon, donde destacó algunas de las mejo-ras y nuevas características introducidas,muchas de ellas a petición de los partners,entre las que se encuentran: Versión deWindows Media Player 10 Mobile; unanueva versión de Office Mobile, que inclu-ye un nuevo Powerpoint Mobile; soportenativo para redes de alta velocidad 3G, Wi-Fi y mejoras en el soporte Bluetooth; sopor-te para teclado QWERTY; orientación dela pantalla en modo panorámico; mayorcapacidad de almacenamiento y soporte adi-cional para dispositivos USB 2.0; nuevasmejoras en la seguridad, cumpliendo con elestándar FIPS 140-2 del gobierno deEEUU; un nueva aplicación de fotografíay vídeo, soporte de ActiveSync 4.0, el usode la tecnología gráfica D3DMobile, etc...

Además de estas nuevas característi-cas y mejoras para los usuarios de este sis-tema, también incluye novedades para losdesarrolladores tanto de código nativocomo de código administrado. El nuevoSDK de Windows Mobile 5.0 está dise-ñado para Visual Studio 2005 y SQLServer 2005 y puede funcionar con lasbetas actuales de ambos productos. Dehecho ya pueden descargarse los corres-pondientes SDK, tanto para Pocket PCcomo para SmartPhone desde la páginade descargas de Microsoft.

Windows Mobile 5.0 soporta códigoadministrado, en tanto que todos los dis-positivos que lo lleven, tendrán el .NETCompact Framework 1.0 SP 3 instaladoen la ROM, y aporta un conjunto de nue-vas API accesibles desde el código admi-nistrado de .NET.

Desde mediados del pasado mes demayo inició su andadura campusMVP,el nuevo proyecto de formación on-line de Krasis.

Realizado con la colaboración dealgunos de los Más Valiosos Profesionales (MVP) deMicrosoft, ofrece formación en-línea de calidad en tecno-logías de Microsoft.

campusMVP ofrece cursos cortos, especializados y ase-quibles dirigidos especialmente a profesionales de la infor-mática y departamentos técnicos de empresas que necesi-ten mantenerse al día en su trabajo o ampliar conocimientos

dentro de su plan de progresión profesional o de forma-ción continua.

En la Web de campusMVP (www.campusmvp.com)encontrará toda la información sobre el proyecto, el catá-logo de cursos en los que se podrá matricular directamen-te on-line, un boletín de novedades, así como importanteinformación acerca de cómo conseguir los cursos de mane-ra gratuita si es usted un trabajador en activo de una empre-sa española.

También dispone de la posibilidad de realizar un pri-mer curso gratuito. Se trata de “Seguridad avanzada deInternet Information Server”.

Se inaugura campusMVPCampus MVP es una iniciativa de formación eLearning con contenidos de alta calidad entecnologías Microsoft impartidos por los mejores expertos del sector.

- Página de Microsoft para desarrolladores deWindows Mobile 5.0: http://msdn.microsoft.com/mobility/windowsmobile.

- Instrucciones para la instalación con la beta 2de Visual Studio 2005: http://msdn.microsoft.com/mobility/windowsmobile/howto/windowsmobi-le5/install.

- Página independiente donde encontrará unarevisión exhaustiva de Windows Mobile 5.0:http://www.mobile-review.com/pda/articles/wm2005-magneto-en.shtml.

Más información

Hawaii es el nombre en clave delnuevo Visual Studio que sucederáa Orcas, sucesor de Visual Studio2005, todavía en beta2

Page 9: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía
Page 10: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

De igual a igual: ¿es legal el intercambio de ficheros en la Red?

que ya tiene una cierta antigüedad, en tér-minos de lo que los usuarios de la Red entienden comoantiguo, ha prevalecido el ruido mediático de quienesdefienden, muchas veces con más voluntad que cono-cimiento jurídico, lo que llaman la legalidad de la copiaen red. Y la prueba de ello es que en tales defensas sehan manejado conceptos sociales y políticos, y casinunca jurídicos.

Tal vez sea el momento de hacer un análisis dela cuestión empleando exclusivamente los argu-mentos que se han descartado, es decir, los argu-mentos los jurídicos. Y hacerlo empleando un len-guaje que haga el discurso accesible a quien sim-plemente sepa leer.

Para que el intercambio de ficheros que contie-nen obras de creación (música, películas) sea posible,es preciso que una persona acceda al soporte de fija-ción de dichas obras (grabadas en CD o DVD), repro-duzca (copie) dicha obra en un sistema de almacena-miento (por ejemplo un disco duro fijo o removiblesde su ordenador) y permita a terceros el acceso, libreo condicionado, a tal reproducción. Acceso que seproduce a través de una red, como es el caso deInternet. Una vez que la obra fijada es accesible des-de la red, cualquier tercero que tenga acceso a dichosistema de almacenamiento podrá hacer una nuevareproducción de ella en su propio sistema.Almacenamiento que, a su vez, puede ser accesible aotros terceros que cumplan sus mismas condiciones,con lo que el número de posibles copias crece de for-ma exponencial, como lo acredita el dato de que las

copias en red sólo de obras cinematográficas sobre-pasan los cinco millones de ejemplares diarios.

La copia de una obra de creación contenida en unsoporte es un acto de reproducción, que, como nor-ma general, requiere de la autorización de su titular.El artículo 31.1º del español Texto Refundido de laLey de Propiedad Intelectual, como los sistemas jurí-dicos de nuestro entorno, reconocen al propietario deun soporte legítimo, la posibilidad de copiar la obraque contiene para su uso personal, y siempre que dichacopia no sea objeto de utilización colectiva ni lucra-tiva. Se trata, en definitiva, de un límite al derecho deltitular; o, si se quiere, de una excepción al derecho deautorizar la reproducción. Pero lo que nunca será es

José Antonio Suárez

dnm.legal

<< En la polémica,

José Antonio Suárezes socio director de Suárez

de la Dehesa Abogados,despacho especializado en

Propiedad Intelectual e Industrialy Nuevas Tecnologías.

La legalidad de las copias de las obras de creación, y especialmentede las musicales y cinematográficas, efectuadas por usuarios finalesmediante el recurso a las redes de intercambio de ficheros de iguala igual (p2p) ha sido defendida y contradicha en numerosas ocasio-nes en España.

Es evidente,más allá de toda duda, quecuando la copia realizada para uso privado se expone al uso, y en estecaso la reproducción, de terceros,

pierde su carácter de copia privada,pues incumple el requisito de que no

sea objeto de uso colectivo

Page 11: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

un derecho del propietario del soporte, ya que quiencompra tal soporte no adquiere derecho de propiedadalguno sobre la obra que contiene, como claramenteindica el artículo 3º del Texto Refundido de la Ley dePropiedad Intelectual, algo que, por cierto, dice, des-de 1888, el artículo 377 del Código Civil.

Es evidente, más allá de toda duda, que cuando lacopia realizada para uso privado se expone al uso, y eneste caso la reproducción, de terceros, pierde su carác-ter de copia privada, pues incumple el requisito de queno sea objeto de uso colectivo. Por ello, tal copia debecalificarse de ilegal, y a quien la ha confeccionado deinfractor de los derechos de propiedad intelectual.

Cuando el sistema de almacenamiento en el quese ha alojado dicha copia ilegal se abre a terceros a tra-vés de una red de comunicaciones, se está haciendoposible el acceso a las personas que emplean dicha reda las obras copias; sin que para ello haya sido necesa-rio entregar a cada una de dichas personas un ejem-plar del soporte de la obra. Conducta ésta que nues-tro sistema legal (artículo 20.1 del Texto Refundidode la Ley de Propiedad Intelectual), y los de más deciento ochenta países, califican de acto de comunica-ción pública, y, por tanto, también sujeto a la autori-zación de su titular, y no sujeto a límite alguno de usoprivado, pues la limitación o excepción del artículo31.1º sólo se refiere al copiado, y no a la comunica-ción pública. Por ello, la difusión al público de unaobra de creación sin autorización de su titular, el actoes ilegal.

En este preciso punto podemos concluir que elcopiado de música o películas cinematográficas con-tenidas en soportes (CDs o DVDs) y su posterior pues-ta a disposición de terceros a través de redes de inter-cambio de igual a igual, supone la comisión de dostipos de infracciones perfectamente identificadas ennuestro Texto Refundido de la Ley de PropiedadIntelectual.

La persona que a través de una red de intercambioaccede a la obra y es sorprendida puede pretender igno-rar todo lo anterior, y alegar en su defensa que ignoraba

la ilegalidad tanto de la copia como dela puesta a disposición del promotor detal cadena. A priori no hay razones parano respetar el principio de presunciónde inocencia, pero ésta no parece queconcurra en quien, a su vez, pone a dis-posición de terceros las obras que hacopiado, aunque dicha copia se hayahecho de las obras puestas a disposiciónpor otros. O en quien, sin pago alguno,obtiene copias de aquellas obras dereciente aparición en el mercado musi-cal o cinematográfico, y no precisamentede forma gratuita. Aunque tales copiassean para su exclusivo uso personal.

Uno de los argumentos más uti-lizados para excusar estas conductas, que, comovemos, inciden en la ilegalidad, es declarar que entales conductas no hay ánimo de lucro. Declaraciónque sólo quiere evitar que el problema se trasladeal ámbito penal. Sin pretender entrar en el análisisde lo que por ánimo de lucro entienden nuestrosTribunales, es preciso recordar que “ánimo de lucro”no es equivalente a buscar y obtener una gananciaeconómica directa para sí, sino que en Derecho essinónimo de cualquier provecho, beneficio, venta-ja o utilidad que se obtenga por el propio indivi-duo, incluido el ahorro de costes, o que éste consi-ga para un tercero, aún en el caso de que él mismono se beneficie en forma alguna.

Es más, tanto quienes ponen a disposición comoquienes copian en la redes de intercambio no sóloobtienen una ganancia (aunque sea en forma de nogasto), sino que causan un perjuicio a terceros, des-de los autores a los intérpretes, pasando por los pro-ductores. Y cuando en una conducta defraudadorade los derechos de propiedad intelectual concurrenánimo de lucro y perjuicio de tercero, nos estamosadentrando en un territorio verdaderamente peli-groso, como es el del Código Penal.

Bien es verdad que en Derecho, como en todas lasciencias sociales, y en las exactas desde Einstein, todo esrelativo, pero lo cierto es que pocas veces la letra de laLey es tan clara. Por ello, quien ponga a disposición fiche-ros conteniendo obras protegidas, aunque las copie parasu uso personal, debe ser consciente del riesgo que elloconlleva, en caso de ser descubierto.

dotN

etM

anía

<<

11

dnm.legal<<

...la difusión al público de una obra de creaciónsin autorización de su titular, el acto es ilegal

Page 12: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

veo que tus comienzos en la ciencia fue-ron en la Universidad Politécnica de Madrid. El añopasado, coincidí precisamente con la profesoraCarmen Costilla en unas conferencias que dimospara la Universidad de Santiago deCompostela, donde yo hablaba deLonghorn y ella de la Web semánti-ca. ¿La conoces? ¿y crees que la Websemántica, -como ella lo ve- es la Webinevitable dentro de pocos años?

Me parece buena idea y proba-blemente necesaria para garantizar lasupervivencia del World Wide Web. Elobjetivo es crear un modo eficientede representar los datos en el WorldWide Web como una base de datosconectada globalmente. De esa mane-ra, la información podría ser proce-sada fácilmente por máquinas en todoel mundo. Tim Berners-Lee, elinventor de WWW, URLs, HTTPy HTML, propuso el concepto de laWeb semántica y hay un equipo en elconsorcio W3C dedicado a mejorar,extender y estandarizar la Web.

Antes de pasar a temas más pró-ximos a tu trabajo, una cosa mássobre Internet: Si el objetivo es queel usuario estándar tenga cada vezmás ancho de banda, en un largo

viaje hacia Internet2, ¿cómo va cambiar nuestrasvidas cuando eso sea así? Tú misma, comentas queahora realizas una buena parte de tu trabajo encasa...

Entrevista a Nuria Oliver

Por Marino PosadasMVP Visual Developer C#Alhambra-Eidos www.elavefenix.net

<<

Nuria Oliver es investigadora en Microsoft Research en Estados Unidos.Previamenteestuvo en el mítico Media Lab del MIT (Massachusetts Institute of Technology). Su tra-bajo se basa fundamentalmente en la interacción de las máquinas con el ser huma-no a través de la percepción de éstas del mundo que les rodea.

Revisando tu currículo,

Marino Posadas esasesor técnico y

redactor dedotNetManía, MVP de

C# y formador deAlhambra-Eidos

Page 13: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Una consecuencia obvia es que estaremos conec-tados a Internet todo el tiempo, desde cualquier lugar:la oficina, casa, el teléfono móvil, etc… El mundo digi-tal y el mundo físico estarán más interconectados quenunca. Podremos trabajar desde cualquier lugar.Estaremos conectados no sólo a toda la informaciondel WWW, pero también a familiares y amigos; podre-mos ver, transmitir y recibir vídeo y audio en tiemporeal… hay tantas posibilidades… al mismo tiempo,creo que es muy importante para nuestra salud men-tal y física el saber y poder desconectar. El exceso deinformacion causa ansiedad y confusión.

Háblanos algo de tu experiencia en MIT(Massachusetts Institute of Technology). En un artículotuyo para El Heraldo de Aragón lo defines como cen-tro mítico... ¿Es cierto? ¿En MIT se ve el futuro antesque en ninguna otra parte? Y, ¿conoces a otros espa-ñoles que estén allí en labores de investigación? Te lopregunto, por un artículo tuyo: “El modelo educati-vo del Media Lab”.

El MIT es una de las mejores universidades delmundo –si no la mejor—para las ingenierías y la infor-mática. Tanto los estudiantes como los profesores deMIT son excepcionales. La vida en MIT es muy inten-sa, una experiencia única. Yo estuve investigandodurante cuatro años y medio en el Media Lab de MIT,que es un centro muy especial. Fue fundado porNicholas Negroponte en 1985 y la idea era crear uncentro de investigacion multi-disciplinar que innova-ra y, en cierto sentido, delineara el futuro en áreas tandiversas como la música, el arte digital, la educacion,la comunicación hombre-máquina, el cine, la infor-mática cuántica, etc… En ese sentido, el Media Labes único. En los últimos años parece haber sufrido uncierto declive y creo que ahora están reinventando cuáles el futuro papel del centro dentro de MIT y de lacomunidad científica. En cualquier caso, todavía serespira esa energía creativa que lo caracteriza y estoysegura de que seguirá innovando como hasta ahora.

Una característica importante del estilo de inves-tigación americano es la de asumir riesgos e intentarcosas que van en contra del status quo y que parecenestar destinadas al fracaso. Pienso que no se puedeinnovar sin arriesgarse. Es importante analizar los ries-gos y ser realista, pero también con cierto optimismo.

Tú ya tienes experiencia como investigadora enEspaña, y en EE.UU, dentro y fuera de la Academia.¿Cuál es mejor? ¿La empresa privada -Microsoft-, oun centro como MIT, rodeada de monstruos comoMarvin Minsky y otros?

El principal motivo por el que estoy en EEUU eslaboral: hasta ahora no he encontrado el modo depoder realizar mi trabajo en España con condicionessimilares a las que tengo en EEUU. Soy conscientede que el Gobierno actual esta proponiendo nuevasiniciativas para fomentar la investigacion en ciencia ytecnologia en España. Me encantaría poder regresar

a mi país y contribuir con mi trabajo a la mejora de lacalidad de vida de las personas. Pero de momento,pienso que donde mejor puedo realizar mi trabajo esaquí, en EEUU.

Con respecto a Academia versus empresa privada,hay aspectos similares y diferencias. El aspecto másimportante para mí, que son los proyectos de investi-gación en los que trabajo, es básicamente igual en unaempresa privada que en una universidad. En los labo-ratorios de investigacion de Microsoft tenemos totallibertad para trabajar en lo que queramos. Una granventaja es que no tenemos que solicitar grants parafinanciar los proyectos. Nunca he tenido ningún pro-blema para financiar ninguno de mis proyectos.También tenemos total libertad para publicar artícu-los en congresos y revistas científicas. MicrosoftResearch tiene una presencia muy fuerte en la comu-nidad científica. Otra ventaja es que no tenemos quedar clase. A mí me gusta dar clase, con lo que no meimportaría ese aspecto de la vida en la universidad,pero al mismo tiempo, las horas de clase son horas enlas que no estás investigando…Una diferencia impor-tante es que no trabajamos con estudiantes tanto comose trabaja en la universidad. Es quizás el aspecto másnegativo de trabajar en un laboratorio privado. Meencanta trabajar con estudiantes. Ahora mismo estoytrabajando con un estudiante de la UniversidadAutónoma de México y estoy disfrutando muchísimo.Normalmente tenemos estudiantes que vienen a tra-bajar con nosotros en el verano, durante unos tres

<<dnm.directo.entrevistas

Page 14: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

14

<<dnm.directo.entrevistas

meses. Excepcionalmente tenemos estudiantes duran-te el invierno, como yo ahora. En Microsoft Researchtambién podemos colaborar con universidades, darclases en la Universidad de Washington, etc…real-mente es un paraiso para la investigación. Finalmente,otro aspecto muy importante para mí es la flexibili-dad en el trabajo. Podemos trabajar desde casa, tenerhorario flexible, etc… Hoy en día, me parece funda-mental ofrecer opciones de flexibilidad en el trabajo.

Dentro de tus areas de interés científico, observola presencia constante de la búsqueda de patrones ymodelos matemáticos que describan el comportamientohumano. ¿Cuál te parece que va a ser el siguiente gransalto en la informática? ¿Ves un futuro (o no tan futu-ro) sistema operativo que se comunique con el usuariomediante voz? ¿Para cuándo podría estar lista una cosaasí? ¿Podría Blackcomb, previsto para 2011 llevar algoparecido? Esto viene por otro artículo tuyo en el queanticipas algo así: “GWindows: Towards RobustPerception-Based UI”

Hay muchas áreas de investigacion que podríanconstituir un gran salto en la informática: ordenado-res cuánticos, sistemas híbridos con componentes bio-lógicos, ciberorganismos, nanotecnología, y, porsupuesto, la inteligencia artificial y la percepción porordenador, que son mis áreas de investigacion. Dentrode mi campo, sí pienso que cada vez vamos a ver másordenadores con capacidad de percibir qué es lo quesucede a su alrededor, reconocer la situación y reac-cionar en consecuencia. Hoy en día ya hay, por ejem-plo, robots humanoides que pueden comunicarse conlas personas, tienen capacidad de visión y de habla (untanto limitadas, pero aún así existentes), pueden cami-nar, etc… Hay muchas áreas de nuestra vida cotidia-na que se verían muy afectadas (y espero que en sen-tido muy positivo) si pudiésemos comunicarnos conlos ordenadores de modo similar a como lo hacemoscon otras personas, si hubiese ordenadores en elambiente, en nuestra ropa, con capacidad de monito-rizar señales vitales, por ejemplo.

¿Cómo crees que van a cambiar las herramientasde desarrollo? ¿Qué puede ofrecer un futuro Visual

Studio con el que nos comuniquemos oralmente, porejemplo?

Pienso que las herramientas de desarrollo cam-biarán, porque cambiará la naturaleza de nuestrainteracción con los ordenadores. Hay muchas áre-as en las que el desarrollo de software se vería afec-tado: por ejemplo, si el ordenador tuviese acceso alestado emocional del programador, podría adaptarsu estilo de comunicacion, ofrecer diferentes estra-

tegias de ayuda, etc…Jim Gray me comentaba el pasado

verano que lo que hacía falta no era sólointeligencia en las máquinas, sino en lainformación misma. En la forma deacceder a ella. ¿Cuál es tu opinión al res-pecto?

Hoy en día estamos inundados porinformación, por datos que a veces sonútiles, y otras veces no son mas quespam, basura. Si no disponemos demodos inteligentes para acceder a lamisma, para discernir lo que es infor-mación de lo que no lo es, corremos elriesgo de que el sistema entero se vuel-

va inútil. Por lo tanto, es muy importante disponerde algoritmos inteligentes para acceder a la infor-mación que es relevante en cada momento. Esosalgoritmos estarán en algun tipo de ordenador ypor lo tanto la inteligencia de las máquinas se tra-ducirá en modos más inteligentes de acceder a lainformación.

Por último, y, a propósito de “Yo Robot”, ¿creesque en 2025, -pongamos- podrán existir robots delestilo de los que vemos en la película? No me refieroa Sony, sino a los de la generación anterior... ¿O esalgo todavía tan lejano como la ComputaciónCuántica?

Lamentablemente no he visto la película, porqueno tuvo buenas críticas, pero conozco el tema. Lapelícula sucede en Chicago en el año 2035 y, graciasal trabajo del Dr. Lanning, los robots son parte dela vida diaria. Para asegurar que los robots nuncadañen o desobezcan a los seres humanos, Lanninglos ha programado siguiendo ciertas leyes… hastaque aparece el modelo NS-5 y las cosas se compli-can… Hoy en día disponemos de electrodomésticosinteligentes, aspiradoras que aspiran solas (comoRoomba), coches plagados de sensores, perritos dejuguete que reconocen ciertos comandos, juegan conpelotas, etc... en cierto sentido, estamos rodeados derobots. También hay robots humanoides, como ASI-MO de Honda. Estamos dando los primeros pasosen el área, pero hay muchísimos centros de investi-gación, tanto a nivel universitario como industrial,trabajando en robótica y pienso que los robots –tan-to humanoides como no—estarán cada vez más inte-grados en la fibra de nuestra vida cotidiana.

Hay muchas áreas en las que el desarrollo de software se vería afectado: por ejemplo, si el ordenadortuviese acceso al estado emocional del programador,

podría adaptar su estilo de comunicacion, ofrecer diferentes estrategias de ayuda, etc…

Page 15: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

15

vamos a ver cómo generar hojas Excel de for-ma dinámica sin apenas consumir recursos del sistema.Para ello utilizaremos las siguientes tecnologías:

• XML (para los datos que queramos introduciren la hoja Excel).

• XMLSS/XSL: El formato XML de Excel (usa-remos XSL para construirnos una plantilla).

El proceso consiste en formatear los datos deentrada a XML, y aplicarles una plantilla XSLobteniendo así el fichero Excel que enviaremos alcliente. ¿Complicado? ¿Laborioso? .NETFramework y Office 2002 nos harán el 90 % deltrabajo, veamos cómo:

• XML: Si leemos de la base de datos utilizandoun dataset, podemos guardar los resultados enformato XML gracias a un método que estaclase nos ofrece.

• XMLSS/XSL: No tenemos que estudiarnos losentresijos del formato XML de Excel, pode-mos hacer directamente la plantilla con Officey a la hora de grabar decirle que lo haga en for-mato XMLSS. Para pasarlos a XSL sólo ten-dremos que hacer unos pequeños cambiossobre el fichero generado.

¡Manos a la obra!Para ver cómo funciona todo esto, vamos a cre-

ar un ejemplo sencillo; una hoja de trabajo que cal-cule el total de horas extras que hemos hecho enun periodo de tiempo (suponemos que trabajamos

de lunes a viernes y que la jornada laboral es de 8horas).

La hoja Excel de nuestro ejemplo tiene dos fór-mulas, una que calcula el número total de horas extrasque se han realizado en un día (muy complicada…“8 - total”), y otra que suma el total de todas las horasextras de ese periodo de tiempo. En la figura 1 sepuede observar cómo quedaría.

Para crearlo ejecutamos MS Excel, le decimosque queremos crear una nueva hoja, y añadimos lassiguientes celdas:

Generando hojas Excel conASP.NET

Braulio Díez

dnm.asp.net

Figura 1. Hoja Excel que vamos a crear

<< En este artículo

Reyes GarcíaHa sido consultora “todo

terreno”.Hoy día se dedica algratificante mundo de la

docencia.

Braulio Díezcolabora habitualmente condotNetManía. Es MCSD en

programación distribuida con Visual C++.

Trabaja como SolutionsDeveloper de Avanade.

Hoy en día las hojas Excel se han convertido en un estándar para representar informa-ción financiera, de control de stock, etc. Cuando hablamos de ASP.NET solemos tenerasociado el HTML como formato de representación de la información, otras alternati-vas nos hacen pensar en problemas de rendimiento, o herramientas con un coste ele-vado, ¿existe alguna forma sencilla de hacer esto con .NET?

Reyes García

A B C1 Fecha Horas Totales Extras2 2/07/200 10 =B2-8

Page 16: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

16

dnm.asp.net<<

Dejamos una fila en blanco y, a continuación, mos-tramos los totales en las celdas B4 y C4 (esta última,al igual que C2, es una fórmula):

La formula de la celda C4 no es más que unsumatorio de todos los valores desde la columnaC2 hasta la actual (la de total) menos dos; de estaforma cuando añadamos más elementos nos cal-culará los datos de manera satisfactoria.

Ya tenemos la hoja prácticamente montada,vamos a darle algo de formato para que tenga mejorpinta: seleccionamos desde la celda A1 hasta la C1,y a través de las opciones de menú “formato” y“celdas”, las ponemos con fuente negrita y colorde fondo gris.

Guardamos la hoja Excel, pero seleccionamosel formato “XML Spread Sheet” (en español “Hojade cálculo XML”), y el nombre del fichero lo pone-mos como ”fichero_original.xls” (entre comillasy con la extensión .XLS, para que lo grabe sinextensión .XML). Si hacemos doble clic sobre elfichero, veremos como Excel lo abre sin proble-mas.

Ya tenemos un fichero Excel en formato XML,ahora vamos a transformarlo en una plantilla XSLque nos sirva para cargar datos de forma dinámica.Copiamos el fichero fichero_original.xls y le pone-mos el nombre plantilla.xls. En los fuentes 1a, 1b,1c y 1d podemos ver una comparativa entre el fiche-ro original y el que modificaremos, las partes que seinsertan están marcadas en amarillo, y las que debe-mos eliminar en rojo. Abrimos plantilla.xls concualquier editor de texto (por ejemplo Notepad) yhacemos los siguientes cambios:

• Añadimos las etiquetas xsl:template y xsl:sty-lesheet para definir el fichero como una plan-tilla XSL; ponemos como raíz TestDataSet queserá el nombre del DataSet del que extraere-mos los datos más tarde (fuente 1a).

• Añadimos al final del fichero las etiquetas decierre de las dos etiquetas anteriores <xsl:tem-plate> y </xsl:stylesheet> (fuente 1b).

• En la entrada <table> quitamos el parámetroque indica cuántas filas hay en la hoja(ss:ExpandedRowCount), ya que el número de filasvarará en función de los datos de entrada (fuen-te 1c).

• Para introducir los campos añadimos una sen-tencia foreach y cambiamos los datos de la segun-da fila por lo que vamos a leer de la base de datos,que en nuestro caso son: fecha en la que se tra-bajo y número de horas (fuente 1d).

<?xml version="1.0"?>

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"

<xsl:stylesheet version="1.0"xmlns="urn:schemas-microsoft-com:office:spreadsheet"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:msxsl="urn:schemas-microsoft-com:xslt"xmlns:user="urn:my-scripts"xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:x="urn:schemas-microsoft-com:office:excel"xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" >

<xsl:template match="TestDataSet">

<?xml version="1.0"?><Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"

Fuente 1a. Datos para definir la plantilla XSL.

B C4 Total Extras =SUM(INDIRECT("C$2:C"&ROW()-2))

</Worksheet></Workbook>

</xsl:template></xsl:stylesheet>

</Worksheet></Workbook>

Fuente 1b. Etiquetas de cierre

<Worksheet ss:Name="Sheet1"><Table ss:ExpandedColumnCount="6"

x:FullColumns="1" x:FullRows="1">

<Worksheet ss:Name="Sheet1"><Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="4"

x:FullColumns="1" x:FullRows="1">

Fuente 1c. Quitamos ss:ExpandedRowCount, número de filas variable

ss:ExpandedRowCount="4"

<xsl:for-each select=”t_horas”><Row>

<Cell ss:StyleID=”s21”><Data ss:Type=”String”>

<xsl:value-of select=”Fecha”/></Data>

</Cell><Cell>

<Data ss:Type=”Number”><xsl:value-of select=”Horas”/>

</Data></Cell><Cell ss:Formula=”=RC[-1]-8”><Data ss:Type=”Number”>2</Data></Cell>

</Row></xsl:for-each></xsl:for-each>

<Row><Cell ss:StyleID=”s21”>

<Data ss:Type=”DateTime”>2004-07-02T00:00:00.000</Data></Cell><Cell><Data ss:Type=”Number”>10</Data></Cell><Cell ss:Formula=”=RC[-1]-8”><Data ss:Type=”Number”>2</Data></Cell>

</Row>

Fuente 1d. foreach y nombre de campos.

<xsl:for-each select=”t_horas”>

<xsl:value-of select=”Fecha”/>

<xsl:value-of select=”Horas”/>

Page 17: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

¡Ya tenemos lista nuestra plantilla XSL!, sólo nosqueda crear una página ASP.NET que lea los datos deuna base de datos, los transforme a una hoja Excel yla envíe al cliente.

Creamos una aplicación Web que llamaremosExcelSimple y en la página por defecto le añadimosuna etiqueta y un botón. A éste lo llamaremosbtnExportExcel y nos suscribimos a su evento OnClick.

En dicho evento, cargaremos los datos de una basede datos, le aplicaremos la plantilla XSL que hemoscreado y le enviaremos stream de memoria con el fiche-ro Excel a nuestro cliente.

Para mantener el ejemplo lo más sencillo y fácil deinstalar posible, he creado el DataSet que obtendríamosde leer de base de datos en tiempo de ejecución (ni quédecir tiene que en las aplicaciones reales debemos leerde una base de datos de verdad), ver fuente 2.

El código que aplica la plantilla Excel a cualquierDataSet, lo he encapsulado en una clase para que pue-da ser reutilizado fácilmente en otros proyectos. Éstacontiene dos métodos: SendExcelStreamToClient ySendExcelStreamToFile.

• SendExcelStreamToClient: se le pasa como pará-metro el DataSet y el objeto Response. Transformael primero a una hoja Excel y usa el segundo paraenviarla al navegador del cliente.

• SendExcelStreamToFile: se le pasa como paráme-tro el DataSet y la ruta completa de un fichero.Transforma el primero a una hoja Excel y usa elsegundo para guardarlo en la ruta especificada (porsi se quiere utilizar en una aplicación desktop).

En el fuente 3 se puede ver el código del primermétodo, y en el fuente 4 cómo se usa la clase y su méto-do al pulsar el botón de “Exportar a Excel”.

dotN

etM

anía

<<

17

dnm.asp.net<<

public DataSet CreateTestDataset(){// Ojo con el nombre, tenemos que usar el// mismo en el XSL de ExcelDataSet testData = new DataSet("TestDataSet");

// Lo mismo aquí con el nombreDataTable dtHoras = new DataTable("t_horas");

// Creamos las columnas de nuestra "tabla"DataColumn dcHoras;

dcHoras = new DataColumn();dcHoras.ColumnName = "Fecha";dcHoras.DataType = Type.GetType("System.String");dtHoras.Columns.Add(dcHoras);

dcHoras = new DataColumn();dcHoras.ColumnName = "Horas";dcHoras.DataType = Type.GetType("System.Int32"); dtHoras.Columns.Add(dcHoras);

// Le añadimos unos cuantos datosDataRow curr = dtHoras.NewRow();curr["Fecha"] = "01/06/2004";curr["Horas"] = 10;dtHoras.Rows.Add(curr);

curr = dtHoras.NewRow();curr["Fecha"] = "02/06/2004";curr["Horas"] = 8;dtHoras.Rows.Add(curr);

curr = dtHoras.NewRow();curr["Fecha"] = "02/06/2004";curr["Horas"] = 8;dtHoras.Rows.Add(curr);

curr = dtHoras.NewRow();curr["Fecha"] = "03/06/2004";curr["Horas"] = 11;dtHoras.Rows.Add(curr);

curr = dtHoras.NewRow();curr["Fecha"] = "04/06/2004";curr["Horas"] = 12;dtHoras.Rows.Add(curr);

testData.Tables.Add(dtHoras);return testData;}

Fuente 2. Creando nuestros datos de test

/// <summary>/// Carga la plantilla, la aplica contra el fichero XML,/// tomamos el stream generado, y lo enviamos al cliente/// como un fichero Excel/// </summary>/// <param name=”Ds”></param>/// <param name=”response”></param>/// <returns></returns>public void SendExcelStreamToClient( DataSet Ds,

System.Web.HttpResponse response){

try{

XslTransform xslTrans = new XslTransform();

// Cargamos nuestro XML que genera el DataSetXmlDataDocument doc = new XmlDataDocument(Ds);

// Cargamos la plantilla de Excel que hemos creadoxslTrans.Load(_pathToExcelXslTemplate);

// Creamos un XPathNavigator que usaremos en la transformaciónXPathNavigator nav = doc.CreateNavigator();

// Transformamos y enviamos los datosresponse.AddHeader( “content-disposition”,

“attachment; filename=Testeo.xls”);response.ContentType = “application/vnd.ms-excel”;response.Charset = string.Empty;xslTrans.Transform(nav, null, response.OutputStream, null);

response.Flush();response.Close();

}catch(System.Exception Ex) {

// Sólo relanzamos la excepción, implementar a gusto// del consumidor :-)throw Ex;

}}

Fuente 3. Este es el método que coge el DataSet, le aplica la plantilla XSL quehemos creado y envía al cliente la nueva hoja generada

Page 18: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Antes de arrancar el ejemplo tenemos que ase-gurarnos de que la plantilla XSL que hemos crea-do está en la ruta de la aplicación (en mi caso esC:\Inetpub\wwwroot\ExcelSimple).

Ya está todo listo, ejecutamos el ejemplo, pulsa-mos el botón y… ¡voila!, nos aparece un mensaje deInternet Explorer, que nos pregunta si queremos abrirel fichero Excel o guardarlo a disco..., lo abrimos yvemos nuestro fichero Excel con los datos del DataSetque le habíamos introducido. En la figura 2 podemosver la página ASP de nuestro ejemplo, y en la figura3 la hoja Excel con los datos que hemos cargado.

dotN

etM

anía

<<

18

dnm.asp.net<<

private void btnExportExcel_Click(object sender,System.EventArgs e)

{// Tomamos como path de la plantilla excel // el de la aplicación webstring TemplatePath =

System.AppDomain.CurrentDomain.BaseDirectory+“plantilla.xls”;

try{

MsExcelTransformer msExcelTransformer = newMsExcelTransformer(TemplatePath);

msExcelTransformer.SendExcelStreamToClient(CreateTestDataset(), Response);

}catch(System.Exception Ex) {

Response.Write(“<p>”);Response.Write(“<i>El proceso ha fallado, “ +

¿ existe este fichero en tu disco duro ? </i>” + TemplatePath);

Response.Write(“<BR>”);Response.Write(“<b>Información Extendida:</b> “ +

Ex.Message);Response.Write(“/p”);

}}

Fuente 4. El código que ejecutamos cuando se pulsa el bóton de nuestra página.

Figura 2. La página ASP de nuestro ejemplo

Figura 3. La hoja Excel que se carga en el cliente

Otras opciones

Hay más formas de generar ficheros Excel, dependiendo de lasnecesidades se puede optar por las que siguen.

AutomationSi lo que se desarrolla es una aplicación desktop, puedeusar Automation, esto es, arrancar Excel como un objetoCOM EXE. La ventaja es que se puede hacer todo loque se quiera con Excel; las desventajas son su lentitud,los recursos que consume, los cambios entre versionesde Office y los problemas que da con algunas herramientasde antivirus. Para más información, un buen punto departida está en la MSDN, referencia Q316126, “HOWTO: Use Visual C# .NET to Automate a RunningInstance of an Office Program”.

Librerías gratuitas específicasUna que tiene muy buena pinta es la desarrollada porCarlos Aguilar Mares (http://www.carlosag.net/Tools/ExcelXmlWriter).

Componentes comercialesSi lo que se necesita es generar archivos binarios de Excel,se puede optar por librerías como la de Soft Artisans( h t t p : / / w w w . a s p . n e t / C o n t r o l G a l l e r y /ControlDetail.aspx?Control=1002&tabindex=2 ), o comola de Aspose (http://www.aspose.com/Products/Aspose.Excel).

CSV (Comma Separated Values)Si es necesario dar soporte a versiones muy antiguas deExcel, esto puede valer. Consiste en importar de un fiche-ro de texto que separa cada celda por comas y cada filapor un retorno de carro, puede encontrar más informa-ción en: http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm

Page 19: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Nota: Depende de la versión de IE que tenga, leaparecerá dos veces el mensaje de “Abrir / Guardar”,esto es un fallo conocido del navegador y hay parchesque lo arreglan.

Este ejemplo está disponible en la Web de la revis-ta, en www.dotnetmania.com.

LimitacionesNo todo el monte es orégano… si bien esta for-

ma de generar Excel es limpia y consume pocos recur-sos, tiene varias limitaciones:

• El cliente necesita tener instalado Office 2002 osuperior para que pueda leer este formato.

• No se pueden incluir imágenes, ni objetosActiveX en la hoja (al menos en Microsoft Office2002).

Conclusión

Si no es necesario soportar versiones anteriores ala 2002 de Office, el formato XML de Excel (XSSL)combinado con las tecnologías XML/XSL se presen-ta como un gran aliado a la hora de generar hojas decálculo de forma dinámica.

Aquí tiene unos enlaces en los que podrá encon-trar más información sobre estás tecnologías (los queno tienen link, son de la MSDN, http://msdn.micro-soft.com):

• “Q285891. How to use Visual Basic or ASP to cre-ate an XML Spreadsheet for Excel 2002”: Otroejemplo sobre cómo crear XMLSS.

• “XML Spreadsheet Reference2”: Descripcióncompleta del formato XML de excel (XMLSS).

• Un tutorial de XSLT: http://www.w3schools.com/xsl

dotN

etM

anía

<<

19

dnm.asp.net<<

Si no es necesario soportar versiones anteriores a la 2002 de Office, el formatoXML de Excel (XSSL) combinado con las tecnologías XML/XSL se presenta

como un gran aliado a la hora de generar hojas de cálculo de forma dinámica

Leyendo y modificando hojas Excel

Además de generar hojas Excel, hay veces en las que noses necesario poder leerlas y/o modificarlas, en este caso ADO.net nos será de gran ayuda. Cubrir este tema a fondo quedafuera del alcance de este artículo, no obstante, vamos a verun pequeño ejemplo que lea nuestra “hoja de horas” y la vuel-que por pantalla:

Puede encontrar más información en los siguientes links:

• MSDN: “How To Use ADO.NET to Retrieve andModify Records in an Excel Workbook With Visual Basic.NET” [kb316934]

• “Import from Excel using ADO.NET” (ejemplo simpley útil): http://www.dotnetspider.com/technology/kbpa-ges/1080.aspx

trucos.trucos.trucos

static void Main(string[] args){string strConnectionString =string.Empty;// OJO ! Cuidado con el Path al fichero Excel, si nos equivocamos nos da// un error que despista un poco... "Could not find installable ISAM"strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"

+ @"Data Source=C:\ejemplo.xls;"+ "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";

OleDbConnection cn =new OleDbConnection (strConnectionString);cn.Open();OleDbCommand cmdSelect = new OleDbCommand (@"SELECT * FROM [Sheet1$]", cn);OleDbDataReader reader = cmdSelect.ExecuteReader(CommandBehavior.CloseConnection);

while (reader.Read()){for(int i =0; i < reader.FieldCount; i++)

Console.Write(" " + reader[i].ToString());Console.WriteLine();

}reader.Close();

}

Page 20: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Bueno, literalmente significa Web ServicesEnhancements, por lo que simplemente por el nom-bre vemos que tiene mucho que ver con ServiciosWeb XML y con aspectos avanzados de éstos. Sinembargo, antes de meternos de lleno en qué nos pro-porciona WSE, vamos a remontarnos un poco a losorígenes de los servicios Web XML y ver las razo-nes de por qué surgen estos nuevos servicios avan-zados para ellos.

Los servicios Web XML surgen debido a necesi-dades de interoperabilidad entre diferentes platafor-mas y aplicaciones (antes era un infierno comunicaraplicaciones, por ejemplo COM, con aplicacionesCORBA, JAVA, etc.), marcándose como objetivo elbasarse en estándares (como XML, SOAP, HTTP,etc.). Es muy importante que las comunicaciones entreaplicaciones (servicios) sean independientes de la pla-taforma (.NET, Java, etc.), del lenguaje, de los obje-tos e incluso de los mecanismos de llamada y proto-colos de transporte. Estos objetivos son los que con-forman SOA (Service Oriented Architecture).

SOA “ve el mundo” de una forma distinta: todaslas aplicaciones deben ser servicios autónomos don-de se definan fronteras explícitas y se asuma la hete-rogeneidad y colaboren plataformas dispares (porejemplo, comunicar aplicaciones .NET con aplica-ciones Java). Para esto, en lo que ya es la “imple-mentación de SOA en el mundo real” es imprescin-dible hablar un mismo idioma, es decir, compartir elmismo formato de datos (XML) y los mismos esque-mas XML (esquema de mensajes de comunicaciónSOAP). SOA (Service Oriented Architecture), comoalgo lógico o “filosofía”, podía haberse implementa-do con cualquier mecanismo “a inventar”. En estecaso la implementación de SOA, hoy por hoy, se ha

basado en los servicios Web XML implementadoscon cualquier tecnología (.NET, Java, etc.).

Los servicios Web XML básicos (y ya centrán-donos en plataforma Microsoft) nacen inicialmen-te como una tecnología básica (protocolo y defini-ciones de mensajes SOAP, implementados conSOAP Toolkit para lenguajes compatibles conCOM como VB 6.0, etc.), diseñada ésta y sus están-dares de forma abierta (especificaciones teóricas deservicios Web definidas por diferentes organiza-ciones como MS, IBM, Sun, etc.) para que fueraevolucionando en el futuro con otras plataformasy lenguajes (en este caso de Microsoft), es decir,.NET Framework.

Efectivamente, cuando apareció .NET (.NET 1.0y Visual Studio .NET), esta nueva plataforma nosproporcionaba una serie de clases .NET y un tiponuevo de proyecto de Visual Studio para desarrollarservicios Web XML de una forma extremadamentefácil (basándonos en ASP.NET y atributos). Comocualquier desarrollador en .NET habrá podido com-

César de la Torre

¿Qué es Microsoft WSE?

Microsoft WSE es un nuevo módulo de componentes .NET que permite extender elmarco de trabajo de .NET Framework 1.1 para poder desarrollar servicios Web XMLcon características avanzadas.WSE es algo que, sin embargo, al no tenerlo disponibledirectamente con Visual Studio 2003 no es muy conocido por el momento, pero si sequiere desarrollar un servicio Web XML complejo,hoy en día, la única opción es basar-se en WSE 2.0.La intención de este artículo es simplemente dar una visión de alto nivelde qué es WSE y cómo se integra mediante SOAP con .NET 1.1 y Visual Studio 2003.

<< ¿Qué es WSE?

César de la TorreEs Microsoft MVP en

XML-Web-Services,MCSE yMCT.Profesionalmente es

Arquitecto de Software y SocioCofundador de RenacimientoSistemas, empresa consultora

Microsoft GOLD CertifiedPartner

SOA “ve el mundo” de una forma distinta: todas las aplicaciones debenser servicios autónomos donde se

definan fronteras explícitas y se asumala heterogeneidad y colaboren

plataformas dispares

Especializados en tecnología Microsoft desde 1995 • www.renacimiento.com

Page 21: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

probar, desarrollar un servicio Web XML y consu-mirlo desde una aplicación cliente remota (ya seaWinForm o ASP.NET) es algo sumamente sencillo yes la forma recomendada de realizar aplicaciones dis-tribuidas en tecnología Microsoft para sustituir el anti-guo esquema (componentes COM y DCOM comoprotocolo de invocaciones remotas).

Por supuesto, en .NET, además de los servicios WebXML podemos hacer uso de .NET Remoting, pero esto,a pesar de que actualmente ofrece algunas ventajas (mayorrendimiento, posibilidad de singleton, diferentes tipos deserialización, etc.), Microsoft lo desaconseja actualmen-te en la medida de lo posible, porque primero, .NETRemoting no es interoperable con otras tecnologías(requiere .NET en ambos extremos) y segundo .NETRemoting probablemente se descontinúe con la apari-ción de Indigo y Windows Longhorn (aunque esta últi-ma afirmación de descontinuación de .NET Remotingtodavía no es algo completamente oficial). Así pues, elcaso es que .NET Remoting lo dejamos a un lado en esteartículo porque tiene poco que ver con WSE, que esnuestro objetivo.

Entonces, centrándonos en los servicios WebXML básicos proporcionados tanto .NET 1.0 conVisual Studio .NET como .NET 1.1 con VisualStudio .NET 2003, lo que se nos ofrecía son lassiguientes características:

• Comunicaciones entre aplicaciones medianteestándares de Internet (HTTP).

• SOAP como formato de mensajes de comunicación.• WSDL como definición y descripción de los ser-

vicios (aplicaciones WebServices).• UDDI como localizador de servicios Web.• Al implementar los servicios Web XML con

ASP.NET (Web-Methods ASMX) tenemos tam-bién acceso a toda la funcionalidad de ASP.NET(sesiones, seguridad, extensiones, etc.).

• Los servicios Web XML de .NET 1.0 y 1.1 con-siguen una comunicación básica:- Proporcionan un intercambio básico de men-

sajes XML.

- Permiten la interconexión entre sistemas here-togéneos.

- La compartición de esquemas permiten mayo-res abstracciones.

Pero, la mayoría de las aplicaciones distribuidascorporativas o comerciales necesitan más…

Se necesitan aspectos más avanzados (no soporta-dos por los servicios Web básicos en .NET 1.0 y 1.1)como:

- Modelo de seguridad orientado a mensajes(cifrado, firma, etc.).

- Mensajería estable y confiable.- Soporte de transacciones entre diferentes ser-

vicios Web.- Mecanismos de direccionamiento y ruteo de

mensajes SOAP.- Mensajería asíncrona.- Metadatos para “políticas” de servicios Web.- Soporte para datos binarios.

La teoría:Especificaciones estándar (WS-*)

Para definir todas estas necesidades avanzadas, dife-rentes empresas (Microsoft, IBM, HP, Fujitsu, BEA,VeriSign, SUN, Oracle, CA, Nokia, CommerceOne,Documentum, TIBCO, etc.) han estado y continúandefiniendo unas especificaciones teóricas que confor-men cómo deben funcionar los aspectos extendidos delos servicios Web XML.

A todas estas especificaciones teóricas se las cono-ce como las especificaciones WS-*.

Si alguien quiere conocer en detalle estas especi-ficaciones, lo puede estudiar en: http://www.oasis-open.org.

El siguiente esquema muestra a alto nivel las dife-rentes funcionalidades que trata de resolver WS-*.

dotN

etM

anía

<<

21Especializados en tecnología Microsoft desde 1995 • www.renacimiento.com

dnm.comunicaciones

Los servicios Web necesitan aspectosmás avanzados como cifrado, firma,

mensajería asíncrona, enrutamiento demensajes SOAP, etc.

Figura 1.

Page 22: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

22

dnm.comunicaciones<<

Especializados en tecnología Microsoft desde 1995 • www.renacimiento.com

Todos los módulos centrales (seguridad, mensa-jería confiable, transacciones y metadatos) son pre-cisamente las funcionalidades de las que carecen lossevicios Web XML básicos y lo que trata de definirWS-*.

Las especificaciones WS-* están así mismo for-madas por subconjuntos de especificaciones:

• WS-Security• WS-Messaging• WS-Transaction• WS-Reliability• WS-Metadata

Éstos a su vez se vuelven a dividir en otros sub-conjuntos de especificaciones aún más definidas, comomuestra el siguiente cuadro: Como iréis viendo ya, las especificaciones WS-*

son prácticamente todo un mundo; no es algo peque-ño y limitado que simplemente extienda un poco alos servicios Web XML. Además, son especificacio-nes todavía en evolución y no cerradas definitiva-mente.

Bien, hasta ahora solamente hemos hablado deespecificaciones, teoría, pero para que la teoría fun-cione en el mundo real (desarrollo de servicios WebXML) hacen falta implementaciones de dichas teo-rías y especificaciones. Cada fabricante podrá cre-ar su propia implementación de WS-*, pero loimportante es que cumpliendo la teoría e interfacesde WS-*, todas las implementaciones de WS-*debe-rían ser compatibles unas con otras.

¡Es aquí donde aparece Microsoft WSE! WSE(Web Services Enhancements) es la implementaciónactual (de Microsoft) de las especificaciones WS-*(por ahora, en la versión 2.0 de WSE solamente departe de las especificaciones). Me parece muy impor-tante recalcar que WSE es realmente una imple-mentación temporal y en evolución hasta queMicrosoft ofrezca su plataforma completa que debe-ría abarcar la totalidad de WS-*. Esa futura plata-forma que abarcará WS-* y muchos más aspectos decomunicaciones es Indigo (parte de la siguiente ver-sión de Windows Longhorn). Sin embargo, hasta quedispongamos de Indigo, tenemos que volver al pre-sente y a lo que podemos utilizar ahora para desa-rrollar servicios Web avanzados, es decir, WSE.

Por otro lado, que nadie se asuste. El hecho deque WSE esté en evolución no significa que sea unabeta. Es una plataforma de la que van saliendo dife-

WS-* son las especificaciones y están-dares, no las implementaciones

Especificaciones WS-*

>> Messaging• WS-Addressing• WS-Eventing • MTOM (Attachments)

>> Reliability• WS-ReliableMessaging

>> Security• WS-Security• WS-Trust• WS-SecureConversation• WS-Federation

>> Messaging• WS-Coordination• WS-AtomicTransaction • WS-BusinessActivity

>> Security• WS-Policy• WS-PolicyAssertions• WS-PolicyAttachment• WS-SecurityPolicy• WS-Discovery• WS-MetadataExchange

Tabla 1.

WSE realmente tiene ya un largo camino, pero debido aque su nacimiento está paralelo a la evolución constante delas especificaciones WS-*,WSE ha ido también cambiando ycreciendo.Al principio solamente teníamos algunas especi-ficaciones implementadas y cada vez vamos teniendo más.Cuando lleguemos a Indigo, deberíamos de tener la mayo-ría. La cronología es la siguiente:

WSE 1.0 Diciembre de 2002WSE 1.0 + SP1 Marzo de 2003WSE 2.0 Mayode 2004WSE 2.0 + SP1 Julio de 2004WSE 2.0 + SP2 Diciembre de 2004WSE 2.0 + SP3 Febrero de 2005 WSE 3.0 ? de 2005 (única versión de

WSE que MS promete seráinteroperable con Indigo)

Indigo ? de 2006 ?

Cronología y futuro de WSE

<<

Page 23: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

rentes versiones (actualmente estamosen la versión WSE 2.0 SP3), pero todasellas están soportadas, es decir, son ver-siones release con soporte por el depar-tamento de soporte técnico deMicrosoft, por lo tanto, WSE es per-fectamente apto para desarrollar pro-yectos y ponerlos en un entorno de pro-ducción.

Pero vuelvo a destacar que, al estaren evolución WSE, es posible que deuna versión a otra no tengamos compa-tibilidad hacia atrás en los interfaces ydefiniciones de clases de WSE.

¿Dónde estamos?Para resumir y tener una visión glo-

bal, repasemos la tabla 2.

Bien, entonces estamos actual-mente en un punto en que todavía fal-ta bastante hasta que dispongamos deIndigo, pero queremos desarrollar ser-vicios Web XML con aspectos avan-zados. Para eso tenemos que extender

el marco de trabajo de los serviciosWeb básicos de .NET (ASMX) conWSE.

Bueno, y ¿como se hace esto?. Puesprecisamente mediante SOAP, el cual

da la “casualidad” que en sus cabecerasestá preparado para añadir extensiones(¿casualidad?, no, SOAP se definió pre-cisamente con “puertas abiertas” aampliaciones futuras).

Soap Extensión FrameworkLo que voy a contar ahora no es algo

que necesitemos hacer cada vez quevayamos a desarrollar con WSE, al con-trario, es explicar como Microsoft ha“enganchado” WSE con la implemen-tación actual de servicios Web XML(ASMX).

ASMX proporciona un frameworkpara la extensibilidad. Podemos desa-rrollar una clase nuestra que será invo-cada antes y después del procesamien-to de cada mensaje SOAP. Estas clasestienen que heredar de la claseSoapExtension (clase de .NETFramework 1.1) e implementar los

métodos de interfaces necesarios(ProcessMessage, etc.), con lo que con-seguimos implementar un filtro propiodentro del procesamiento de mensajesSOAP (ver figura 2).

En estos filtros o extensiones desa-rrollados por nosotros podríamos imple-mentar lo que quisiéramos, como porejemplo un log de mensajes SOAP reci-bidos y enviados, o un mecanismo deseguridad propio donde hiciéramos com-probaciones a nivel de mensajes, etc.

Bueno, pues ¡eso es precisamentelo que hace WSE basándose enSoapExtension!, pero en este caso, enlugar de inventarse los mecanismos yfiltros (como haríamos nosotros) WSEsigue al pie de la letra las especificacio-nes estándar marcadas por WS-*.

WSE necesita lo siguiente:• Escribir cabeceras en los mensajes

SOAP de salida y leer de los men-sajes de entrada.

• Transformar el bodyde los mensajes.

Así pues, como hemos dicho, imple-menta estas acciones mediante filtrosSOAP (SoapExtension).

dotN

etM

anía

<<

23

dnm.comunicaciones<<

Especializados en tecnología Microsoft desde 1995 • www.renacimiento.com

Plataformas ServiciosWeb .NET

>> ASMX (parte de ASP.NET)es la plataforma actual deWS en .NET

• Soporta funciones básicaspara servicios sencillos.

• No implementa las espe-cificaciones WS-*.

>> WSE 2.0 es una extensiónde la plataforma actual

• Puede utilizarse paraextender el comporta-miento de ASMX (comoSecurity).

• Puede utilizarse de formaseparada sin ASMX(como Messaging).

• Implementa algunas de lasespecificaciones WS-*.

>> Indigo es la siguiente gene-ración de plataforma deWeb Services

• Proporcionará una solu-ción completa WS-*.

Tabla 2.

Figura 2. Funcionamiento de filtros propios basados en SoapExtension

Figura 3.

Page 24: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Siguiendo el mismo esquema, WSEimplementa un filtro por casi cadaaspecto de WS-* que habilita, comopolíticas, seguridad a nivel de mensajes,trazas, lógica de Addressing en el filtrode Referal, etc.

En la figura 3 se muestra el funcio-namiento de dichos filtros implemen-tados por WSE.

Donde se configura dicho enlaceen el servicio Web (servidor) entre laSoapExtension y los assemblies (lasDLL) de WSE (los assemblies que real-mente implementan dichos filtros enel Web Service) es en la sección<soapExtensionTypes> del web.config,donde debe aparecer unas líneas simi-lares a las del fuente 1.

La comunicación entre los filtros yel código de nuestro servicio Web XMLserá por supuesto mediante la claseSoapContext.

Desarrollando con WSEBásicamente hay dos formas de desa-

rrollar servicios Web XML con WSE:1.- Extendiendo ASMX (servicios

Web XML y HTTP): Haciendouso del framework .ASMX y exten-diéndolo mediante el mecanismoque hemos visto antes (basándo-nos en la extensibilidad de SOAPy la clase SoapExtension). Ejemplosde este tipo de WS sería un servi-

cio Web XML .ASMX (conHTTP) donde implementásemoscifrado de datos y firma electróni-ca mediante el módulo de Securityde WSE.

2.- La segunda forma de desarrollarservicios Web XML es sin basar-

nos en ASMX (sin extender los ser-vicios Web de ASP.NET 1.1) y sinusar siquiera HTTP. Realmente,el desarrollo de un servicio Webimplica solamente el basarnos enSOAP y por lo tanto también enXML como formato de datos, perono es obligatorio basarse enHTTP como protocolo. Teóri-camente, el protocolo a utilizar porun servicio Web XML debería sertransparente (en .NET 1.1 no esasí, solamente nos podemos basaren HTTP), y en WSE empieza averse esta independencia del pro-tocolo. De hecho, utilizandoMessaging de WSE, podemos desa-

dotN

etM

anía

<<

24

dnm.comunicaciones<<

Especializados en tecnología Microsoft desde 1995 • www.renacimiento.com

<webServices><soapExtensionTypes><add type="Microsoft.Web.Services2.WebServicesExtension, Microsoft.Web.Services2,

Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0" />

</soapExtensionTypes></webServices>

Fuente 1

Indigo es una plataforma de componentes que proporcionará unainfraestructura de comunicaciones que habilitará a aplicaciones distri-buidas o componentes el mandar y recibir datos mediante un sistemade mensajería unificado. La incorporación de Indigo permitirá asegu-rar el flujo de mensajes transaccionales, seguros y confiables entre dife-rentes aplicaciones o servicios que empleen los mismos protocolosestándares compartidos.

Indigo será el futuro y evolución de las siguientes tecnologías actua-les: servicios Web XML,WSE, .NET Remoting,ASMX, System.Messaging,y .NET Enterprise Services (transacciones distribuidas, etc.), pero agluti-nando las funcionalidades de todo lo anterior y muchas otras nuevas enuna única tecnología unificada.

Indigo unificará y ofrecerá lo siguiente:• Amplio rango de transportes, incluyendo HTTP,TCP, UDP, IPC y

abierto a otros protocolos asíncronos como SMTP, etc.• Mecanismos de seguridad como claves públicas y simétricas y cer-

tificados.• Topologías, como punto-a-punto y extremo-a-extremo mediante

intermediarios, peer-to-peer y publicación-suscripción.

Debido a que la interoperabilidad es un objetivo importante, Indigotiene un gran compromiso con XML, SOAP y todas las especificacionesemergentes de servicios Web XML avanzados (WS-*) para proporcionarseguridad, confiabilidad y transacciones a aplicaciones basadas en SOAP.

Como parte de Longhorn,Indigo estará disponible para cualquier apli-cación basada en este sistema operativo. Sin embargo, Microsoft afirmaque también Indigo (en su versión definitiva) estará disponible como uninstalable separado para poder instalarlo sobre Windows XP y WindowsServer 2003, si bien algunas funcionalidades solamente estarán disponi-bles en Longhorn y en la siguiente versión de Windows Server.Actualmentetambién se puede bajar una versión beta 1 RC de Indigo desdehttp://msdn.microsoft.com/Longhorn/understanding/pillars/Indigo.

Sobre Indigo

WSE extiende los serviciosWeb con nuevos filtros gracias a SoapExtension

Page 25: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

rrollar un servicio Web XML que utilice comoprotocolo simplemente TCP basándonos en elpuerto TCP que nosotros queramos y se comu-nique con otro servicio Web de una forma simi-lar a aplicaciones peer-to-peer. Otro ejemplo deprotocolo a emplear (todavía no disponibledirectamente en WSE) sería SMTP, un proto-colo ideal para servicios Web asíncronos.También podemos utilizar en WSE un proto-colo InProcess para comunicaciones dentro delmismo proceso.Simplemente resaltar que este nuevo tipo de

servicios Web XML se desarrollan en nuestros pro-pios procesos (por ejemplo, un servicio Windows)y no necesitan para nada de ASP.NET ni siquierade IIS.

Vamos a centrarnos en el primer caso, que es elmás inmediato y similar a los servicios Web XMLactuales (el segundo caso requeriría un artículo com-pleto sobre WSE Messaging).

Desarrollando extendiendo ASMX de ASP.NET

En este caso, está claro que si nos basamos en.ASMX y ASP.NET, estamos, entonces, hablando deservicios Web XML basados en HTTP.

La gran mayoría del código nuevo a implemen-tar en aplicaciones que usen WSE está mas bien enel lado cliente (aplicación que consume el servicioWeb XML) casi más que en el lado del servidor (porsupuesto, depende de lo que haga el WS).

Repasando el desarrollo básico de cómo con-sumir servicios Web XML en ASP.NET de .NETFramework 1.1, recordaréis que cuando desde unaaplicación cliente añadimos una referencia Web aun servicio Web XML, Visual Studio nos generauna clase proxy con el mismo nombre que la clasedel servicio Web. Posteriormente, usábamos unobjeto instancia de esta clase proxy para invocarlos WebMethods del servicio Web. Por ejemplo, sila clase del servicio Web se llamaba Service1, pues

la clase proxy también se llamará Service1 y simiráis en el fichero donde está definida(Reference.cs en C# o Reference.vb en VB.NET)veréis que hereda de la clase del Framework lla-mada System.Web.Services.Protocols.SoapHttpClientProtocol.

Pues bien, si habilitamos el uso de WSE en nues-tra aplicación cliente (luego veremos cómo), VisualStudio nos crea dentro del mismo fichero Reference.csuna segunda clase proxy que se llama igual que la ori-ginal pero acaba en el literal ‘Wse’ y que en este caso deriva de una nueva clase base llamadaMicrosoft.Web.Services2.WebServicesClientProtocol,que como véis pertenece a un espacio de nombresnuevo Microsoft.Web.Services2 que no está den-tro de System (puesto que WSE está en evolución,por coherencia es mejor que, por ahora, no estéintegrado dentro del namespace Sytem). En nues-tro ejemplo anterior, esta segunda clase proxy sellamaría Service1Wse.

Una vez que disponemos de esta nueva clase proxy,si cuando vamos a llamar a un WebMethod lo hace-mos mediante un objeto instancia de la nueva claseproxy (en este caso Service1Wse) entonces estaremosutilizando el nuevo marco de trabajo de WSE. Porel contrario, si la invocación al WebMethod lo hace-mos mediante un objeto instancia de la antigua cla-se proxy, seguiremos empleando el marco de trabajode servicios Web XML básicos de .NET 1.x. Es asíde simple su utilización y siempre podemos utilizarlos dos caminos (invocación a nuestro servicio Webpor WSE o por servicios Web básicos, a elecciónnuestra).

Cómo instalar y habilitar WSE en VisualStudio 2003

Instalación de WSE

WSE 2.0 no lo tenemos disponible directamen-te en Visual Studio 2003. Es lógico, porque su apa-rición es posterior a Visual Studio 2003. Para podertrabajar con las librerías de WSE 2.0 e incluso tener-lo integrado con el IDE de Visual Studio 2003, esnecesario bajar el paquete de instalación del sitiopúblico de Microsoft en Internet. En concreto, ladirección de download es:

http://msdn.microsoft.com/webservices/downloads/default.aspx

Y ahí, seleccionar el último download de WSE.Actualmente, la última versión es WSE 2.0 con elService Pack 3.

Una vez instalado (por supuesto, siempre tenien-do ya primero instalado Visual Studio 2003), si hemoselegido la opción de instalación para “Desarrollo”,

dotN

etM

anía

<<

25

dnm.comunicaciones<<

Especializados en tecnología Microsoft desde 1995 • www.renacimiento.com

Podemos desarrollar con WSE 2.0 extendiendoASMX de ASP.NET o también podemos desarrollar

un servicio Web directamente con Messaging ennuestro propio proceso sin utilizar ASP.NET.

Page 26: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

entonces, además de tener disponibleslos assemblies de WSE, también se noshabrá integrado una pequeña aplicaciónde configuración de WSE dentro deVisual Studio 2003.

Habilitar WSE en un proyecto

Para que un proyecto de Visual Studio2003 (tanto un servicio Web como unaaplicación cliente que consuma al servicioWeb) pueda hacer uso de WSE, simple-mente tenemos que tener acceso a losassemblies (Microsoft.Web.Services2.dll),namespaces (Microsoft.Web.Services2,Microsoft.Web.Services2.Security, etc.)y adicionalmente conocer configuracionesespecíficas de WSE que se codifican en elXML del web.config de cada proyecto(como las secciones <microsoft.web.ser-vices2>, <diagnostics>, <security>, etc.).

Sin embargo, la integración de WSEcon Visual Studio 2003 nos facilitamucho la vida y la mayoría de las ope-raciones anteriores (añadir en references,o añadir secciones del web.config, etc.)las hace por nosotros dicha aplicaciónde configuración integrada en el IDEde Visual Studio 2003. Esta aplicaciónse ejecuta desde la opción “WSESettings 2.0...” del menú de contexto decada proyecto de Visual Studio 2003:

Eligiendo dicha opción, aparece laaplicación de configuración según mues-tro a continuación:

Por ejemplo, seleccionando laopción “Enable this Project for WebServices Enhancements” básicamentelo que hace es añadir a nuestro proyec-to las referencias que necesitamos. Estose puede hacer, por lo tanto, en un pro-yecto de servicio Web XML pero tam-bién en el proyecto cliente (ASP.NET,WinForms, etc.) que consume al servi-cio Web. Sin embargo, la opción“Enable Microsoft Web ServicesEnhancements Soap Extensions” sola-mente es posible en proyectosASP.NET de servicios Web XML, por-que lo que hace por debajo es configu-rar WSE 2.0 como una soapExtension deforma que se pueda extender el com-portamiento de SOAP mediante cabe-ceras nuevas. Esto es lo que nos añadeal web.config automáticamente lasegunda opción (solamente el elemen-to <add>):

Conclusiones y próximos pasos

Como conclusión y resumen,podemos decir que WSE son nuevoscomponentes que nos permiten desa-rrollar servicios Web Xml avanzados(con WS-SECURITY, WS-MESSA-GING, etc.) extendiendo en su mayo-ría el mismo marco de trabajo que

tenemos con los servicios Web XMLde .NET Framework 1.1.

Es importante volver a destacar queWSE es algo temporal y en constante evo-lución debido a que los estándares y espe-cificaciones en los que está basado estántambién en evolución (especificacionesWS-*).

Esta temporalidad y evolución deservicios Web XML se entiende quequedará consolidada y como platafor-ma completa y estable cuando aparezcaIndigo (siguiente gran salto en compo-nentes y desarrollo de aplicaciones dis-tribuidas basadas en estándares y sobretodo en servicios Web). Indigo es unode los módulos principales de WindowsLonghorn, aunque ya tenemos dispo-nible una versión beta instalable deIndigo sobre Windows XP o WindowsServer 2003.

Actualmente (versión 2.x de WSE)Microsoft advierte que el modelo deobjetos y programación es muy dife-rente de WSE a Indigo, sin embargo,cuando aparezca WSE 3.x, dentro demuy poco tiempo, Microsoft prometeque será interoperable con Indigo.

Por último, destacar otra vez queaunque WSE está en evolución, estono significa que estemos trabajandocon betas. Al contrario, WSE está ple-namente soportado por Microsoft y esuna plataforma de componentes pro-bada y disponible para desarrollos deaplicaciones en entornos de produc-ción. No estamos hablando de pro-ductos beta.

El presente artículo cubre solamenteuna introducción a WSE y muestra cómoestá integrado a .NET 1.1. Sin embargo,no nos hemos introducido realmente enlos módulos interesantes de WSE(Security, Messaging, etc.) porque seríanecesario un artículo específico para cadamódulo. Quizás en un próximo númerode dotNetManía...

dotN

etM

anía

<<

26

dnm.comunicaciones<<

Especializados en tecnología Microsoft desde 1995 • www.renacimiento.com

Figura 5

<webServices><soapExtensionTypes>

<add type="Microsoft.Web.Services2.WebServicesExtension,Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0" />

</soapExtensionTypes></webServices>

Fuente 2

Figura 4

Page 27: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía
Page 28: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Creación de complementos enVisual Studio .NET

Aunque Visual Studio .NET es uno de los mejores entornos de desarrollo jamáscreados, siempre habrá funcionalidades que echemos en falta.AfortunadamenteMicrosoft ya pensó en ello y nos permite añadir nuestras propias funcionalidadesa medida mediante complementos, que aprenderemos a crear en este artículo.

<< años que los entornos de desarrollo deMicrosoft son extensibles (Visual Basic 4.0 en el año 1996ya lo era), lo que quiere decir que no tenemos que con-formarnos con las funcionalidades que nos ofrecen sinoque podemos complementarlos con nuevas funcionali-dades de herramientas fabricadas por nosotros mismoso por terceros. Estas extensiones se integran perfecta-mente en cada entorno de desarrollo integrado (IDE,en adelante) a través de nuevos menús o barras de boto-nes. En las versiones anteriores de Visual Basic, Microsoftsólo ofrecía una forma de extensibilidad, que eran loscomplementos (add-ins). En Visual Studio .NET no hayuna sino tres formas de extensibilidad:

• Macros: Por primera vez los desarrolladores deVisual Basic pueden grabar, editar y ejecutar macrosen Visual Studio .NET, a través del editor de macros(menú “Herramientas”, “IDE de macros…”). Hayque indicar que la versión actual de Visual Studio.NET sólo admite Visual Basic .NET como len-guaje de programación de macros.

• Complementos: Permiten una integración a alto nivelde nuevas funcionalidades proporcionadas porDLLs externas. Los complementos se pueden escri-bir en cualquier lenguaje de .NET, como VisualBasic .NET, C#, Visual J# o C++.

• Paquetes del Visual Studio Integration Program (VSIP):Permiten una integración a bajo nivel de nuevasfuncionalidades, editores especializados, nuevos len-guajes de programación, etc. Inicialmente sólo sepermitía escribir estos paquetes en C++, pero mástarde Microsoft proporcionó VSIP Extras, que per-miten crear estos paquetes en lenguajes como VisualBasic .NET o C# (no obstante la complejidad siguesiendo grande).

En este artículo vamos a hablar de la forma de exten-sibilidad más común, los complementos. Al ser un com-ponente compilado en una DLL, un complemento ofre-ce más protección de la propiedad intelectual que unamacro y mejor rendimiento.

El complemento “Hola mundo”En esencia, un complemento no es más que una

DLL compilada que cumple 3 condiciones:• Su clase principal implementa ciertos interfaces

para poder integrarse en el IDE.• Está registrada como componente COM

(ActiveX). Debido a que Visual Studio .NET noes una aplicación .NET sino que sigue usandoCOM (una herencia del IDE de Visual Studio 6.0),sus complementos tienen que ser componentesCOM. No obstante, podemos usar la interopera-bilidad COM para hacer pasar a nuestra DLL.NET por un componente COM.

Carlos Quintero

dnm.plataforma.net

Hace ya bastantes

Carlos J.Quinteroes Microsoft MVP de .NET desdeprincipios del año 2004. Es autor

del popular complemento MZ-Tools 3.0 para VB6,VB5 y VBA, y

de MZ-Tools 4.0 para VisualStudio .NET 2002/ 2003, ambos

disponibles enhttp://www.mztools.com

...vamos a hablar de la forma de extensi-bilidad más común, los complementos.Al ser un componente compilado en

una DLL,un complemento ofrece másprotección de la propiedad intelectualque una macro y mejor rendimiento

Page 29: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

• Está registrada como complemento de VisualStudio .NET, para que aparezca en la lista de com-plementos (menú “Herramientas”, “Administradorde complementos...”). Como podéis ver en dichaventana, los complementos se pueden cargar y des-cargar en cualquier momento, y pueden ser mar-cados para ser cargados en el arranque de VisualStudio .NET (figura 1).

Para ir abriendo boca y antes de entrar en las farra-gosas explicaciones del registro de complementos,vamos a crear nuestro primer complemento “Holamundo”. Para ello usaremos el asistente para creaciónde complementos que nos proporciona Visual Studio.NET. Se accede a dicho asistente pulsando el menú“Archivo”, “Nuevo”, “Proyecto…” seleccionando enel árbol de tipos de proyectos de la izquierda el nodo“Otros proyectos”, “Proyectos de extensibilidad”, yen la lista de la derecha la plantilla “Complemento deVisual Studio .NET”. Esto abre el asistente y en suspáginas iremos seleccionando como lenguaje de pro-gramación Visual Basic .NET, como aplicación de des-tino (host) a Microsoft Visual Studio .NET, le dare-mos un nombre (por ejemplo, MiAddin1) y una des-cripción, y dejaremos las siguientes opciones en susvalores por defecto. Al finalizar el asistente, éste noshabrá creado una solución con 2 proyectos: uno quegenerará la DLL de nuestro complemento y otro quegenerará un programa de instalación del mismo.

Si nos fijamos en el proyecto de la DLL, veremosque tiene tres referencias que no nos sonarán tan fami-liares como las demás: son EnvDTE (contiene el mode-lo de objetos de la extensibilidad de Visual Studio.NET), Extensibility (contiene el interfaz que tie-nen que implementar todos los complementos) yOffice (contiene el modelo de objetos de barras demenús, barras de botones, etc. que Visual Studio .NETtoma prestado de Microsoft Office). Para familiari-zarnos con el modelo de objetos de estos ensambla-dos, especialmente de EnvDTE, podemos usar el“Examinador de objetos”.

La clase principal de este proyecto es Connect.vb.En esta clase:

• Se declaran un atributo GUID y un atributo ProgId:como se mencionó anteriormente, necesitamoshacer pasar nuestra DLL por un componenteCOM, así que esos atributos especifican el GUID yProgId de la clase del complemento.

• Se implementa el interfaz Extensibility.IDTExtensibility2. Esta interfaz contiene losmétodos OnConnection, OnDisconnection,OnStartupComplete, etc. que a modo de eventosserán llamados por Visual Studio .NET cuandoel complemento sea cargado o descargado.

• Se declaran e inicializan las dos variables másimportantes del complemento:La variable applicationObject representa el objetoraíz del entorno de desarrollo (del tipo EnvDTE.DTE)a partir de la cual tendremos acceso a los menús,documentos, soluciones, proyectos, ventanas, etc.del mismo. La variable addInInstance (del tipoEnvDTE.AddIn) representa esta instancia del comple-mento. Debido a que el interfaz IDTExtensibility2sirve también para complementos que se usan enotros hosts (como Outlook, etc.) dicho método nospasa las variables siendo del tipo Object y nosotroslas convertimos a los tipos adecuados para poder usarIntellisense, early binding, etc.

El método OnConnection es el más importante detodos, y puede ser llamado en distintas situaciones.Visual Studio .NET nos informa del motivo median-te el parámetro connectMode. Cuando el complementoes cargado manualmente después de Visual Studio.NET, el valor que toma el parámetro connectModees ext_ConnectMode. ext_cm_AfterStartup. Cuando elcomplemento es cargado automáticamente al iniciode Visual Studio .NET, el valor que se recibe esext_ConnectMode. ext_cm_Startup. En este último caso,es posible que Visual Studio .NET no se haya ini-cializado por completo y no es recomendable acce-der a sus propiedades, etc. por lo que cuando se hacompletado la inicialización, Visual Studio .NET lla-ma al método OnStartupComplete de nuestro com-

dotN

etM

anía

<<

29

dnm.plataforma.net<<

Figura 1.

…no basta con que nuestra DLL implemente ciertos interfaces (en concreto Extensibility.

IDTExtensibility2) para que se comporte como un complemento.Además hay que registrar la DLL como componente COM y como

complemento de Visual Studio .NET

Page 30: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

plemento. Por tanto, la forma correc-ta de inicializar nuestro complementoes la siguiente (antes de ejecutar elcomplemento, añadiremos una refe-rencia a System.Windows.Forms.dll, consu correspondiente línea Imports en elinicio del archivo, e incluiremos unacaja de mensaje):

Ahora ya podemos ejecutar y depu-rar nuestro complemento: ponemos unpunto de ruptura en alguna línea delmétodo OnConnection, pulsamos F5 yaparece una nueva instancia de VisualStudio .NET. En esta segunda instan-cia, vamos al “Administrador de com-plementos” y cargamos nuestro com-plemento MiAddIn1. Si todo ha ido bien,la ejecución se detendrá en el punto deruptura que establecimos y al continuarla ejecución aparecerá una caja de men-saje con el texto “Hola mundo. SoyMiAddin1 en Microsoft DevelopmentEnvironment”. Para evitar tener quecargar manualmente el complementoen la segunda instancia de Visual Studio.NET, podemos marcarlo para que secargue siempre al inicio de Visual Studio.NET, pero hay que tener en cuenta queen la siguiente sesión de Windows (aldía siguiente, por ejemplo), el comple-mento se cargará en la primera instan-cia de Visual Studio .NET, la que tiene

el código fuente del mismo, y cuandovayamos a compilarlo nos dará un errorporque no puede escribir la DLL ya queestá en uso. En este punto no basta conir al “Administrador de complementos”y descargar el complemento, ya que losdominios de aplicación (appdomains) nopermiten descargar ensamblados y la

DLL seguirá en uso. Para solucionarlohay que desmarcar el complemento paraque no se cargue al inicio, cerrar VisualStudio .NET y volver a arrancarlo.

Registro de complementosComo dijimos al inicio, no basta con

que nuestra DLL implemente ciertosinterfaces (en concreto Extensibility.IDTExtensibility2) para que se com-porte como un complemento. Ademáshay que registrar la DLL como com-ponente COM y como complementode Visual Studio .NET. ¿Cuándo hemoshecho esto en nuestro ejemplo anterior?La respuesta es que el asistente lo hahecho por nosotros:

Si vamos a la ventana de propieda-des del proyecto del complemento, a lasección “Propiedades de configuración”,“Build”, veremos que la casilla de veri-ficación “Registrar para interoperabili-dad COM” está marcada. Esto quiere

decir que cada vez que ejecutamos elcomplemento, sus clases públicas (ennuestro caso la clase Connect) son regis-tradas como componentes COM.Conviene saber que también podemosregistrar manualmente DLLs de .NETcomo componente COM usando la uti-lidad regasm.exe del .NET Framework,usando el flag /codebase:

Regasm.exe /codebase miaddin.dll

Y para desregistrarlo como compo-nente COM usaríamos:

Regasm.exe /unregister miaddin.dll

En cualquier caso, para la versiónfinal del complemento que queremosdistribuir a nuestros usuarios, el pro-grama de instalación del mismo deberáregistrarlo como componente COM.

Cuando el asistente creó nuestroproyecto también se encargó de crearunas entradas en el registro de Windowsque permiten a Visual Studio .NET des-cubrir cuales son los complementos dis-ponibles que mostrará en el“Administrador de complementos”.Visual Studio .NET lee los comple-mentos disponibles de dos ramas dis-tintas del registro de Windows:

• HKEY_CURRENT_USER\Software\

Microsoft\VisualStudio\7.1\Addins\

<ProgId>. Se usa esta entrada paracomplementos que están disponiblessólo para el usuario que los instaló.

• HKEY_LOCAL_MACHINE\SOFTWARE\

Microsoft\VisualStudio\7.1\AddIns\

<ProgId>. Se usa esta entrada paracomplementos que están disponiblespara todos los usuarios.

Para el caso de Visual Studio .NET2002 las entradas usarían “7.0” en lugarde “7.1”.

Como vemos, cada complementoqueda identificado por su ProgId. Dadoque este valor no es muy descriptivo, seusan unas entradas llamadasFriendlyName y Description para pro-porcionar un nombre y una descripciónpara nuestro complemento (estos sonlos valores que nos pidió el asistente enuno de los pasos). Se crean también otrasentradas (CommandPreload, etc. que demomento ignoraremos).

dotN

etM

anía

<<

30

dnm.plataforma.net<<

Private applicationObject As EnvDTE.DTEPrivate addInInstance As EnvDTE.AddIn

Public Sub OnConnection(ByVal application As Object, _ByVal connectMode As Extensibility.ext_ConnectMode, _ByVal addInInst As Object, ByRef custom As System.Array) _

Implements Extensibility.IDTExtensibility2.OnConnection

applicationObject = CType(application, EnvDTE.DTE)addInInstance = CType(addInInst, EnvDTE.AddIn)

Select Case connectModeCase ext_ConnectMode.ext_cm_Startup

' No hacemos nada. VS.NET llamará a OnStartupComplete ' cuando esté inicializado

Case ext_ConnectMode.ext_cm_AfterStartupOnStartupComplete(custom)

End Select

End Sub

Public Sub OnStartupComplete(ByRef custom As System.Array) _Implements Extensibility.IDTExtensibility2.OnStartupCompleteMessageBox.Show("Hola mundo. Soy " & addInInstance.Name & _

" en " & applicationObject.Name)End Sub

Fuente 1

Page 31: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

¿Complicado tanto registro de complemento?Ciertamente. La buena noticia es que parece que enVisual Studio 2005 no será necesario ni registrar el com-plemento como componente COM ni usar el registrode Windows: un archivo XML en el directorio ade-cuado se encargará de todo, pero mientras tanto cuan-do vayamos a distribuir nuestro complemento a otrasmáquinas tendremos que hacer que nuestro programade instalación cree dichos valores en el registro deWindows.

Por tanto, combi-nando ambas formas deregistro del complemen-to, el proceso de descu-brimiento y carga resul-ta ser el siguiente: VisualStudio .NET muestra enel “Administrador decomplementos” los nom-bres y descripciones queha encontrado para cada ProgIdque aparece en las ramasdel registro HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.1\Addins\ y HKEY_LOCAL_MACHINE\SOFT-WARE\Microsoft\VisualStudio\7.1\AddIns. Cuando car-gamos un complemento, Visual Studio .NET busca enla rama de registro HKEY_CLASSES_ROOT\<ProgId>(HKEY_CLASSES_ROOT\MiAddin1.Connect en nuestro caso)cual es el CLSID que corresponde a ese ProgId, y enton-ces busca la rama del registro HKEY_CLASSES_ROOT\CLSID\<CLSID>, cuyo valor InProcServer32\CodeBasecontiene la ruta a la DLL del complemento. Se cargala DLL del complemento y como al menos una clasepública (la clase Connect) implementa el interfazExtensibility.IDTExtensibility2, el complemento escargado satisfactoriamente y Visual Studio .NET invo-ca el método OnConnection pasándonos las instancias delhost y del complemento.

Introducción a los comandosA diferencia de versiones anteriores de Visual Basic,

en Visual Studio .NET todos los menús y botones del

IDE tienen por detrás un objeto comando (de la claseEnvDTE.Command). Podemos ver los comandos que pro-porciona Visual Studio .NET pulsando el menú“Herramientas”, “Personalizar…” y en la ventana dediálogo que aparece pulsando en la ficha “Comandos”.Vemos que los comandos están agrupados en catego-rías, siendo una de ellas la categoría “Complementos”,que contiene los comandos externos al IDE, propor-cionados por complementos como veremos más ade-lante. Cada comando está identificado de manera ine-quívoca por un GUID y un identificador ID. El GUID per-mite identificar al creador del comando (subsistemade Visual Studio .NET, un paquete VSIP o un com-plemento) y el ID permite al creador distinguir suspropios comandos entre sí. Como las propiedades GUIDe ID de un comando no son muy amigables, cadacomando tiene un caption, que es lo que se muestraen la interfaz de usuario, y un nombre. Podemos verla lista de nombres de comandos en la ventana ante-rior, pulsando el botón “Teclado”. El nombre está for-mado por un prefijo y un nombre corto (por ejemplo,Build.Compile). En el caso de los complementos, elprefijo es el ProgId del complemento. Como el ProgIdque genera el asistente es de la forma MiAddIn1.Connect,

los comandos de nuestro complemento tendrán nom-bres de la forma MiAddIn1.Connect.MiComando, lo cualno es muy estético; sería mejor que fueran de la for-ma MiAddIn1.MiComando, por lo que podemos cambiarel ProgId de nuestro complemento a simplementeMiAddIn1 (cambiando también, eso sí, las correspon-dientes entradas del registro del complemento y vol-viendo a registrar el complemento como componen-te COM para que el cambio tenga efecto). Por últi-mo, podemos obtener mediante código la lista decomandos usando la colección Commands de la claseEnvDTE.DTE.

Interacción con el IDEUn complemento puede interaccionar con el IDE

de alguna de las siguientes maneras:• Respondiendo a eventos que se producen en el IDE con

la solución, proyectos, documentos, etc. Para esto dis-ponemos de distintas clases como DebuggerEvents,DocumentEvents, SolutionEvents, TaskLiskEvents,etc. El IDE nos proporciona una instancia de

dotN

etM

anía

<<

31

dnm.plataforma.net<<

La buena noticia es que parece que en Visual Studio 2005 noserá necesario ni registrar el complemento como componente

COM ni usar el registro de Windows:un archivo XML en el directorio adecuado se encargará de todo

Page 32: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dichas clases mediante la propiedad Events denuestro objeto del tipo EnvDTE.DTE. Por ejemplo,el siguiente complemento intercepta el eventoDocumentOpened que se dispara cada vez que abri-mos un documento:

• Interceptando la ejecución de un comando del IDE exter-no al complemento. A veces es muy interesante poderinterceptar la ejecución de dichos comandos pararealizar alguna acción antes o después de su eje-cución. Por ejemplo, es muy habitual querer inter-ceptar la ejecución del comandoBuild.BuildSolution, para realizar alguna acciónantes de generar la solución. Para ello dispone-mos de la clase EnvDTE.CommandEvents, que nos pro-porciona los eventos BeforeExecute y AfterExecute.Para obtener una instancia de la claseEnvDTE.CommandEvents tenemos que usar la pro-piedad Events de nuestro objeto del tipoEnvDTE.DTE. Un complemento con esta funciona-lidad quedaría como ve en el fuente 3.Hay que hacer notar un par de detalles: primero,que hay distintos comandos Build.XXX y este com-plemento sólo intercepta el que usa el menú“Generar”, “Generar solución” (“Build”, “BuildSolution”); segundo, que existe también en el

modelo de objetos una clase BuildEvents con even-tos OnBuildBegin, OnBuildDone, etc. que podríamosusar como en el primer caso que hemos expuestopero dichos eventos no permiten cancelar la acción.

• Respondiendo a la ejecución de comandos del propio com-plemento (a través de sus botones y menús). Esto serálo más habitual en un complemento. Para ello, pri-mero el complemento tiene que haber creado suspropios comandos.

Creación de comandosUn complemento puede crear sus propios coman-

dos usando el método AddNamedCommand de la colec-ción Commands de nuestro objeto DTE. Dicha funciónrecibe como parámetros la instancia del complemen-to (la que recibimos en el método OnConnection), elnombre corto del comando (el nombre largo llevarácomo prefijo el ProgId de nuestro complemento), eltexto del comando (su caption en la interfaz de usua-rio), el texto de su tooltip, un valor booleano que indi-ca si la imagen asociada al comando será una de las deMicrosoft Office o una a medida diseñada por noso-tros y el identificador de dicha imagen (más adelantecomentaremos cómo asociar una imagen al coman-do). Podemos ignorar los otros parámetros opciona-les restantes.

Un aspecto importante a tener en cuenta es ¿cuán-do debe crear un complemento sus comandos?Podríamos pensar que podría crearlos cada vez quees cargado y eliminarlos cada vez que es descargado.Sin embargo, esto no es muy conveniente, porque elusuario puede asociar un comando a una combina-ción de teclas y si hiciéramos eso el usuario perderíala asociación con su combinación de teclas preferidacada vez que descargara el complemento o cerraraVisual Studio .NET. Por tanto, aunque se pueden cre-ar asociaciones con combinaciones de teclas por códi-go mediante la propiedad Bindings de la clase Command,la respuesta correcta es que los complementos sólodeben crear comandos una vez, la primera vez que soncargados tras su instalación, y de igual manera sólodeben eliminarlos cuando son desinstalados de lamáquina. Además, así se mejora el tiempo de carga delos complementos ya que no tienen que crear loscomandos cada vez que son cargados (pensemos encomplementos que proporcionan varias decenas decomandos, por ejemplo).

Para facilitarnos la tarea de distinguir si es laprimera vez que cargamos el complemento o no, elIDE nos proporciona el valor especialext_ConnectMode.ext_cm_UISetup en el parámetroconnectMode del método OnConnection. Solamenteuna vez recibiremos ese valor, y en ese momentodeberemos crear los comandos del complemento.No obstante, si nuestro complemento tiene pocoscomandos es más robusto comprobar cada vez que

dotN

etM

anía

<<

32

dnm.plataforma.net<<

Private WithEvents eventosDocumento As EnvDTE.DocumentEvents

Public Sub OnStartupComplete(ByRef custom As System.Array) _Implements Extensibility.IDTExtensibility2.OnStartupCompleteeventosDocumento = applicationObject.Events.DocumentEvents()

End Sub

Private Sub eventosDocumento_DocumentOpened( _ByVal Document As EnvDTE.Document) _

Handles eventosDocumento.DocumentOpened

MessageBox.Show("Has abierto el documento " & Document.Name)End Sub

Fuente 2

Private WithEvents eventosComando As EnvDTE.CommandEvents

Public Sub OnStartupComplete(ByRef custom As System.Array) _Implements Extensibility.IDTExtensibility2.OnStartupCompleteDim comandoBuildSolution As CommandcomandoBuildSolution = _

applicationObject.Commands.Item("Build.BuildSolution")

eventosComando = _applicationObject.Events.CommandEvents( _comandoBuildSolution.Guid, comandoBuildSolution.ID)

End Sub

Private Sub eventosComando_BeforeExecute(ByVal Guid As String, _ByVal ID As Integer, ByVal CustomIn As Object, _ByVal CustomOut As Object, ByRef CancelDefault As Boolean) _

Handles eventosComando.BeforeExecute

If MessageBox.Show("¿Seguro que deseas compilar la solución?", _"Pregunta", MessageBoxButtons.YesNo) = DialogResult.No Then

CancelDefault = TrueEnd If

End Sub

Fuente 3

Page 33: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

se carga el complemento si sus coman-dos están creados, y si no es así, cre-arlos como se muestra aquí:

El programa de desinstalación tieneque encargarse de eliminar los coman-dos del complemento. Para ello, en unaacción custom debe crear una instanciadel ProgID “VisualStudio.DTE.7.1”(para Visual Studio .NET 2003) o“VisualStudio.DTE.7” (para VisualStudio .NET 2002) que será un objetodel tipo DTE, a partir del cual podemosacceder a su colección Commands y borrarlos comandos de nuestro complementocon el método Delete de la clase Command.

Imagen de un comandoPara asociar una imagen a un

comando de manera que cuando cree-mos botones en la interfaz de usuario apartir de dicho comando aparezca suimagen, tenemos dos opciones:

• Usar una imagen ya existente en lasbarras de botones de Microsoft Office.En este caso, pasaríamos el valorTrue en el parámetro MSOButton delmétodo AddNamedCommand y en elparámetro Bitmap pasaríamos elidentificador de la imagen propor-cionado por Office. Se pueden verlas imágenes disponibles en Officey sus identificadores como se expli-ca en [3].

• Usar una imagen propia para nuestrocomando. Usar imágenes propias enlos botones de los complementossiempre ha sido complicado en lahistoria de Microsoft (antes habíaque usar el portapapeles deWindows, cuyo contenido se perdíasi nuestro complemento no tenía laprecaución de preservarlo). Porincreíble que parezca, en el caso deVisual Studio .NET la cosa se ha

complicado aún más, en especialpara conseguir que la imagen tenga“transparencia” en lugar de un fon-

do gris. Para llevarlo a cabo tenemosque crear una DLL satélite median-te un proyecto Win32 en VisualC++, añadir un recurso de tipo bit-map de 16x16 píxeles, pintar la ima-gen usando el color RGB 0,254,0 paralas zonas transparentes (casi verdetotal, pero no el verde RGB 0,255,0como indica erróneamente la docu-mentación), colocar la DLL en unasubcarpeta de nuestro complemen-to que tenga como nombre el códi-go del locale (por ejemplo, 1033 paraEnglish US) y añadir unas entradasen el registro de Windows corres-pondientes a nuestro complementocon los nombres SatelliteDLLName(contiene el nombre de la DLL saté-lite) y SatelliteDLLPath (contiene lacarpeta de la DLL, pero excluyen-

do la parte del locale, a pesar de loque dice la documentación oficial).Finalmente, en nuestra llamada a lafunción AddNamedCommand, pasaría-mos el valor False en el parámetroMSOButton y en el parámetro Bitmappasaríamos el número de recurso delbitmap en nuestra DLL satélite.Para más información se puede con-sultar el artículo [4].

Estado y ejecución de coman-dos

Una vez que tenemos creados loscomandos de nuestro complemento,podemos querer cambiar su estado (visi-ble, invisible, habilitado, deshabilitado, etc.)en función del contexto, por ejemplo,dependiendo de si la ventana activa esuna ventana de código o no. Y natural-mente, querremos recibir un eventocada vez que un comando es ejecutadopara llevar a cabo la acción para la cualse creó. Para ambos propósitos VisualStudio .NET nos proporciona el inter-faz EnvDTE.IDTCommandTarget, que debe-mos implementar en nuestro comple-mento. Dicho interfaz tiene sólo 2métodos:

• QueryStatus: Este método es llamadopor el IDE cuando ha cambiado algoen el entorno de desarrollo y necesi-ta saber el nuevo estado del comando.En este método recibimos el nombredel comando y tenemos que devolveruna combinación de flags con el esta-do del comando. Si se trata de uncomando de nuestro complemento,siempre tenemos que devolver comomínimo el valor vsCommandStatus.vsCommandStatusSupported. Si desea-mos que el comando esté habilitado,combinaremos dicho valor convsCommandStatus.vsCommandStatusEnab

led, como se muestra en el fuente 5.

• Exec: Este método es llamado por elIDE cuando el usuario ha invocadonuestro comando. En este método lle-varemos a cabo la acción deseada,como se muestra en el fuente 6.

Creación de menús y botonesEl siguiente paso es crear elementos

en la interfaz de usuario del IDE (boto-

dotN

etM

anía

<<

33

dnm.plataforma.net<<

Dim miComando As Command

TrymiComando=applicationObject.Commands.Item(addInInstance.ProgID & "." & "MiComando")

CatchEnd Try

If (miComando Is Nothing) ThenmiComando = applicationObject.Commands.AddNamedCommand( _

addInInstance, "MiComando", "Mi comando", "Mi comando", True, 59)End If

Fuente 4

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

If CmdName = addInInstance.ProgID & "." & "MiComando" ThenStatusOption = vsCommandStatus.vsCommandStatusSupported Or _vsCommandStatus.vsCommandStatusEnabled

End IfEnd Sub

Fuente 5

Page 34: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

nes, menús, etc.) asociados a nuestro comando. Paracrear un botón a partir de un comando se usa el méto-do AddControl de la clase Command. Dicho método reci-be como primer parámetro la barra de comandos(CommandBar) a la que se añadirá el botón. Como segun-do parámetro se pasa la posición que tendrá el botónen dicha barra (si no se pasa un valor se asumirá queirá en la primera posición).

Las posibilidades para añadir un botón son lassiguientes:

• Usar una barra de comandos ya existente: En este casoutilizaremos una de los objetos CommandBar quedevuelve la colección CommandBars de nuestro obje-to del tipo DTE. Cuando el complemento se descar-ga debemos eliminar dicho botón. Aquí se muestracómo añadir o quitar nuestro comando de la barrade comandos “Herramientas” (“Tools”) de VisualStudio .NET (otra barra de comandos muy usada esel menú de contexto de las ventanas de código, cuyonombre es “Code Window”):

Si deseamos cambiar alguna propiedad del botón,por ejemplo su propiedad Style (para que muestresólo el texto, o texto con imagen, etc.) o su propie-dad BeginGroup (para que se muestre un separador),tendremos que convertir el objeto de tipoCommandBarControl en un objeto del tipoCommandBarButton mediante la instrucción CType (oDirectCast). Con el tipo CommandBarButton tendre-mos acceso a dichas propiedades que no están en eltipo CommandBarControl.

• Crear una barra de botones nueva: Esto sólo será nece-sario si nuestro complemento proporcionara tan-tos comandos que fuera mejor agruparlos en su pro-pia barra, lo cual no es el caso de nuestro comple-mento de ejemplo, pero para ello emplearíamos elmétodo Add de la colección CommandBars de nues-tro objeto del tipo DTE. Dicho método nos devuel-ve un objeto del tipo CommandBar al que pode-mos añadir un botón como en el caso anterior.

ConclusiónEn este artículo hemos visto lo básico para la cre-

ación de complementos para Visual Studio .NET. Conesto ya podemos centrarnos en la funcionalidad pro-pia de nuestro complemento, como puede ser el mane-jo de ventanas y documentos, generación y manipu-lación de texto en nuestro código fuente, manipula-ción de formularios, navegación por la estructura denuestro código fuente (namespaces, clases, métodos,etc.). En el siguiente apartado se proporcionan todoslos recursos necesarios para seguir nuestra andadura.

Recursos en la WebExisten multitud de recursos como documenta-

ción oficial, ejemplos, artículos, weblogs, foros y news-groups, libros, etc. para los desarrolladores de com-plementos para Visual Studio .NET. Todos ellos estánen inglés (incluso los que escribo yo) y están recogi-dos en la siguiente página de mi sitio Web:

http://www.mztools.com/resources_addin_developers.htm

En especial cabe destacar los siguientes:[1] El libro “Inside Microsoft Visual Studio .NET

2003”, de Craig Skibo y otros: http://www.micro-soft.com/mspress/books/6425.asp. Este libro esimprescindible para cualquier desarrollo serio enel tema de complementos para Visual Studio .NETy está escrito por uno de los miembros del equi-po de extensibilidad de Microsoft Visual Studio.NET.

[2] El foro de Yahoo para complementos de VisualStudio .NET. http://groups.yahoo.com/group/vsne-taddin. Tiene una historia de mensajes con pre-guntas y respuestas muy completa y una secciónFiles con muchos recursos. Yo mismo he pasadoen este foro más de 3 años contestando preguntassobre complementos para Visual Studio .NET.

[3] “Finding Face ID Numbers for Your MicrosoftOffice 97 Toolbars”: http://msdn.microsoft.com/l i b r a r y / d e f a u l t . a s p ? u r l = / l i b r a r y / e n - u s /dno97ta/html/faceid.asp.

[4] “Custom command bitmaps 101”: h t t p : / / w e b l o g s . a s p . n e t / c r a i g s k i b o / a r c h i -ve/2004/01/08/48814.aspx.

dotN

etM

anía

<<

34

dnm.plataforma.net<<

Private controlMiComandoEnMenuHerramientas As CommandBarControl

Private Sub AñadirCommandoEnMenuHerramientas(ByVal comando As Command)Dim barra As CommandBar

barra = applicationObject.CommandBars.Item("Tools")controlMiComandoEnMenuHerramientas = comando.AddControl(barra)controlMiComandoEnMenuHerramientas.Visible = True

End Sub

Public Sub OnDisconnection( _ByVal RemoveMode As Extensibility.ext_DisconnectMode, _

ByRef custom As System.Array) Implements _Extensibility.IDTExtensibility2.OnDisconnection

If Not (controlMiComandoEnMenuHerramientas Is Nothing) ThencontrolMiComandoEnMenuHerramientas.Delete()

End IfEnd Sub

Fuene 7

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

If CmdName = addInInstance.ProgID & "." & "MiComando" ThenHandled = TrueMessageBox.Show("Has ejecutado MiComando.")

End IfEnd Sub

Fuente 6

Page 35: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía
Page 36: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

tanto que juegan un parte importante comoque pasan desapercibidas; de hecho las estamosusando continuamente y en muchos de los casos nitan siquiera somos conscientes de ello. Esto es así,al menos en la mayoría de los casos, porque es elpropio .NET el que juega ese papel de implemen-tador de interfaces; nosotros simplemente las usa-mos, pero me atrevo a asegurar que en la mayoríade los casos no somos conscientes de que estamostrabajando codo a codo con las interfaces. Por tan-to, ya va siendo hora de que sepamos que existeny cómo podemos aprovecharnos de su existencia...en el buen sentido de la palabra.

Las interfaces son...En su forma más simple, las interfaces son sim-

plemente definiciones de buenas intenciones, es decir,sólo indican cómo deberían definirse ciertos miem-bros de nuestras clases y estructuras. Pero si lo exa-minamos un poco más a fondo, realmente son másque esas buenas intenciones, ya que, cuando entranen juego, no basta con tener buenas intenciones, sinoque debemos seguir al pie de la letra lo que esas inter-faces definen. Y este es el punto fuerte de las interfa-ces, no sólo definen cómo deberían ser las cosas, sinoque nos obligan a que las cosas sean de una formadeterminada.

Seguramente estaremos hartos de leer que lasinterfaces son un contrato, es decir, son algo que cuan-do decidimos usarlas, debemos hacerlo al pie de laletra, no basta con tener la intención de..., sino debe-mos convertir esa intención en algo tangible.

Como hemos comentado, el propio .NETFramework utiliza las interfaces cuando quiere ase-

gurarse de que algo se puede hacer, por ejemplo, siqueremos clasificar elementos en un array o una colec-ción, (ver nº 7 de dotNetManía), esos elementosdeben implementar la interfaz IComparable, de estaforma, el propio .NET se asegura de que esas clasesclasificables se comportarán de una forma determi-nada, de modo que pueda utilizarse como está pre-visto que se utilicen. Esa seguridad que tiene .NETde hacer las cosas como está previsto se la da el hechode que el programador que ha creado la clase usadapara ser clasificada ha firmado un contrato, ese con-trato le dice que debe utilizar los miembros de la inter-faz correspondiente de la forma adecuada; en esteejemplo, debe implementar el método CompareTo paraque coincida exactamente con la forma que está defi-nido en la interfaz IComparable. Por tanto, si .NETse encuentra con una clase que define los miembrosde esa interfaz, tiene la certeza de utilizarlos comoestá previsto.

¿Qué contiene una interfaz?Debido a la naturaleza propia de las interfaces, es

decir, que solamente representan buenas intenciones,éstas no contienen código ejecutable, sólo definen quécódigo debe tener la clase o estructura que decidaimplementarla. Dicho esto, podemos concluir que lasinterfaces sólo definen los miembros, realmente la “fir-ma” de los mismos, es decir, de qué tipo son, si reci-ben parámetros, cuántos y de qué tipo, y en el caso delas propiedades, además del tipo de las mismas, si éstasson de sólo lectura, predeterminadas (indizadores enC#), etc. Veamos un ejemplo para aclarar conceptos.En los fuentes 1 y 2 tenemos la definición de una inter-faz, tanto para VB como para C#.

InterfacesYo implemento, tu implementas,... ¡implementemos todos!

En este primer artículo de esta nueva seccción explicamos las Interfaces. Lasinterfaces son de esos elementos de .NET Framework que juegan un papel bas-tante importante, pero que, a pesar de estar por todas partes, aparentementepasan desapercibidas...

<< Y es cierto,

dnm.inicio.fundamentos

Guillermo “Guille” Som

dnm.incio.fundamentos

Guillermo “Guille” Somes Microsoft MVP de Visual Basic

desde 1997. Es redactor dedotNetManía,miembro de Ineta

Speakers Bureau Latin America,mentor de Solid Quality LearningIberoamérica y autor del libroManual Imprescindible de Visual

Basic .NET.http://www.elguille.info

Page 37: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Como podemos comprobar, en lasdos interfaces hemos definido todos lostipos de miembros que cualquier clase oestructura pueden tener: métodos, pro-piedades, indizadores (propiedades pre-determinadas en VB) y eventos. En elcaso de los eventos, la diferencia está encómo se definen en VB y en C#, en esteúltimo, los eventos siempre están ligadoscon los delegados, mientras que en VisualBasic no tiene por qué hacerse esa aso-ciación, aunque internamente sí que estánbastantes ligados con los delegados, dehecho la declaración de la interfaz delfuente 1 la podemos hacer tal como mos-tramos en el fuente 3.

Aunque en cualquier caso, siemprese podrán definir de la forma habitual (deVB), de hecho, cuando el propio IDE deVisual Studio crea la plantilla para imple-mentar esta interfaz, lo hace de la mis-ma forma que si hubiésemos usado ladefinición hecha en el fuente 1.

¿Cómo usar una interfaz?Tal como podemos comprobar en los

fuentes 1 y 2, al definir una interfaz sóloindicamos la “firma” que tendrán losmiembros sin indicar siquiera el ámbitode éstos, ya que siempre serán públicos,de hecho no tendía ningún sentido defi-

nir miembros privados enuna interfaz.

Una vez que hemosdefinido el contenido deuna interfaz y queremosusarla en una clase, estruc-tura u otra interfaz, loharemos de forma distintadependiendo del lenguaje.En el caso de C#, paraindicar que una clase (o

tipo) implementa dicha interfaz, lo hare-mos de la misma forma que al derivar laclase a partir de otra: usando dos pun-tos después del nombre del tipo, segui-do con el nombre de la interfaz:

public class Prueba : IPrueba {...}

En Visual Basic utilizaremos la ins-trucción Implements seguida del nom-bre de la interfaz:

Public Class Prueba

Implements IPrueba

...

End Class

Si estamos usando Visual Studiocomo editor de nuestro código, éstepuede crear las plantillas de los miem-bros de la interfaz automáticamente, deforma que nosotros sólo tengamos queescribir el código correspondiente a cadauno de estos miembros.

La forma de definir esos miembrosdependerá también del lenguaje queestemos utilizando, en el caso de C#, nohay que hacer nada especial, simple-mente definir los miembros en la clasey asunto arreglado. Pero si el lenguajeusado es Visual Basic, esas definicioneshay que hacerlas de forma explícita, esdecir, debemos indicar que las defini-ciones de esos miembros realmente sonlas definiciones de los miembros de lainterfaz. Esto lo haremos usando, a con-tinuación de la definición de cada unode ellos, la instrucción Implements segui-da del nombre de la interfaz y el miem-bro que implementa:

Public Property Nombre() As String _

Implements IPrueba.Nombre

Realmente esta forma de hacer deVB puede parecer, (de hecho lo es), unaforma de rizar el rizo, pero la explica-ción o excusa que hay (con la que nospodemos consolar), es que en VB notenemos porqué usar el mismo nombreindicado en la interfaz, por ejemplo, elmétodo Mostrar lo podríamos definir deesta otra forma:

Public Sub Imprimir(_

ByVal saludo As String)_

Implements IPrueba.Mostrar

dotN

etM

anía

<<

37

dnm.inicio.fundamentos<<

Fuente 1. Definición de una interfaz en Visual Basic

Public Interface IPruebaSub Mostrar(ByVal saludo As String)Property Nombre() As StringDefault ReadOnly Property Item(ByVal index As Integer) As StringFunction Total() As IntegerEvent DatosCambiados(ByVal mensaje As String)

End Interface

Fuente 2. Definición de una interfaz en C#

public delegate void DatosCambiadosEventHandler(string mensaje);public interface IPrueba{

void Mostrar(string saludo);string Nombre{get; set;}string this[int index]{get;}int Total();event DatosCambiadosEventHandler DatosCambiados;

}

Fuente 3. Definición de una interfaz de VB usando delegados

Public Delegate Sub DatosCambiadosEventHandler(ByVal mensaje As String)Public Interface IPrueba

...resto de miembros...Event DatosCambiados As DatosCambiadosEventHandler

End Interface

El nombre de las interfaces

Por definición, o convención, los nombresde las interfaces siempre empezarán con laletra I mayúscula seguida del nombre propia-mente dicho. Aunque esto es sólo una suge-rencia, ya que realmente el nombre de unainterfaz puede ser cualquier nombre válido.][

Page 38: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

En este caso, el método Imprimir de la clase Pruebarealmente es la definición del método Mostrar de lainterfaz IPrueba. Sobre esto, aunque está bien quepodamos hacerlo, si queremos mantener nuestrasmentes claras, sobre todo la de los que prefieren usarC#, deberíamos respetar siempre el nombre indica-do en la interfaz.

Múltiples interfaces en nuestros tipos.NET es un lenguaje de herencia simple, es decir,

una clase de .NET no se puede derivar de más deuna clase, (salvo con la excepción de la herenciaimplícita de la clase Object), pero en el caso de lasinterfaces, podemos decir que los lenguajes de .NETson de herencia múltiple. Esto es así porque una cla-se (o tipo) puede implementar más de una interfaz;por supuesto, en ese caso, siempre deberemos defi-nir todos los miembros de todas las interfaces queimplemente.

Para indicar que una clase implementa más deuna interfaz lo haremos de la siguiente forma. ParaC#:

public class Prueba2 : IPrueba,

IPrueba2 {...}

Y de esta otra para VB:

Public Class Prueba2

Implements IPrueba, IPrueba2

...

End Class

Múltiples interfaces con miembros idén-ticos

Un problema con el que nos podemos encon-trar es que dos interfaces distintas tengan miem-bros con la misma firma (y el mismo nombre).Bueno, problema, lo que se dice problema, no loes, ya que la definición la haremos como de cos-tumbre, si bien aquí volvemos a encontrarnos conla forma que tiene cada lenguaje de hacer frente aesa duplicidad.

En el caso de C#, no tenemos que hacer nada enespecial, sólo definir un miembro que cumpla con lafirma correspondiente y ese mismo miembro lo pode-mos usar para las dos interfaces.

public void Mostrar(string saludo)

{

// Esta implementación servirá

// para las dos interfaces

En el caso de Visual Basic, podemos hacerlo dedos formas:

La primera, (que es la que usa el IDE de VisualStudio), es creando dos miembros para implementarcada uno de los de cada interfaz; por supuesto esosmiembros deben tener nombres diferentes:

Public Sub Mostrar(_

ByVal saludo As String) _

Implements IPrueba.Mostrar

Public Sub Mostrar1(_

ByVal saludo As String)

Implements IPrueba2.Mostrar

La segunda es definiendo sólo un miembro e indi-cando que ese único miembro implementa las dosinterfaces:

Public Sub Mostrar(_

ByVal saludo As String) _

Implements IPrueba.Mostrar,_

IPrueba2.Mostrar

Por supuesto, la forma que elijamos dependeráde cómo queramos implementar estos miembros, esdecir, si queremos que compartan el mismo códigoo que ese código sea independiente para cada imple-mentación.

Implementaciones privadas, ¿realmenteson privadas?

El problema con el que nos podemos encon-trar es si esta misma forma de actuar, de tener defi-niciones diferentes para cada implementación, laqueremos implementar en C#. Ya que este lenguajeno permite indicar que cada implementación esindependiente una de la otra. Al menos si quere-mos que tanto una como otra sean públicas y que-remos que ambas formen parte de la interfaz públi-ca de la clase.

dotN

etM

anía

<<

38

dnm.inicio.fundamentos<<

Las interfaces sólo definen los miembros, realmentela “firma” de los mismos, es decir, de qué tipo

son, si reciben parámetros, cuántos y de qué tipo,y en el caso de las propiedades, además del tipo

de las mismas, si éstas son de sólo lectura,predeterminadas (indizadores en C#)

Page 39: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

La solución es definir cada miembro indepen-diente para que sólo puedan ser accedidos usandoobjetos del tipo de cada interfaz (o que uno sea par-te de la clase y de una de las interfaces y el otro sólolo sea de la otra interfaz).

Esto lo podemos hacer definiendo estos miem-bros de la siguiente forma. En el fuente 4 se mues-tra cómo hacerlo para que la implementación deIPrueba sea parte de la clase y que la implementaciónde IPrueba2 sólo pueda ser accedida mediante un obje-to del tipo de esa interfaz.

Igualmente si sólo queremos que ambas imple-mentaciones sean privadas, es decir, que no formenparte de la propia clase que las define, sino que sólosean accedidas desde un objeto del tipo de la inter-faz, las declaraciones las haremos usando la segundaforma mostrada en el fuente 4.

En el caso de Visual Basic, como hemos visto,podemos hacerlo de las dos formas mostradas ante-riormente, pero si queremos que tengan la mismafuncionalidad “privada” que hemos visto en C#,podemos declarar esos miembros como privados,de forma que no formen parte de la interfaz públi-ca de la clase, sino que sólo podamos usarlas desdeobjetos del mismo tipo que las interfaces. En elsiguiente fuente podemos ver un ejemplo de estoque comentamos:

Private Sub Mostrar1(ByVal saludo As String) _

Implements IPrueba2.Mostrar

Como hemos comentado, aunque estos miem-bros estén definidos como privados, debemos saberque siempre formarán parte de la interfaz que imple-menta la clase, por tanto podremos acceder a ellospor medio de un objeto de la interfaz, tal como pode-mos ver en el código de los fuentes 5 y 6.

ConclusiónComo hemos podido comprobar en lo expuesto

aquí, las interfaces son una de las formas que tienenlos lenguajes para que nuestras clases puedan ofrecercierta funcionalidad y que dicha funcionalidad puedaser compartida por clases distintas. Debido a que lasinterfaces nos obligan a seguir unas normas o formasa la hora de definir ciertos miembros en nuestros tipos,podemos usar esta característica para asegurar quenuestras clases utilizan uno de los pilares de la pro-gramación orientada a objetos: el polimorfismo, ya quelas interfaces le dan a nuestras clases una forma de uti-lización “medio-anónima”, al menos en el sentido deque si utilizamos una interfaz que nuestra clase imple-menta, podemos acceder a los miembros implemen-tados por esa interfaz, sin necesidad de saber que esta-mos usando un objeto determinado de una clase enparticular.

En otra ocasión veremos de una forma algo máspráctica cómo utilizar las interfaces y de paso algu-nos consejos que siempre vendrán bien para sacar elprovecho de este tipo de datos que .NET pone a nues-tra disposición.

dotN

etM

anía

<<

39

dnm.inicio.fundamentos<<

Fuente 5.Acceder a los miembros de una clase por mediode un objeto de la interfaz (VB)

Dim pr2 As New Prueba2pr2.Nombre = "Pepe"pr2.Mostrar("Desde la clase Prueba2: Hola")Dim ipr1 As IPruebaDim ipr2 As IPrueba2ipr2 = pr2ipr2.Mostrar("Desde la interfaz IPrueba2: Hola")ipr1 = pr2ipr1.Mostrar("Desde la interfaz IPrueba: Hola")

Fuente 6.Acceder a los miembros de una clase por mediode un objeto de la interfaz (C#)

Prueba2 pr2 = new Prueba2();pr2.Nombre = "Pepe";pr2.Mostrar("Desde la clase Prueba2: Hola");IPrueba ipr1;IPrueba2 ipr2;ipr2 = pr2;ipr2.Mostrar("Desde la interfaz IPrueba2: Hola");ipr1 = pr2;ipr1.Mostrar("Desde la interfaz IPrueba: Hola");

Fuente 4. Implementación privada en C# de los miembros de una interfaz

public void Mostrar(string saludo){

// Esta implementación servirá para la interfaz IPruebaConsole.WriteLine(saludo + ", " + Nombre);

}

void IPrueba2.Mostrar(string saludo){

// Esta implementación solo es para IPrueba2Console.WriteLine("2: " + saludo + ", " + Nombre);

}

.NET es un lenguaje de herencia simple, es decir,una clase de .NET no se puede derivar de más

de una clase, pero en el caso de las interfaces, podemos decir que los lenguajes

de .NET son de herencia múltiple

Page 40: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 60,00€ IVA incluido y recibir el CDVolumen 1 con los 11 primeros ejemplares en formato PDF de alta calidad de forma gratuita.

❑ Deseo que me envíen los números atrasados marcados por un precio de 6,00€ IVA incluido cada uno.

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 ❑ MASTERCARDNúmero de su tarjeta: Fecha de caducidad: / (imprescindible)

Firma y/o sello

a de de 20

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Usted autoriza a la mecanizaciónde estos datos. El responsable ydestinatario de éstos es Netalia,S.L. Usted tiene derecho a acce-der a sus datos, modificarlos ycancelarlos cuando lo desee. Susdatos no serán cedidos en ningu-na de las formas posibles a terce-ras partes y no se utilizarán másque para el buen funcionamien-to de su suscripción a la revistadotNetManía y para informar-le de las actividades comercialesque realice la editorial Netalia,S.L. Si no desea recibir informa-ción comercial de dotNetManíamarque la casilla siguiente ❑

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 puedeenviarlos por correo postal a la siguiente dirección:

Netalia, S.L.C/ Robledal, 13528529- Rivas Vaciamadrid (Madrid)

Nº2 Nº4 ❑ Nº5 ❑ Nº6 ❑ Nº 7❑ Nº3

❑ Nº9 ❑ Nº11 ❑ Nº12 ❑ Nº13 ❑ Nº14❑ Nº10

Suscríbase y llévese el CD Volumen 1 gratis

AGOTADO

AGOTADO

Oferta válida sólo para España hasta el 30 de Junio de 2005 o hasta agotar existencias

Aún está a tiempo

❑ Nº8

❑ Nº15

Page 41: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

41

Herencia ¿To be or not to be?

En este artículo se demuestra por medio de patrones cuando la herencia es una buenaopción y algunos síntomas que nos pueden indicar cuando usarla se puede convertir enun problema y cómo resolverlo.

motivaciones para usar o no herencia,todo esto explicado por dos patrones de diseño y conejemplos sacados de la plataforma .NET y otros pro-pios. Primero veremos cuando no utilizarla, veremosalgunos de sus inconvenientes para luego hacer deesos inconvenientes, virtudes. Por último unas con-clusiones salomónicas. Los patrones que seleccionese conocen como Pattern of Patterns, es decir patro-nes de diseño que son muy básicos y están por deba-jo de los patrones que se definen en otros libros comoGoF o Fowler03.

Patrón delegado

Resumen

Mejorar el diseño por medio de composicióncuando la herencia da más problemas que solucio-nes. Se ruega no confundirse con delegate.

Objetivo

En algunas situaciones usar herencia para exten-der clases no es una decisión acertada. La delegaciónsigue un propósito más general para extender fun-cionalidad.

Contexto de uso

La herencia es el modo más común de extenderfuncionalidad, si se usa correctamente para los casos“es un”. Recalcaría el “un” debido a que en .NET nosoporta herencia múltiple.

En algunos sistemas, un usuario juega distintosroles. Por ejemplo, en un sistema de conferenciaspara hoteles un congresista puede ser un empleado

del hotel o una persona externa, teniendo trata-mientos diferentes, ya que un congresista externo fac-tura sus horas mientras que el empleado no.

También en otros entornos donde no se soportaherencia (yo la he usado en VB 6) se imita por mediode la delegación.

No debemos mezclar las clases referentes al domi-nio de la aplicación con las clases de utilidades.Cuando desarrollamos clases de utilidades o herra-mientas, por ejemplo un manejador de XML, es nor-mal ver cómo una clase delega la creación del XMLa la herramienta.

Este patrón sigue una de las máximas que seencuentra en GoF: es mejor la colaboración entreclases que la herencia. Esto se debe a que la heren-cia define su estructura en tiempo de diseño sinposibilidad de cambiar la clase base en tiempo deejecución.

El ocultar métodos o propiedades de una clasebase es un indicador de que no es buena idea here-dar de esa clase. Lo mismo sucede con las interfaces;si vemos que tenemos una interfaz de tres métodos,la implementamos en diez clases, en ocho de las diezclases uno de los tres métodos está devolviendo unnulo, es porque debemos separar la interfaz y dejarese método en una segunda interfaz.

Y, sobretodo, el uso inapropiado de la herenciapuede que nos lleve a crear un AntiPatron como pue-de ser una clase Dios. Una clase Dios es aquella cla-se que lo hace todo, donde todo el sistema gira alre-dedor de esta clase, logrando una gran dependenciahacia ella.

Ventajas de este patrón

• La herencia es una relación estática mientras quela delegación es dinámica. Podemos hacer lo mis-

Daniel Mazzini

dnm.arquitectura

<< Veremos distintas

Daniel Mazzinicolabora habitualmente con

dotNetManía. Es Arquitecto deSistemas de Información en

Insert Sistemas. Imparte cursostanto de C# como de VisualBasic.NET para Aula DAT y

colabora en los talleres MSDNde Microsoft Ibérica.

Page 42: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

42

dnm.arquitectura<<

mo que con herencia pero cambiando la claseque resuelve el problema en tiempo de ejecu-ción.

• Las clases relacionadas al dominio de la aplicación no debenheredar de clases de utilidades. Además de ser una maladecisión de diseño, una vez terminada la clase expon-dría los métodos públicos de la clase de utilidad, rom-piendo su encapsulación.

• Proliferación de clases hijas. Ejemplo: tenemos dosclases, empleado y colaborador. Luego sabemosque un empleado puede llegar a ser un colabo-rador, las dos clases heredan de persona. Habríaque crear una clase uniendo las dos posibilida-des. Si en lugar de tener una combinación entre2, lo hacemos entre 5, el número crece radical-mente.

• Mejora con interfaces. Se puede mejorar más lacolaboración entre clases si el delegado imple-menta una interfaz. Esto daría la posibilidad detener más de una clase que pueda servirnos comodelegado.

Desventajas de este patrón

• Más código: Se requiere escribir más código en algu-nas situaciones.

• Comportamiento: Se pueden dar casos donde elcomportamiento de la clase cambie, por ejemplose espera un tipo de error y se recibe otro.

Roles

Delegado: Clase en que se confía una responsabi-lidad.

Delegador: Clase que le pide al delegado que leresuelva su problema.

Dentro de .NET

Existen gran cantidad de casos dentro de las libre-rías bases de la plataforma donde podemos ver el usode delegados. Paso a ejemplificar dos, ambos relacio-nados con la ordenación de objetos. Cuando hay queordenar un control ListView se consulta a la propie-dad ListViewItemSorter, que es de tipo IComparer sitiene un ordenador asignado. Si la propiedadListViewItemSorter está nula, crea el ordenador pre-

determinado. Internamente, cuando se cambia la pro-piedad ListViewItemSorter también se ejecuta el méto-do Sort.

Para ordenar un vector, la clase System.Array en unasobrecarga del método Sort permite que le pasemos elvector a ordenar y una clase que implemente la interfazIComparer.

EjemploDurante la primera etapa de un desarrollo pode-

mos llegar a conclusiones apresuradas. Por ejem-plo, que una ventana es un tipo de rectángulo.Como la relación es del tipo “es un”, creamos laclase base rectángulo capaz de calcular su superfi-cie en m2 y luego la clase ventana que heredara derectángulo. Todo funciona correctamente, hastaque, bajo un nuevo requerimiento, el cliente nosindica que las ventanas pueden tener distintas for-mas y que también necesita calcular la superficie.Debemos cambiar el diseño porque no podemoscambiar la clase basede ventana. Debe-mos delegar en unaclase u otra el calcu-lo basándose en eltipo de forma quetiene la ventana.Para que pueda sermás de una clasehacemos una inter-faz llamada ISuperficie, con el méto-do CalcularArea. Elfuente 1 muestra elcódigo que resuelveesta situación.

Patrones relaciones

Al igual que en la plataforma .NET, muchos patro-nes utilizan la delegación, los casos mas claros son el Proxyy el Decorador.

Figura 1. Roles del patrón delegado

Figura 2. Grafico del apartado deejemplo - Diseño inicial

Figura 3. Diseño final.

Page 43: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Patrón Superclase Abstracta

Resumen

Asegurar consistencia para encapsular clasesconceptualmente relacionadas por medio de unaclase superclase abstracta.

Contexto

Tenemos que crear un conjunto de coleccionespara un sistema con información crítica, nos han pedi-do que no se pueda quitar un objeto de la lista y quepodamos ocultar la información lo más que podamos.No quieren que usemos ArrayList.ReadOnly por lasdudas que nos olvidemos de usarlo en una de las cla-ses. Nosotros hemos decidido que al llamarse a Remoteo RemoteAt, que siga con la documentación de .NET,que dice que debe elevar una excepción del tipoNotSupportedException.

Si usamos la clase ColeccionBase nos encontramosque ya viene con este método escrito pero sin posibi-lidad de sobrescribirlo. Tenemos que usar la interfazIList. Llegado este punto tenemos dos posibilidades:

• Implementar en cada clase concreta la interfazIList y tener n veces repetido el mismo códigoque eleva la excepción en los métodos Remote oRemoveAt.

• Crear una clase abstracta que resuelva cómo usarel método Remote y RemoveAt para todas las claseshijas. Muchas veces tenemos la posibilidad de elegir

entre dos maneras de solucionar un problema, ypocas veces son las que unimos las dos solucionesen una mejor solución, sino que generalmente opta-mos por una y descartamos la otra. ¿Vacaciones enla playa o en la montaña? ¿Por qué no las dos jun-tas?. Es el caso de interfaz y clase abstracta: la inter-faz nos garantiza indireccionamiento, que el clien-te sabrá lo mínimo sobre el servicio que usa, mien-tras que la clase abstracta nos da un comporta-miento común. Si unimos los dos, podremos encon-trarnos que tendremos un sistema donde el clien-te sólo verá una interfaz (IList), las clases se ocul-tarán y tendrán un comportamiento homogéneo yaque unos métodos los resuelve la propia clase abs-tracta y otros métodos quedan abstractos para quelos resuelva la clase concreta porque éstos sí sondiferentes en cada clase concreta.

Ventajas de usar este patrón

• Asegurar que un conjunto de clases relacionadas seimplementan en forma consistente.

• No desea escribir de más.• Facilidad a la hora de mantenerlo.• Facilidad en caso de agregar una clase nueva.

dotN

etM

anía

<<

43

dnm.arquitectura<<

using System;namespace Delegado{

/// <summary>/// Interfaz para comunicar mejor el delegador con el delegado/// </summary>public interface ISuperficie{

Double CalcularArea();}/// <summary>/// La clase rectangulo es uno de los delegados/// </summary>public class Rectangulo:ISuperficie{

public Rectangulo(double lado1,double lado2){

_lado1=lado1;_lado2=lado2;

}double _lado1;double _lado2;

#region Miembros de ISuperficiepublic Double CalcularArea(){

return _lado1 * _lado2;}#endregion

}/// <summary>/// La clase circulo es uno de los delegados/// </summary>public class Circulo:ISuperficie{

public Circulo(double radio){

_radio=radio;}double _radio;#region Miembros de ISuperficiepublic Double CalcularArea(){

return (Math.PI * (Math.Pow(_radio,2)));}#endregion

}/// <summary>/// La clase ventana es el delegador/// </summary>public class Ventana{

ISuperficie _sup;public Ventana(double lado1,double lado2){

_sup= new Rectangulo(lado1,lado2);}public Ventana(double radio){

_sup= new Circulo(radio);}public double ObtenerArea(){

return _sup.CalcularArea();}

}

/// <summary>/// Aplicacion de prueba/// </summary>public class Test{

[STAThread]static void Main(string[] args){

Ventana v1 = new Ventana(5,5);Ventana v2 = new Ventana(2.5);Console.WriteLine(v1.ObtenerArea());Console.WriteLine(v2.ObtenerArea());Console.WriteLine();Console.WriteLine("Presione cualquier tecla para continuar");Console.ReadLine();

}}

}

Fuente 1

Page 44: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

• Pruebas: Si un método se implemen-ta en la superclase, y se prueba satis-factoriamente, sabremos que todos loshijos también pasarán esa prueba.

Desventajas

• La dependencia que crea la clase abs-tracta (en el patrón anterior se expli-có en detalle este problema).- El hecho de agregarle responsabilidad

que no debe tener. Cuando desarro-llamos solemos agregar más y másfuncionalidad hacia las clases base.El problema es que en ciertas veces,no todas las veces, se necesita estafuncionalidad en todas las claseshijas.

Roles

• Interfaz: Métodos genéricos que sedesean ejecutar desde el cliente.

• SuperClase abstracta: Clase encarga-da de encapsular la lógica comúnpara un conjunto de clases relacio-nadas que son sus clases hijas. Losmétodos con lógica diferente sedejan como abstract, asegurando quecada subclase concreta lo imple-menta a su manera.

• Clases concretas: Las clases concre-tas son clases relacionadas entresí, por ejemplo, que están en lamisma capa de la aplicación, y quese desea que los métodos que tie-nen código igual pase a formarparte de una clase base.

Dentro de .NET

En las colecciones se ven mucho estoscasos. Tenemos la interfaz ICollection, laclase abstracta CollectionBase, que imple-menta ICollection y más de 20 clases queheredan de CollectionBase.

dotN

etM

anía

<<

44

dnm.arquitectura<<

using System;using System.Collections;

namespace SuperClaseAbstracta{

public abstract class BaseColeccion:IList{

private ArrayList _lista;

protected BaseColeccion(ICollection coleccion){

_lista= new ArrayList(coleccion);}

#region Miembros de IList

public bool IsReadOnly{

get{return true;}}

public object this[int index]{

get{return _lista[index];}set{throw new NotSupportedException("La colección es de solo lectura");}

}

public void RemoveAt(int index){

throw new NotSupportedException("La colección es de solo lectura");}

public void Insert(int index, object value){

throw new NotSupportedException("La colección es de solo lectura");}

public void Remove(object value){

throw new NotSupportedException("La colección es de solo lectura");}

public bool Contains(object value){

return _lista.Contains(value);}

public void Clear(){

throw new NotSupportedException("La colección es de solo lectura");}

public int IndexOf(object value){

return _lista.IndexOf(value);}

public int Add(object value){

throw new NotSupportedException("La colección es de solo lectura");}

public bool IsFixedSize{

get{return true;}}

#endregion

#region Miembros de ICollection

public bool IsSynchronized{

get{return _lista.IsSynchronized;}}

public int Count{

get {return _lista.Count;}}

public void CopyTo(Array array, int index){

Figura 4. Roles del patrón superclase abstracta

Fuente 2 (...sigue)

Page 45: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Otro caso lo tenemos en los DataAdapter. Estála interfaz IDataAdapter, con los métodos básicosFill y Update; la clase abstracta DataAdapter, queimplementa IDataAdapter, dejando los metodos Filly Update como abstractos; luego la clase abstractaDBDataAdapter, que hereda de DataAdapter y le agre-ga propiedades relacionadas con las bases de datos,como SelectCommand, dejando Fill y Update comométodos que se pueden sobrescribir; y, por último,las clases concretas según cada motor de bases dedatos, como SQLDataAdapter, que están marcadascomo no heredables para que nadie sobrescriba nin-gún método.

Ejemplo

Voy a seguir con el ejemplo que puse al principio, enel apartado de Contexto. Vea el fuente 2.

Patrones relacionados

• Composite: Utilizado para representar relacionesjerárquicas. Todas las jerarquías tienen un grupo deinformación común que nos permite movernosentre las jerarquías.

• Bridge: Se definen dos interfaces que se comunicanentre sí, luego se crean clases abstractas y concre-tas a partir de estas dos interfaces. Por ejemplo, unIMusico toca un IInstrumento, hasta llegar a que unguitarrista, que es un músico de cuerda, toca una gui-tarra que es un instrumento de cuerda.

• Visitor: Un caso especial de Bridge, donde se extien-de funcionalidad indirectamente. Para asociarlo conalgo conocido, el ToolTip es un control que con sólosoltarse sobre el formulario hace que cada uno de losotros controles que están en el mismo formulario sele agregue una nueva propiedad que es el texto quemostrará el ToolTip.

dotN

etM

anía

<<

45

dnm.arquitectura<<

_lista.CopyTo(array,index);}

public object SyncRoot{

get{return _lista.SyncRoot;}}

#endregion

#region Miembros de IEnumerable

public IEnumerator GetEnumerator(){

return _lista.GetEnumerator();}

#endregion}

public class ColeccionAuto:BaseColeccion{

public ColeccionAuto(ICollection col):base(col){}

}

public class Auto{

public Auto(string marca,string modelo){

Marca=marca;Modelo=modelo;

}

public string Marca;public string Modelo;

}

/// <summary>/// Aplicacion de prueba/// </summary>public class Test{

[STAThread]static void Main(string[] args){

Auto a1 = new Auto("A","a");Auto a2 = new Auto("B","b");Auto a3 = new Auto("C","c");

Auto[] arAuto = new Auto[3];arAuto[0]=a1;

arAuto[1]=a2;arAuto[2]=a3;ColeccionAuto col = new ColeccionAuto(arAuto);

try{

col.Add(new Auto("Z","z"));}catch(NotSupportedException nse){

Console.WriteLine(nse.Message);}try{

col.Insert(2,new Auto("Z","z"));}catch(NotSupportedException nse){

Console.WriteLine(nse.Message);}try{

col.Clear();}catch(NotSupportedException nse){

Console.WriteLine(nse.Message);}try{

col.Remove(a1);}catch(NotSupportedException nse){

Console.WriteLine(nse.Message);}try{

col.RemoveAt(0);}catch(NotSupportedException nse){

Console.WriteLine(nse.Message);}

Console.WriteLine();Console.WriteLine(

"Presione cualquier tecla para continuar");Console.ReadLine();

}}

}

(...cotinuación) Fuente 2

Page 46: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

¿To be and not to be?, ¿por qué no?

Una de las afirmaciones que hice es que a veces tene-mos dos soluciones posibles y optamos por una o por laotra, cuando si unimos podemos mejorar aún más el dise-ño. ¿Se puede unir herencia y delegación?

Un pequeño ejemplo: Cuando se desarrollanentidades de negocios por medio de clases, se sue-le colocar una clase base y seguir el patrónSuperClase abstracta. Una vez me encontré frente aun caso donde las clases de entidad tenían que tenerun log, pero luego resultó que no todas las clasesdebían tener ese log porque eran invariables, esdecir, que después que se creaban no se podíanmodificar, por ejemplo, los mensajes que se envia-ban entre usuarios del sistema.

En estos casos, debemos:• Juntar un conjunto de responsabilidad que cree-

mos que está relacionada.• Crear una clase con esa responsabilidad.• Agregarlo como propiedad a una buena clase base.• Hacer que quienes tengan que tener esa respon-

sabilidad hereden de la nueva clase base.En la figura 5 se ven estos pasos, primero se crea la

clase Signatura. Luego se crea la clase abstractaBaseFirmado que a diferencia de la clase BaseEntidadestiene la propiedad Firma de tipo Signatura. Todas las cla-ses que no necesitan firma heredarán directamente deBaseEntidades, mientras que aquellas que necesiten unafirma lo hacen de BaseFirmado e indirectamente conti-nuarán heredando de BaseEntidades.

De esta manera hemos unido los dos patrones, pri-mero por medio de la SuperClase abstracta al crear unainterfaz y clase abstracta para tener un comporta-miento común, y después el patrón delegado crean-do un clase asignándole una responsabilidad muy con-creta, y que los demás delegan esa responsabilidad enesta nueva clase. En el fuente 3 puede ver el códigodel ejemplo anterior.

ConclusionesSiempre me gusta decir una frase que está en

“Analisys Pattern”, de Martin Fowler: "Los diseñosno son malos o buenos, sino más o menos provecho-sos". Expuse en la primera parte los problemas de laherencia para que sepamos de antemano, si la usamos,con qué nos podemos topar, y si el camino lo vemoslibre, pues usarla y si no está tan claro, mejor tirarhacia delegación. Lo que es malo de la herencia es loque la hace fuerte, la dependencia que tiene una cla-se hija hacia la clase base es la que nos permite escri-bir código en la clase base, probarlo y saber que fun-cionará para todas sus hijas. Por otro lado, si no hemosentendido bien el dominio de aplicación del clientepodemos suponer ciertas cosas que no lo son y que-darnos con un diseño poco provechoso.

dotN

etM

anía

<<

46

dnm.arquitectura<<

using System;

namespace Mixto{

/// <summary>/// Clase base de las entidades/// </summary>public abstract class BaseBE{

public BaseBE(){}public void Cargar(System.Data.IDataReader dr){

//TODO Hacer la carga por Reflection}

}

/// <summary>/// Log que se hace sobre una entidad/// </summary>public class Signatura:BaseBE{

public DateTime FechaHoraCreacion;public DateTime FechaHoraUltimaModificacion;public string Creador;public string Modificador;

}/// <summary>/// Clase base para quien use una firma/// </summary>public abstract class BaseFirmado:BaseBE{

public Signatura Firma;}

/// <summary>/// Clase concretaque usa firma/// </summary>public class Comercial:BaseFirmado{

public int IdComercial;public string Nombre;

}

/// <summary>/// Clase que no usa firma/// </summary>public class Mensaje:BaseBE{

public string Creador;public string Destinatario;public DateTime FechaHoraEmicion;public DateTime FechaHoraLeido;public int Prioridad;

}}

Figura 5.

Fuente 3

Page 47: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía
Page 48: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

<< ningún aviso para el lector; es el nombre del pro-grama en el que participa Alejandro todos los martesen la segunda parte del programa. Este programa radio-fónico se emite de lunes a viernes a partir de las 21 horasa través del Canal Sur Radio, una de las tres emisorasde radio de la RTV Autonómica Andaluza o RTVA.

Como esta revista llega a ser leída incluso por algu-nos privilegiados fuera de nuestro país, comentaré bre-vemente, que Andalucía es una de las regiones de España,situada al sur del país.

“Aviso para navegantes” es un programa que llevaen antena muchos años. Se trata de un programa sobreInternet y las nuevas tecnologías, y donde el objetivoque se persigue, es el de informar y hacer reflexionarsobre la nueva era digital, siempre desde un punto devista del usuario no especializado. En este programa seabordan diferentes apartados, todos ellos dentro de sec-ciones de noticias, ocio electrónico, seguridad en la red,administración electrónica, software libre como Linux,y software propietario como Windows.

Sobre la emisora Canal Sur Radio, diremos de ellaque es según el EGM (Estudio General de Medios), unade las emisoras más escuchadas en la región deAndalucía.

En el programa, Alejandro dispone de 10 minu-tos para hablar de la tecnología Windows XP. El buenambiente reinante y la genial transferencia de losconocimientos por parte de Alejandro, hace que eldirector del programa deje pasar de largo esos 10minutos y éstos se extiendan a veces hasta los 25 ó 30minutos incluso.

Ojos que no ven...Cuando le toca a Alejandro el turno de participar

en el programa, el director le introduce en el temadel día, a partir del cuál se desarrolla la plática.

Quizás la mayor dificultad del medio radiofónico parahablar de un tema de carácter tan práctico y técnico comola informática, es encontrar las palabras justas y adecua-das para describir el tema que se quiere abordar.

El espacio en el que participa Alejandro está enfo-cado a los usuarios no expertos, con grandes dosis deentusiasmo por aprender. Por todo esto, un usuarioexperto puede entender en un momento dado lo queAlejandro podría querer explicar en un momento dado,pero para un usuario novel, las explicaciones deben estarmuy preparadas y pensadas para que no haya dudas ytodo resulte ameno, didáctico y útil.

La informática no come a nadieEl espacio en el que colabora Alejandro, trata de lle-

var la informática a todos los usuarios, ayudándolos acomprender las tareas más comunes y habituales.

En este programa, se les explica a los usuarios tan-to tareas comunes como tareas un poco más complejas,y aunque a algunos oyentes puedan resultarles algunasde las tareas bastante obvias y sencillas, para un grannúmero de usuarios y aficionados a la informática sontareas muy interesantes y útiles.

Entre algunas de las tareas mencionadas porAlejandro en el programa radiofónico en el que partici-pa, podemos citar por ejemplo, la explicación a los usua-rios de cómo instalar un sistema operativo, cómo se for-matea un disco, cómo se crean particiones, como reali-zar una instalación dual, las acciones generales del man-tenimiento de un equipo o una explicación de las dife-rencias entre el software y el hardware.

De todos los modos, Alejandro aborda a veces en elprograma una sección específica que se parece a algocomo “hágalo usted mismo”. En esta sección, se le ani-ma al oyente a abrir su ordenador y conocer los entre-sijos de éste. En esta investigación, se le anima, enseña

El título no es

Jorge Serrano

dnm.mvp.online<<

Aviso para navegantes

Jorge Serranoes redactor de dotNetManía. EsIngeniero Informático y MVP deVB y de .NET. Es Webmaster de

PortalVB.com y autor dediferentes libros y artículos

técnicos. Jorge está entre losmejores profesores y

conferenciantes sobre latecnología .NET de nuestro país.

La amplitud de movimiento de los MVP permite, en muchos casos, divulgar la tecno-logía Microsoft a rincones insospechados a través de los medios disponibles hoy día.El artículo de la sección MVP Online de este mes trata de mostrar cómo la radio pue-de llegar a ser una buena prueba de la divulgación tecnológica.Alejandro Curquejo,MVP de Windows, es un fiel ejemplo de esto que comento.

Page 49: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

y explica al oyente cómo realizar una limpieza de polvo del ordenador,cómo instalar un segundo disco duro, cómo mejorar el uso del sistemaoperativo Windows XP y a usar herramientas fundamentales como porejemplo, el programa anti-spyware de Microsoft.

Aún y así, en el programa no se pasa por el olvido tampoco tratartemas relacionados con la seguridad. El usuario debe conocer la impor-tancia de la seguridad y por eso se le enseña a que se familiarice conella y con sus términos. Por todo esto, al usuario y por lo tanto al oyen-te, se le educa a que actualice su sistema operativo con regularidad yse le explica el porqué de la importancia de las actualizaciones. Dehecho, se hace especial hincapié en el Service Pack 2 de Windows XPy se indica que no es una simple actualización o una simple mejora delsistema operativo de Microsoft.

Indudablemente, para contar todos estos temas, es necesario utilizarun lenguaje llano, no purista ni lleno de tecnicismos. El oyente debe encon-trarse completamente identificado para sentirse cómodo.

ConclusiónEs interesante saber que hay diferentes medios de comunicación para

informar y divulgar una tecnología como la informática, pero es muy curio-so observar como uno de los medios de comunicación más antiguos de lahistoria moderna, es el utilizado para divulgar en este caso, algo tan actualcomo Internet, la tecnología y Windows XP.

La tarea más compleja en el caso de usar un medio radiofónico, es sinduda el transmitir el mensaje para que llegue al oyente de forma clara yconcisa. Al contrario de una conversación telefónica, no existe emisor yreceptor que interactúen entre sí, y por lo tanto, sabiendo los temas quese abordan, la complejidad en la comunicación es muy alta.

dotN

etM

anía

<<

49

dnm.mvp.online<<

“Aviso para navegantes” es un programa que llevaen antena muchos años. Se trata de un programasobre Internet y las nuevas tecnologías, y donde elobjetivo que se persigue, es el de informar y hacer

reflexionar sobre la nueva era digital

Alejandro Curquejo esMVP de Windows XP desde Abrilde 2003, y es conocido en losgrupos de noticias de WindowsXP como Alezito. En su peri-plo por los bit y bytes, entra enel mundillo informático en losaños 80 de la mano de una CasioPB-100 para pasar posterior-mente al nostálgico Spectrum48K y más adelante a un QL de

Sinclair; todo ello mientras realizaba estudios sobreElectrónica de Comunicaciones.

Desde aquel mismo instante, la informática, quehasta ese momento sólo era privilegio de algunasempresas, comenzaba a llegar a los usuarios y ocupa-ría un lugar importante entre sus aficiones y el mundolaboral hasta el día de hoy.

Alezito es y ha sido colaborador habitual de los gru-pos de noticias de Windows 98, Windows ME yWindows XP en castellano, siendo uno de los miem-bros más activos del grupo de noticias, con cerca de10.000 intervenciones al año.

Además de participar en los foros de noticias, tam-bién es probador de versiones beta de aplicacionesMicrosoft, participando en muchas de ellas como enel programa beta de Windows XP SP2 y Longhorn.

En lo que compete a su perfil profesional, Alezitotrabaja para un importante medio de telecomunica-ciones, y comparte su trabajo y dedicación como MVPen los foros, a formar a compañeros y empleados de sumisma empresa y a escribir numerosos artículos técni-cos y trucos relacionados con Windows XP, además decolaborar en Canal Sur Radio.

Puede recoger más información de las actividadesrealizadas por Alezito en los grupos de noticias, o enla web: http://www.multingles.net/tutexpertos.htm#ALE

Para otros asuntos o inquietudes, podrás contactarcon él en la dirección de e-mail [email protected].

Si quieres saber más sobre el programa MVP pue-des consultar la página oficial de Microsoft en:http://mvp.support.microsoft.com

Sobre Alejandro Curquejo

Alejandro Curquejo

Diales de Canal Sur RadioProgramación de la emisora http://www.canalsur.es/PROGRAMAS/radio/index_radio.html

Sintonización de la emisora por Internet (con Real Player) http://www.canalsur.es/Informativos/EmisionesDirecto/canalsurradio.ram

Sintonización por el Satélite ASTRA Nombre de Servicio: ANDALUCÍA RADIODial Digital+: 224Satélite: Astra 2CTransponder: 1056Frecuencia Downlink: 10.818 MHzPolarización: VSymbol rate: 22 MbaudiosFEC: 5/6Codificación (acceso condicionado): MediaguardNetwork ID: 1TS ID: 1056Service ID: 29969

Para descargarse emisiones anteriores en MP3 http://www.canalsur.es/PROGRAMAS/radio/programas/aviso_navegantes/index_avi-so_navegantes_jorge_gonzalez.htm

Page 50: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Paco Marín, el editor de esta revista,me pidió que escribiera algo sobre mi sitio, realmenteme dijo:

"...cuenta un poco la historia –o la prehistoria casi– detu sitio, qué es lo que se pretende con él, para qué puede serútil, etc."

Al principio, lo de prehistoria me hizo gracia, (toda-vía me la hace), y la verdad es que no anda muy desen-caminado, ya que en estos tiempos que corren y tratán-dose de un sitio de programación, ocho años sí que sepuede considerar prehistoria...

Pero no te preocupes que no te voy a contar las bata-llitas que he tenido que mantener durante estos últimosocho años -realmente ocho años y medio- para mante-ner vivo y activo mi sitio. Pero como tengo que enro-llarme un poco, pues algo sí que te contaré de todo estetiempo que llevo en la red.

Al principio fue...Todo comenzó casi por casualidad, en aquellas fechas,

noviembre de 1996, yo mantenía un sitio dedicado anoticias sobre Nerja y alrededores. El servidor que alo-jaba ese sitio lo gestionaba un amigo mío, y este caba-llero me comentó si quería tener un sitio para que yopusiera lo que quisiera en él. Le dije que sí, así me ser-viría para practicar más todo eso de crear páginas Weby demás “novedades”, al menos para mí, sobre escribircódigo HTML, ya que en esas fechas, prácticamente casitodas las páginas había que hacerlas a mano, que eso detener un editor de HTML no era tan común como loes ahora. Así que rebusqué entre las cosillas que tenía enmi disco duro, creo que en aquella época era uno de 100megas, (sí, megas, no gigas), y empecé publicando algu-nos trucos de Visual Basic. En enero del 97 me apuntéa una lista de distribución de Visual Basic, (vb-es), ade-

más de empezar a visitar algunos grupos de noticias públi-cos de Microsoft, no sólo de Visual Basic, sino tambiénotros relacionados con la programación HTML y len-guajes scripts, ya que lo que yo iba descubriendo me ser-vía para “orientar” a otros que estaban más perdidos queyo. Así fue como poco a poco mi sitio fue creciendo, cua-tro trucos por aquí, cuatro por allá; por suerte la gentetambién empezó a colaborar con sus propios trucos, (creoque la primera colaboración que recibí fue de David A.Garza), hasta que en pocos meses era casi un sitio en elque había que pararse para encontrar algo sobre VisualBasic y en español, ya que en inglés sí que había otrossitios, pero, si ya cuesta trabajo leer... tener que hacerloen inglés, pues como que costaba más, y si además delidioma le añadías que todo era gratis y que encontrabasun montón de código, pues mejor... sobre todo paramuchos que lo que necesitaban era precisamente esa“rutinilla” que andaban buscando y que acababan porsolucionarle algunos quebraderos de cabeza.

En el mes de febrero de 1997 empecé a publicar artí-culos traducidos del inglés de, por aquél entonces, ungran sitio dedicado a Visual Basic: VBOnline. En esalabor de traducción, en la que el primer número me tocótraducirlo todo a mí, colaboraron un montón de genteque iban rotando, entre ellos mi buen amigo JoeLeVasseur, el yankee menos yankee de todos los yan-kees. Esos artículos traducidos no estaban en mi sitio,sino en uno independiente, aunque al cabo de poco tiem-po, acabó como un directorio de mi sitio, ya que no segui-mos con las traducciones porque al final casi todo el con-tenido de la versión USA era “semi” comercial y lo querealmente interesaba era publicar temas relacionadoscon el “código” y no traducir anuncios.

En todo este tiempo, el sitio de el Guille ha cam-biado varias veces de ubicación, aunque hasta finales de2003 siempre en el servidor de mi amigo Manolo: WebCostasol. Incluso en los primeros meses ni tan siquiera sellamaba “guille”, sino “guiller”, (con “r” al final), ya quemi colega Manolo me llamaba así y así me “bautizó”.

La verdad es que en todos estos años, en más de unaocasión mi sitio tuvo sus momentos críticos, al menos

dotN

etM

anía

<<

50

dnm.comunidad.net<<dnm.comunidad.net

El sitio de “El Guille”Un sitio con más de ocho años de historia

<< Hace unos días que

El sitio de “El Guille” ha crecido mucho desde que nació en 1996.Y no por “viejo”está anticuado. Como él mismo dice, en el sitio de el Guille hay mucha información

y de la buena sobre .NET Framework. Guillermo Som es redactor dedotNetManía, mentor asociado de Solid Quality Learning y miembro de INETA

Speaker Latin America por lo que se recorre el mundo dando conferencias

Page 51: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

en lo referente a su permanencia, ya queconforme pasaba el tiempo el sitio era máspopular y consumía más ancho de banda,y como no reportaba beneficios, (todosiempre ha sido gratis), pues mis peleasme costaba para que no desapareciera; noculpo a la gente de Costasol, ya que paraellos era un gasto que crecía día a día ydurante demasiado tiempo soportaronesos gastos, siete años para ser precisos.Incluso llegué a buscar sitios gratuitos engeocities e incluso en un servidor francés,(que exigía que el contenido estuviese enidioma de Asterix), por si esas conversa-ciones algún día se terminaban por con-vertir en discusiones. De hecho en mar-zo del 2003 la gente de BusiNet me ofre-ció espacio gratuito y así fue como apare-ció MundoProgramación, un sitio “espe-jo” con el que aseguraba la existencia delsitio de “el Guille”. Fue a principios dediciembre de ese mismo año cuando “depronto” el sitio que tenía en Costasol dejóde existir, básicamente porque mi colegaya no estaba a cargo de los servidores Weby no podía seguir cubriéndome las espal-das, por tanto, tuve que buscar otro sitionuevo donde alojar las muchas cosas queya tenía publicadas, así es como nació elgui-lle.info. Toda esta movida, y realmente lasúltimas que tuve antes de esa fecha, esta-ba siempre motivada principalmente porel consumo tan grande de ancho de ban-da, es más, en abril de 2004 tuve quemudarme de nuevo, (aunque seguí con-servando el mismo nombre), ya que en elmes de marzo ese consumo se disparó (yeso que tenía 40GB contratados), y “labroma” me costó una pasta... aunque elproblema no fue realmente el dinero, sinola forma “no clara” de calcular el impor-te extra que debía pagar, así que... agarrélos bártulos y me mudé nuevamente, yhasta la fecha sigo en el mismo sitio, unsitio en el que el límite sólo lo tengo en elespacio que ocupe, y por suerte, no lo quela gente “consuma”, ya que en el año quellevo en el nuevo servidor, prácticamentetodos los meses se supera, y con creces, elconsumo de ancho de banda del mes ante-rior y hasta ahora no ha habido ningunaqueja ni tampoco nuevos “cargos extras”en los importes pagados. Por supuesto,esto es así porque el tipo de alojamientoque tengo contratado no es el más eco-nómico, sino uno que me asegurara queno tendría problemas con el “famoso”

consumo de ancho de banda, de hecho eseconsumo es ilimitado, así que... el únicoproblema para que la cosa deje de fun-cionar es que todos los años por el mes demarzo no tenga en mi cuenta el importedel pago anual.

¿Que hay en el sitio de elGuille?

Después de la batallita sobre la vidadesde la “prehistoria” hasta nuestros tiem-pos de mi sitio, ya va siendo hora de quete cuente qué es lo que puedes encontraren él y cuales son mis intenciones o, lasrazones para que el sitio exista.

Como te he contado antes, el sitio loempecé para publicar “cuatro truquillos”que tenía, trucos que pensaba que a otrosles podía ser de interés, después empe-cé a escribir “tutoriales” (o entregas)sobre temas que a muchos les interesa-ba, como la forma de crear un ficherode ayuda e incluso un curso de progra-mación con Visual Basic. Curso queempecé en abril del 97 y que casi todaslas semanas iba actualizando, pero con-forme pasaba el tiempo y al recibir másvisitas, también recibía más consultas,tuve que ir alargando los plazos de entre-ga, ya que en ocasiones el responder atodas esas consultas me llevaba inclusomás de ocho horas diarias, sí..., pareceuna locura y de hecho era una locuradedicar todo ese tiempo “por la cara” aresponder consultas, consultas que enocasiones se convertían hasta en peti-ciones, (y en algunos casos, exigencias),de que les hiciera el programa comple-to... era como se suele decir que uno ledaba la mano y acababan queriendo elbrazo completo, así que... casi tuve quecortarlo de raíz, de esa forma podía dedi-carle más tiempo a publicar cosas nue-vas, además de que la programación conVisual Basic se iba complicando cada vezmás y necesitaba dedicar más tiempo ainvestigar que a responder a consultas,la mayoría de las cuales ya tenían res-puesta en lo que había publicado en misitio. Y es que algunos no llegaban aentender que todo eso lo hacía, (y lo sigohaciendo), sin recibir ninguna compen-sación económica, es decir, mantener elsitio no es un trabajo remunerado,vamos, que no hay ninguna empresa quediga: “Guille tu dedícate a esto que yo

te pago tus gastos, el alquiler de tu casay te doy de comer”, y para más INRI, nisiquiera me dedico a la programaciónprofesional, al menos en el sentido deque no vendo programas.

Afortunadamente no sólo era yo el quepublicaba nuevas cosas, y de forma altruis-ta, sino que el número de colaboradorestambién crecía casi a diario, incluso en laactualidad son los colaboradores los quese llevan todo el peso del contenido de misitio, si no fuese por ellos no habría tan-tas cosas nuevas casi a diario.

Cosas que en los últimos años estánmás enfocadas a la programación con.NET, y no sólo dedicado al lenguajeVisual Basic, que aunque es el que a másgente atrae a mi sitio, realmente haymuchas cosas publicadas sobre C# y engeneral sobre todo lo que .NETFramework ofrece, ya que hay que estaral loro con lo que la gente demanda, y hoypor hoy, la gente quiere saber más y mejorsobre .NET, y aunque no esté bien decir-lo, e incluso hay gente que todavía no losabe, el sitio de el Guille tiene mucho con-tenido, y del bueno, sobre .NETFramework, de hecho en mi caso parti-cular, todo lo que publico lo hago siem-pre en los dos lenguajes principales de.NET: Visual Basic y C#; y en lo que res-pecta a los colaboradores, siempre encon-trarás autores que utilizan uno u otro len-guaje, así que... si aún no sabes dóndeencontrar información sobre cómo hacerlas cosas en .NET, ya sea en Visual Basico en C#, ya sea para trabajar con acceso adatos mediante ADO.NET o para crearsitios Web con ASP.NET o para crear yutilizar servicios Web o para saber cómotrabajar con encriptación, gráficos GDI+o con cualquier cosa que te interese depunto NET, sólo tienes que darte una vuel-ta por mi sitio: http://www.elGuille.info.

¡Te espero!

dotN

etM

anía

<<

51

dnm.comunidad.net<<

Guillero “El Guille” Som

El Guille 1987-2005

Page 52: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

hemos visto varios modelos de programaciónpara bases de datos en SQL Server, que se sucedían unoa otro sin descanso. Las características suministradas porel Sistema de Gestión de Bases de Datos subyacente (elDBMS), cambiaban con el tiempo dando solución a losrequerimientos de los usuarios, y cumpliendo el objeti-vo de conseguir, cada vez, un producto más poderoso yexitoso. De forma paralela, los modelos de acceso a datos,evolucionaban para incorporar las novedades, mientrasmantenían un adecuado nivel de sencillez de uso de las,cada vez, más complejas características internas ofreci-das por los servidores, tanto para el desarrollador comopara el administrador, de cara a construir la capa de acce-so a datos. Hoy, los desarrolladores pueden utilizar obje-tos contenedores de alto nivel para almacenar y mani-pular datos. En un próximo futuro –en una predicciónevidente–, nos encontraremos utilizando objetos de nego-cio que implementen cualquier tipo de manipulación dedatos de una forma fácil y conveniente. De esta forma,un viejo sueño de los desarrolladores se hará realidad:usar objetos en lugar de registros. En ese día, la base de datos,que ahora es parte constituyente del API se convertirá–con todos los predicamentos– en una herramienta más.Nos guste o no, esto nos lleva al siguiente paso de unproceso que, iniciado hace una década con ODBC, parece ahora despegar hacia el modelo de enlacesObjeto/Relación (O/R). La abandonada iniciativa ObjectSpaces. –que inicialmente era parte integrante de .NETFramework 2.0– se muestra como un signo más del cami-no a seguir. Todo esto nos conduce a la primera pregun-ta de este mes.

¿Cuál es la diferencia entre ODBC y ADO.NETy por qué Microsoft sintió la necesidad de crear unmodelo de objetos totalmente nuevo comoADO.NET? ¿No bastaba con ADO?

Trabajé en mi primer proyecto Windows a prin-cipios de los 90. Nuestra aplicación necesitaba algúntipo de soporte de bases de datos, aunque ésta no erauna de sus partes críticas. No había razón ningunapara escoger entre Access, Paradox o quizás SQL-Server. Adoptamos ODBC, que para la época era elestándar emergente en conectividad de bases dedatos. Era una elección perfecta para nosotros, porque lo conocíamos suficientemente. El API deODBC, de hecho, se diseñó para programadores deC/C++.

ODBC fue el primer intento de normalizar el acce-so a toda una serie de sistemas DBMS a través de un APIcomún. Antes de esto, los programadores no tenían másremedio que adentrarse en las particularidades propiasde cada sistema de base de datos. Además, resultabaimprescindible mantenerse al día de las novedades decada dialecto SQL y la arquitectura subyacente a él.Aunque no era perfecto en sí mismo, ODBC mostrabala forma correcta de hacer las cosas. ODBC se diseñócomo un API orientada a C pero el advenimiento deCOM y los entornos RAD como Visual Basic planteóde inmediato la necesidad de una alternativa basada enCOM. Más o menos al mismo tiempo, los desarrolla-dores de Access y Visual Basic disfrutaban del modelode objetos DAO incluido en Microsoft Access y contro-lado por el motor de datos JET. DAO fue mejorado parapermitir el acceso a SQL Server y Oracle vía ODBC.Básicamente, DAO actuaba como un proxy entre nues-tro código y el API de ODBC. Este modelo, sin embar-go, introdujo cierta sobrecarga, debido a que los resul-tados tenían que ser reconvertidos al modelo de DAO,para poderse utilizar realmente.

Para soslayar esta dificultad, Microsoft introdujoRDO y, después, ODBCDirect. Los Objetos de DatosRemotos (RDO) son un modelo de objetos COM queexpone las funcionalidades del modelo ODBC. No tie-ne más posibilidades o es más potente que el modeloODBC; es sencillamente, un “envoltorio” COM paraODBC diseñado para hacer ODBC accesible desde unfichero de script, la Web, o aplicaciones Visual Basic.ODBCDirect, sin embargo, se creó para acelerar las apli-caciones existentes que accedían a SQL Server.ODBCdirect es una especie de modo de trabajo DAO.Cuando se habilita, utiliza RDO y ODBC en lugar deJET para leer y escribir datos en las bases de datos SQLServer.

No obstante, la primera innovación significativa enel acceso a datos tras ODBC fue OLE-DB. OLE-DBse introdujo por primera vez en 1998 como parte de la

Acceso a datos y contenedores de datos

Dino Esposito

dnm.todotnet.qa

<< En estos años

Dino Esposito es redactor de dotNetManía.

Formador, consultor y escritorafincado en Roma.Miembro

del equipo de Wintellect,Dino está especializado en

ASP.NET y ADO.NET. Puedeenviarle sus consultas a

[email protected]

¿Cuál es la diferencia entre ODBCy ADO.NET y por qué Microsoftcreó un modelo de datos total-mente nuevo como ADO.NET?

¿ ?

Page 53: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

plataforma de Visual Studio 6.0. OLE-DB era desde el punto de vista del desa-rrollo, lo que se dio en llamar visión UDA(Universal Data Access). La idea inspirado-ra de UDA era que cualquier tipo de alma-cenamiento de datos fuera accesible a tra-vés de un conjunto común de interfacesCOM. Básicamente, es el mismo princi-pio rector de ODBC, pero retocado y refi-nado para integrarse en la más popular yexitosa plataforma de desarrollo delmomento: el Modelo de Objetos deComponentes (COM).

De nuevo, el modelo –en sus inicios–tenía ciertas imperfecciones. Totalmentebasado en COM, el modelo consumi-dor/proveedor de OLE-DB era relativa-mente fácil de implementar en aplicacio-nes C++, pero demostró su extrema difi-cultad para aplicaciones Visual Basic yASP. Ambos, los componentes de VB yASP carecen de la posibilidad de trabajarcon interfaces COM de bajo nivel, por nomencionar que la generalidad del mode-lo de programación, era sofisticado yrequiere bastante trabajo para implemen-tar incluso las operaciones más simples.

ActiveX Data Objects (ADO) es la libre-ría COM creada para hacer accesible elmodelo OLE-DB a todos los entornos deprogramación. Como RDO y ODBC, sesitúa entre la aplicación y las API de acce-so a datos de bajo nivel y sirve de media-dor entre las operaciones garantizandoque los datos traspasados entre ésta y elsistema DBMS se expongan a los usua-rios potenciales en forma apropiada y con-veniente.

ADO es la elección primaria –a menu-do la única razonable– para construir unacapa de acceso a datos en COM, ASP yaplicaciones VB6. También ha sido incor-porado y resulta fácil de llamar desde otrasherramientas RAD no Microsoft, talescomo Delphi o PowerBuilder.

¿Y qué sucede si creamos aplicaciones.NET? Lo primero, debido a que ADOes un objeto COM no existe ninguna con-traindicación por su arquitectura para quesea llamado desde una aplicación .NET.Dicho esto, sin embargo, la utilización deADO en .NET no es –generalmente– unabuena idea.

En .NET Framework, una gran par-te de las funcionalidades de ADO han sidoincorporadas en el nuevo framework deADO.NET. El proveedor OLE-DB yano es el modo preferido de acceso a datos,

y se ha sustituido por el proveedor de datosadministrado. Además, en .NET, se pue-den llamar a los proveedores de OLE-DBdirectamente, sin la intervención de ADO.

ADO.NET es un conjunto de clasesque expone servicios de acceso a datos alas aplicaciones .NET. Existen varias dife-rencias sintácticas entre los modelos deADO y ADO.NET. A pesar de todo, lasfuncionalidades de ADO y ADO.NET separecen bastante debido a que Microsofthizo lo posible para que la similitud entrela sintaxis de ambos modelos fuera máxi-ma. De esta forma, los desarrolladores nonecesitan familiarizarse con demasiadosconceptos nuevos para utilizar ADO.NETy pueden migrar aplicaciones medianteuna curva de aprendizaje relativamentesuave. Con ADO.NET, probablemente,no podrás reutilizar mucho del códigoexistente, pero, ciertamente, podrás reu-tilizar todos tus conocimientos de ADO.

ADO.NET consiste en dos bloquesde alto nivel: contenedores y proveedores dedatos. Las clases contenedoras de datos for-man una especie de modelo de bases dedatos en memoria. Clases como DataSet,DataTable y DataView son clases tipo arrayy pueden ser rellenadas con cualquier dato,incluyendo datos leídos de una base dedatos. Además, las clases suministran carac-terísticas avanzadas que soportan un mode-lo de base de datos desconectado, basadoen memoria, con características avanzadastales como tablas, relaciones, res-tricciones y claves primarias.

Son la contrapartida de los pro-veedores OLE-DB. Los proveedo-res administrados acceden a los sis-temas DBMS, y en general a losalmacenamientos de datos, expo-niendo sus funcionalidades a travésde una interfaz común de progra-mación y contenedores de datos.

Los proveedores administradosse diferencian de los proveedoresOLE-DB al menos en dos aspec-tos: son objetos administrados (enoposición a los objetos COM) y son mássencillos (implementando un conjuntomás compacto de interfaces). Otra claraventaja de los proveedores administradoses que devuelven datos utilizando objetosespecíficos del framework de alto nivel,haciendo innecesaria cualquier otra con-versión (como el Recordset de ADO) a con-tenedores más manejables. Esas son lasrazones por las que Microsoft abandonó

ADO y OLE-DB en favor de un nuevomodelo: ADO.NET

Hay tantas clases de colecciones enel .NET Framework que uno se con-funde fácilmente. Pero, afortunada-mente, usted puede ayudarnos ¿no?

Exacto. Mi labor aquí es (tratar de)ayudar y arrojar algo de luz sobre los pun-tos oscuros. ¿Te quejas del número decolecciones en la versión 1.1 de .NETFramework? Pues tienes que echar un vis-tazo a los generics en .NET Framework2.0. Generics dobla el número de opcionesdisponibles.

Al más alto nivel de abstracción, unacolección sirve de contenedor para ins-tancias de otras clases. Todas las clases decolección implementan la interfazICollection, que, a su vez, implementa lainterfaz IEnumerable. Como resultado,todas las colecciones suministran lassiguientes funcionalidades básicas:Disponen de una propiedad Count quedevuelve el número de ítems en memo-ria; tienen también un método CopyTo()para copiar sus elementos (todos o en par-te) a un array externo; contienen un méto-do GerEnumerator()que instancia un obje-to enumerador para recorrer sus elemen-tos. Este es el método que permite queposteriormente, puedan recorrerse losobjetos que implementan esta interfazmediante bucles tipo foreach (C#)/For…Each (VB.NET).

IList e IDictionary son dos interfa-ces que extienden ICollection otorgandouna definición más precisa a las clasescolectivas resultantes. ICollection sólosuministra la funcionalidad mínima y bási-ca. Por ejemplo, en la interfaz no existenmétodos para añadir o quitar elementos.Esta función es justamente la que sumi-nistra la interfaz IList. En la interfazIList, los métodos Add() e Insert() aña- do

tNet

Man

ía<<

53

dnm.todotnet.qa<<

Hay tantas clases de coleccionesen el .NET Framework que uno

se confunde fácilmente. Pero,afortunadamente, usted puede

ayudarnos ¿no?

¿?

Page 54: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

den elementos al final o en una posición concreta de lacolección. Los métodos Remove() y RemoveAt() borranelementos, mientras el método Clear() vacía totalmen-te la colección. Finalmente, Contains() verifica si un ítemcon un valor dado pertenece a la colección e IndexOf()devuelve el índice de un ítem especificado.

La interfaz IDictionary define un API que represen-ta una colección de pares clave/valor. La interfaz exponemétodos similares a IList, pero con diferentes signatu-ras. Las clases Dictionary también muestran propieda-des tales como Keys y Values. Ambos devuelven las colec-ciones respectivas de Claves y Valores del diccionario.Algunos ejemplos típicos de estas clases sonListDictionary, HashTable y SortedList.

Basados en las interfaces implementadas, podemosreconocer tres tipos de colecciones en .NET Framework:colecciones simples, listas y diccionarios. Las primerasson clases secuenciales como Queue y Stack que típica-mente, consumen ítems tras leerlos. Estas clases imple-mentan ICollection solamente. Las listas (Lists) son cla-ses que implementan IList (que, a su vez, hereda deICollection). Finalmente, los diccionarios implemen-tan IDictionary e implícitamente ICollection.

En algunos casos, lo único que se necesita es unacolección particular de items de cierto tipo o una colec-ción que añada un conjunto de nuevas características ala colección base. En .NET Framework, se suministranunas pocas colecciones fundamentales, como el sustra-to para construir, a partir de ellas, nuevas colecciones amedida. Las clases base abstractas son CollectionBaseDictionaryBase ReadonlyCollectionBase y NameObjectCollectionBase. Si necesitas una colección con un com-portamiento específico, no tienes que reinventar la rue-da, sino que puedes partir de una de esas coleccionesbien conocidas. La interfaz de programación de las cla-ses base ya suministra todos los métodos y propiedadesque se necesitan para sobrescribir nuestra propia clasede colección.

Las colecciones de propósito general son modifica-bles. Hay algunas, sin embargo, específicas a un contex-to dado, cuyos ítems son de sólo lectura. Un ejemplo deuna colección de sólo lectura es la clase ProcessModuleCollection en el espacio de nombres System.Diagnostics.La clase ReadonlyCollectionBase suministra un sustratosobre el que construir colecciones no modificables.

¿Cuál es la colección adecuada para tu propia apli-cación? La regla de oro es no usar colecciones con carac-terísticas que no se necesiten. Para aplicar esta regla,comienza tu examen y valoración desde abajo, o sea, des-de las clases más simples de la jerarquía.

Considera la utilización de Queue y Stack sólo si nece-sitas eliminar elementos tras leerlos. Si necesitas ejecu-tar más de una lectura sobre el mismo elemento, pien-sa en otras opciones. ¿Los arrays serían apropiados? Losarrays específicos de los lenguajes son los más apropia-dos, en especial si se trata de arrays unidimensionales.De hecho, en este caso, los compiladores de los lengua-

jes pueden usar intrucciones ad hoc para procesarlos. Sinembargo, los arrays son de dimensión fija. ¿Necesitas unobjeto que pueda crecer? En tal caso, ArrayList es lamejor opción.

Muchas otras clases de colecciones usan objetosArrayList internamente para “cachear” datos que des-pués son mostrados en interfaces más avanzadas. En lamayoría de los casos un ArrayList es perfecto y guardael equilibrio entre eficiencia y facilidad de uso. ¿En quécasos no resulta apropiado ArrayList? Por ejemplo, sivas a rellenarlo con cadenas (strings). En ese caso, utili-za StringCollection. ArrayList sólo soporta acceso inde-xado a los ítems, pero no soporta ordenación o inver-sión de índices. ¡No es una lista ordenada, sin embargo!Un objeto que reordena sus items tras realizar cambios,es –normalmente– mucho más pesado que aquellos quesólo ordenan a petición. Ten bien clara esta distinción ala hora de escoger.

Si necesitas acceso basado en claves, en lugar de índi-ces, entonces decide entre una clase HashTable y unListDictionary basándote en el número de ítems queprevés manejar. Cuando son pocos items, lo apropiadoes un ListDictionary. ¿Pero, qué hacer si el número deitems puede crecer indiscriminadamente dependiendode factores del tiempo de ejecución? En lugar de con-trolar el número de items en la lista y entonces cambiara una tabla hash cuando se exceda cierto límite, puedesusar más eficientemente la clase HybridDictionary quehace justo esta tarea. Se trata de una colección adecua-da cuando el tamaño del diccionario es desconocido. Laclase se cambia automáticamente a HashTable cuandohay más de 15 items almacenados, y siempre mantieneun aceptable nivel de rendimiento.

Si sabes que sólo vas a manejar cadenas, StringDictionary es una mejor opción que HashTable. Sinembargo, si vas a manejar muchas cadenas duplicadasconsidera la utilización de la clase System.Xml.NameTable,que suministra un almacenamiento altamente optimiza-do y un mecanismo de búsqueda basado en referenciasde cadenas, en vez de ordinales de cadenas.

Las clases más lentas son SortedList yNameValueCollection, debido a razones estructurales: sonlas más complejas y ricas de las clases de colección.Deberías considerar su uso sólo si necesitas al mismotiempo acceso indexado y basado en claves.

dotN

etM

anía

<<

54

dnm.todotnet.qa<<

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

Traducción por Marino Posadas

Los proveedores administrados se diferencian de los proveedores

OLE-DB al menos en dos aspectos: sonobjetos administrados (en oposición alos objetos COM) y son más sencillos

Page 55: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

55

publireportaje<<publireportaje

El eLearning al servicio del desarrolladorEl Máster Alhambra-Eidos en Tecnologías Avanzadas para el

Desarrollo de Software

los profesionales del desa-rrollo de software mantenerse al díaen sus conocimientos y habilidadesen un entorno tan dinámico y cam-biante como el nuestro. Alhambra-Eidos aporta, como desde hacemuchos años viene haciendo, suMáster en Tecnologías Avanzadaspara el Desarrollo de Software,uno de los más sólidos programasformativos al que pueden accederlos desarrolladores para alcanzar elnivel de conocimiento que las com-plicadas arquitecturas tecnológicasactuales les exigen. Este año, los res-ponsables de dicho plan formativonos hablan de la versión virtual delmismo, una de las más usadas porlos desarrolladores que no tienentiempo para acceder a los mucho más densos progra-mas presenciales. Guido Peterssen, responsable delárea de eLearning de Alhambra-Eidos y Luis MiguelBlanco, coordinador de la versión virtual de delMáster contestan nuestras preguntas.

¿A qué achacas el éxito y el prestigio de la ver-sión virtual de vuestro Máster?

Guido Peterssen: Bueno, yo creo que hayvarios factores:

• El primero es la seriedad. El Máster en su ver-sión presencial se está impartiendo desde el año1993 y la versión virtual simplemente ha here-dado la experiencia y buenas prácticas de suhermano mayor.

• El segundo es la experiencia. En la convocato-ria de 2005-2006 entramos en el octavo año deimpartición virtual, lo que hace al alumno cons-ciente que no somos alguien que improvisaalgunas cosas por Internet y usando el correoelectrónico para contactar con el tutor, montaun curso.

• El tercero es el rigor y la organización. Quienha estudiado con nosotros sabe que se encuen-tra con un itinerario absolutamente reglamen-tado de trabajo, con tutorías semanales plani-ficadas, con miles de páginas de material y dece-

<<No es fácil para

Luis Miguel Blanco y Guido Peterssen (de izquierda a derecha)

Alhambra-Eidos aporta, como desde hace muchosaños viene haciendo, su Máster en Tecnologías

Avanzadas para el Desarrollo de Software, uno de losmás sólidos programas formativos al que puedenacceder los desarrolladores para alcanzar el nivel

de conocimiento que las complicadas arquitecturastecnológicas actuales les exigen

Page 56: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

nas de videoconferencias. En fin, con un entor-no de enseñanza garantizado que genera cadaaño un buen número de titulados.¿Cómo es el proceso de tutorización que se rea-

liza por parte del profesorado?Luis Miguel Blanco: Yo me ocupo de la coor-

dinación general del Máster y además tutorizo algu-no de sus módulos. Los profesores procuramos estarsiempre encima de las necesidades del alumno.Participamos en los foros de debate sobre las dis-tintas temáticas, atendemos las consultas de losalumnos y, además, tenemos todas las semanas tuto-rías planificadas con ellos, donde atendemos demodo síncrono cualquier duda y orientamos el pro-ceso de estudio. La verdad es que estamos muyorgullosos de las continuas felicitaciones que reci-bimos de los alumnos que terminan su proceso deestudio con nosotros.

De vuestro Máster destaca la absoluta actuali-zación tecnológica de sus contenidos. ¿Cómo lohacéis?

Guido Peterssen: Invertimos cada año muchodinero en diseñar nuevos contenidos. Nunca hahabido una edición del Máster igual a la del añoanterior. Por ejemplo, este año comenzamos ya conla introducción al alumno a SQL Server 2005 yVisual Studio 2005, aunque aún los productos noestán en la calle nosotros tenemos ya módulos queorientan al alumno sobre el futuro uso de los mis-mos.

Decís que vuestro Máster sirve para obtener lacertificación MCAD, ¿cómo es esto?

Luis Miguel Blanco: El Máster tiene muchosmás contenidos de los que se exigen para obtener lacertificación MCAD, pero existe una parte del mis-mo que se ciñe absolutamente a los contenidos ofi-ciales de Microsoft para la obtención de dicha titu-lación. No en vano somos el centro de formaciónoficial de Microsoft que más titulados MCAD gene-ra cada año. Nuestra especialidad es el desarrollo desoftware y sabemos perfectamente qué es lo que tie-ne que conocer un desarrollador para afrontar conéxito el proceso de certificación.

dotN

etM

anía

<<

56

publireportaje<<

La verdad es que estamos muy orgullosos de las continuas

felicitaciones que recibimos de losalumnos que terminan su proceso de

estudio con nosotros

Page 57: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

dotN

etM

anía

<<

57

<<

ADO.NET and System.Xml 2.0Alex Homer,Dave Sussman y Mark Fussel

Editorial: Addison-WesleyISBN: 0321247124Páginas: 560Publicado: Enero, 2005 (2ª edición)

Autores populares en el mundo de los eventos de desarrollo Microsoft, Alex Homerse dio a conocer con su popular “XML IE5”, ya en los primeros estadios de implan-tación del soporte XML en el navegador de Microsoft.

En esta obra, junto a Sussman y Fussel, recorren las novedades de desarrollo deADO.NET 2.0, junto a las muchas novedades del namespace System.Xml, en lorelativo a la programación asíncrona, transacciones, integración con SQL Server2005 (por ejemplo, su utilización como base de datos XML), personalización de laseriación de datos XML y consideraciones de rendimiento. Mereció los elogios delos propios autores de la herramienta.

C# 2.0:Practical Guide for ProgrammersMichel de Champlain y Brian Patrick

Editorial: Morgan KaufmannISBN: 0121674517Páginas: 271Publicado: Febrero, 2005

Autores, previamente, de “Java jumpstart: using object concepts and UML”,Champlain y Patrick, abordan este proyecto desde un punto de vista muy prácti-co, cubriendo las características del lenguaje, pero dejando claros ejemplos de losfundamentos y de cómo esos fundamentos han variado en algunos casos para estanueva versión del lenguaje.

Todas las novedades están claramente remarcadas, y acompañadas por peque-ños ejercicios (snippets) que pueden usarse con facilidad para la probatura delcódigo. Además, las características están organizadas según los fundamentos dela OOP y sus características principales, de forma que la experiencia didácticasea más clara.

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 58: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía

Singularity:Un nuevo sistema operativo para investigaciónescrito en C#

Dos investigadores deMicrosoft Research, JimLarus y Galen Hunt, handirigido un curioso proyec-to de construcción de un sis-tema operativo denominadoSingularity, con propósitos

de investigación, que, según sus autores tiene por obje-to la construcción de sistemas fiables a través de la inno-vación en areas de sistemas, lenguajes y herramientas.Para más información, el proyecto tiene una Web pro-pia: http://research.microsoft.com/os/singularity.

¿Cómo (y cuándo) será Office 12 en la realidad?Una vez más recurrimos a Paul Thurrot y su Windows

SuperSite para leer de sus muy próximas fuentes que Office

12 saldrá después de Longhorn(del que siguen afirmando queestará RTM (Ready ToManufacture) en mayo de 2006.

Según el cronista, Office 12 no verá la luz hasta octubrede 2006, con una primera beta pública a primeros de eseaño. Algunas de las características más notables de esa ver-sión, tienen que ver con la productividad empresarial.Desde un gran número de posibilidades de reutilizaciónde documentos, hasta las búsquedas rápidas de materia-les, propiciadas por la tecnología subyacente en Longhorn.Office 12 será más gráfico, favoreciendo la conversión detextos en imágenes de todo tipo y la colaboración, bús-queda y recopilación analítica y sintética de informaciónserán pilares de la nueva versión. Respecto a los requisi-tos de máquina, serán más o menos los normales de aho-ra, ejecutándose tanto en Windows XP SP2 como enLonghorn (cliente).

dotN

etM

anía

<<

58

no

ticia

s.n

oti

cia

sdnm.desvan<<

Marino Posadas

Enterprise 1.0 Hands-On-Labs: http://www.microsoft.com/downloads/details.aspx?FamilyID=b9bff619-236c-4bbb-

9aa1-2e7bc562c7f5&DisplayLang=en Estees el sitio de descarga de las prácticas delaboratorio para la Patterns&PracticesEnterprise Library. Incluye 8 laboratoriosdistintos en VB.NET y C#.

Documentos en la Red

Implementing Manage code in SQL Server 2005: PorJagadish Chaterjee, gran experto en bases dedatos y asiduo contribuidor de ASPFree, publicaen http://www.aspfree.com/c/a/MS-SQL-

Server/Implementing-Managed-code-in-SQL-Server-2005-using-Visual-Studio-NET-2005/ un documento intro-ductorio a las características de uso del CLR desde lanueva versión de SQL Server.

Implicaciones y repercusiones de las clases parciales en.NET Framework 2.0: Gran artículo de nuestro colabo-

rador Dino Esposito en DevX,que recorre las implicacionesarquitectónicas que las nuevasclases parciales tienen en el

desarrollo. Disponible en http://www.devx.com/code-mag/Article/27819?trk=DXRSS_LATEST. A Jaime, un lanzamiento más del 2005.Alberto, todo un padre para los MVP

españoles, ya tiene un MVP, digo un niño, más que mimar. ¡Suerte Jaime!

Page 59: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía
Page 60: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía