60
C++/CLI: un nuevo enfoque al desarrollo en C++ para .NET• Trabajo con DataSet y ReportViewer • Parámetros personalizados en los eventos • Una mirada a WPF/E dotNetManía nº33 Enero 2007 • 6,50 (España) Visual Basic • C# • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET Opinión Mi meta es el rendimiento Entrevista David Chappell Principal de Chappell & Associates Ribbon.NET, PowUpload y PowerWEB Zoom for ASP.NET BcN DEV .NET developers community of Barcelona Comunidad Laboratorio TodotNet QA Planificación de la calidad

Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

  • Upload
    lylien

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

C++/CLI: un nuevoenfoque aldesarrollo en C++para .NET• Trabajocon DataSet y ReportViewer •Parámetros personalizados en loseventos • Una mirada a WPF/E

dotNetManíanº

33 E

nero

200

7 •

6,50

€ (E

spañ

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

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

Opinión

Mi meta es el rendimientoEntrevista

David ChappellPrincipal de Chappell & Associates

Ribbon.NET, PowUpload y PowerWEB Zoom for ASP.NET

BcN DEV .NET developers community of BarcelonaComunidad

Laboratorio

TodotNet QA

Planificación de la calidad

Page 2: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos
Page 3: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

...y van 3

dotN

etM

anía

<<

3

dotNetManíaDedicada a los profesionales de la plataforma .NET

Vol. III •Número 33 • Enero 2007Precio: 6,50€

EditorPaco Marín

([email protected])

Redactor JefeMarino Posadas

([email protected])

Editor técnicoOctavio Hernández

([email protected])

Consejo de RedacciónDino Esposito, Guillermo 'Guille' Som, JoséManuel Alarcón, Lorenzo Ponte, Luis Miguel

Blanco y Miguel Katrib (Grupo Weboo).

Colaboradores habitualesAntonio Quirós, Braulio Díez, Carlos

Quintero, Eladio Rincón, Javier Aragonés,Jorge Serrano, José Miguel Torres, Iván

González, Pepe Hevia, Salvador Ramos ySergio Vázquez

Además colaboran en este númeroCarlos Salazar, José Luis Latorre, José LuisQuintero, Rafael Ontivero “RFOG” y Yamil

Hernández

Atención al suscriptorPilar Pérez

([email protected])

IlustracionesYamil Hernández

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

www.dotnetmania.com

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

ImprimeGRUPO MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

>>

<<

dnm.editorial

Paco Marín

Bienvenido al número 33, de enerode 2007, de dotNetManía.

Con el presente número cerramosnuestro tercer volumen, nuestro terceraño aportando documentación mensual-mente a los desarrolladores de la plata-forma .NET. A lo mejor no ha sido fácil,pero desde luego ha sido un auténtico pla-cer. Gracias, amable lector, por confiaren nosotros.

Este mes también publicamos nuestroquinto cuaderno técnico “Optimización deASP.NET 2.0” de Braulio Díez y ReyesGarcía, gratuito para los lectores queestén suscritos. De los cinco, tres loshemos podido regalar con la suscrip-ción, aunque no por esto valen menos.Como puede ver, no es un regalo ni deNavidad ni por nuestro tercer aniver-sario, sino un esfuerzo continuado paradarle el mayor valor a su suscripción.El mérito no es solo nuestro; tenemosque agradecer el indispensable apoyode MSDN España, que patrocina la edi-ción que tiene en sus manos, así comoa los autores por su esfuerzo.

En cuanto a los contenidos de estemes, le recomiendo la entrevista queCarlos Salazar, de Raona, al que doy labienvenida por su primera colaboración,realizó a David Chappell a su paso porMadrid.

También se estrena José Luis Quintero(www.elquintero.net) quien lo hace con elartículo “Una mirada a WPF/E”, precisa-mente en el mismo mes que ha aparecidola primera CTP de WPF/E, producto delque hablamos ya el mes pasado en la entre-

vista a ForestKey, directorof developertools productmanagement enM i c r o s o f t .Vamos a tenerexperienciade usuariohasta en lasopa ☺, y la ver-dad es quees muydivertido.

Yseguimos con las presentaciones. RafaelOntivero, más conocido por RFOG,escribe un magnífico artículo titulado“C++/CLI: un nuevo enfoque al desa-rrollo en C++ para .NET”, el primer artí-culo que en estos tres años le dedicamosa C++. !Ya iba siendo hora!

Tres años presentando nuevos auto-res y ¡los que nos quedan! Como puedever, hay bastante buena gente –en todoslos sentidos– que puede enseñarnosmucho en nuestro castellano natal.

El artículo central de este mes es“Atributos, aspectos y cómo entretejercódigo desde Visual Studio para hacerAOP en .NET (I)” del grupo Weboo dela Universidad de La Habana, en el queparticipa, junto al profesor Katrib, YamilHernández, genial ilustrador y creadorde nuestra mascota.

Espero que le guste. Como siempre,dentro hay más.

Page 4: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

33dnm.sumario

dnm

.sum

ario

Planificación de la calidad 10-11Hace ya algún tiempo escribí en este mismo medio un artículo cuyo título era“Aseguramiento de la Calidad. Normas versus personas”. En aquel momento mepreguntaba si la mayor eficacia en la persecución del error la logramos activando políticasde recursos humanos que nos ayuden a contratar a los mejores profesionales o si, por elcontrario, basta con desarrollar sistemas de control de calidad que nos ayuden a lograrlo.

Entrevista a David Chappell 12-14Con ocasión de la conferencia de SOA y Business Process celebrada recientemente enMadrid, tuvimos la ocasión de charlar con David Chappell, Principal de Chappell &Associates (www.davidchappell.com) en San Francisco. David es además autor de librossobre software empresarial que se han publicado en diez idiomas y se han utilizado enciertas carreras del MIT, la ETH de Zurich y docenas de otras universidades. Es ponentehabitual en eventos y conferencias en Estados Unidos, Europa, Asia y Latinoamérica.

C++/CLI:un nuevo enfoque al desarrollo en C++ para .NET 15-21C++/CLI es el lenguaje de bajo nivel dentro del mundo .NET, puesto que permite realizartareas que son prácticamente imposibles con otros lenguajes; aparte de ello, permite irincorporando paulatinamente facetas de .NET a proyectos ya existentes, tanto Win32como MFC. Otros aspectos importantes son el rendimiento (tanto dentro del propio .NETFramework como en los cambios de contexto entre manejado/nativo) y la facilidad paramezclar ambos tipos de código.

Trabajo con DataSet y ReportViewer 22-24Cuando se trabaja con asiduidad con SQL Server 2000 Reporting Services, en muchasocasiones se tiene la necesidad de operar con conjuntos de datos (DataSet). Sin embargo,SQL Server 2000 Reporting Services no nos ayuda mucho cuando se trata de trabajarcon conjuntos de datos, y para usarlos estamos obligados a hacer algún pequeño enredo.

Atributos,aspectos y cómo entretejer código desde Visual Studio para hacer AOP en .NET (I) 26-34

Con la Programación Orientada a Aspectos (Aspect Oriented Programming – AOP)se pretende que la funcionalidad del código principal de una aplicación y la funcionalidadadicional indicada en forma de “aspectos” puedan ser reusadas, modificadas y extendidassin afectarse entre sí.

Parámetros personalizados en los eventos 35-40En este cuarto artículo dedicado a los delegados y eventos nos centraremos en cómocomunicarnos entre la clase que define los eventos y la que los intercepta. Veremos esacomunicación de dos formas diferentes, usando parámetros por referencia y de la formarecomendada, que es definiendo nuestra propia clase para usar como parámetro de loseventos. También abordaremos una característica exclusiva de C#, que es la posibilidadde usar clases base como parámetros de los métodos que reciben los eventos.

Una mirada a WPF/E 42-46WPF/E (Windows Presentation Fundation Everywhere) se nos presenta como unsubconjunto de WPF. Este subconjunto ha sido seleccionado con la intención deproporcionarnos diversas funcionalidades que permitirán la creación de entornos visualesricos en nuestras páginas; tales entornos eran impensables hasta el momento, mediantela utilización únicamente de HTML.

dnm.todotnet.qaMi meta es el rendimiento 47-49

dnm.laboratorio.netRibbon.NET,PowUpload y PowerWEB Zoom for ASP.NET 50-51

dnm.comunidad.net 52-53BcN DEV .NET developers community of Barcelona

dnm.biblioteca 55Microsoft SQL Server 2005: Applied Techniques Step by Step. Solid Quality LearningCLR via C#, Second Edition. Jeffrey Richter

dnm.desvan 58

Page 5: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos
Page 6: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

ASP.NET AJAX RC está compuesta por varias des-cargas interrelacionadas:• Por un lado, ASP.NET AJAX 1.0 RC, que es lo pri-

mero que habrá de instalar. Entre las nuevas carac-terísticas incluye soporte de parsing en el cliente paraglobalización, invocación dinámica de proxies de ser-vicios Web y sustitución lógica, compresión y sopor-te de caching para el manejador Script Resource y cam-bios en los espacios de nombres y ensamblados deASP.NET AJAX (han cambiado el espacio de nom-bres Microsoft.* por System.*) para asegurar la com-patibilidad entre ASP.NET AJAX 1.0 y ASP.NETAJAX en la próxima versión de .NET Framework.

• ASP.NET AJAX Control Toolkit. Para esta ver-sión hay tres nuevos controles dentro del ASP.NETAJAX Control Toolkit: DropDown, MutuallyExclusiveCheckBox y ValidatorCallout.

• CTP de diciembre de ASP.NET 2.0 AJAXFutures, que aporta características que extiendenel núcleo de la plataforma ASP.NET AJAX 1.0 confuncionalidades adicionales que permanecen bajodesarrollo.

• Aplicaciones de ejemplo. El equipo de desarrollode ASP.NET AJAX ha reunido unas cuantas aplica-ciones de ejemplo que le mostrarán las nuevas carac-terísticas y le ayudarán a desarrollar sus propias apli-caciones.

• Microsoft AJAX Library RC. Está también dispo-nible como un paquete para una instalación sencillaindependiente para desarrollos en sistemas no-Windows.

Más información y descargas en: http://ajax.asp.net/default.aspx?tabid=47&subtabid=471.

dotN

etM

anía

<<

6

dnm.noticias<<dnm.noticias

ASP.NET AJAX RC 1 disponiblen

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

Es la última versión preliminar de ASP.NET AJAX (antes Atlas), cuyaversión final está prevista para este mismo mes de enero

Visual Studio 2005 SP1 ya está disponible para sudescarga en http://msdn.microsoft.com/vstudio/support/vs2005sp1. Este service pack es fruto del feedback reci-bido por Microsoft de sus clientes y socios (a travésde MSDN Product Feedback Center y MicrosoftConnect), así como del propio chequeo interno de lacompañía, además de incluir nuevas funcionalidadesy mejoras en toda la línea de producto de Visual Studio2005. Visual Studio 2005 aporta alrededor de 70 mejo-ras en distintos escenarios de desarrollo:• Soporte para la generación de código para nuevos

procesadores (por ejemplo Core Duo).• Mejoras de rendimiento y escalabilidad en Team

Foundation Server.• Integración de Team Foundation Server con Excel

2007 y Project 2007.• Herramienta de soporte para dispositivos conec-

tados ocasionalmente y SQL Server CompactEdition.

• Soporte adicional para aplicaciones Web basadasen ficheros de proyecto.

• Soporte de Windows Embedded 6.0.

Para los desarrolladores que usen Visual Studio2005 bajo Windows Vista, Microsoft está desarro-llando una actualización a este SP1 que se llamaráVisual Studio 2005 SP1 Vista Refresh. Actualmenteestá en fase beta, y se espera que esté disponible jun-to con Windows Vista para clientes finales en el pri-mer trimestre de 2007.

Visual Studio 2005 SP1Microsoft Robotics Studio 1.0. Microsoft ha anun-ciado la versión 1.0 de Microsoft Robotics Studio, un entornode desarrollo gratuito para crear aplicaciones de robótica. Podrádesarrollar este tipo de aplicaciones usando Visual Studio, inclu-yendo las ediciones Express (Visual C# y Visual Basic). Más infor-mación: http://msdn.microsoft.com/robotics.

Microsoft XNA Game Studio Express 1.0. Es unnuevo conjunto de herramientas y tecnologías gratuitas basadas en.NET, las cuales permiten la creación de fantásticos videojuegospara PC basados en Windows XP (para Vista aún no está disponi-ble) y la consola Xbox 360. Además está disponible Microsoft XNAFramework Redistributable 1.0, que aporta a los desarrollado-res de juegos las librerías runtime que deben ser incluidas con susproductos para ser distribuidos con Windows XP. Información ydescargas en: http://msdn.microsoft.com/directx/xna/gse.

Visual Studio 2005 Team Edition for DatabaseProfessionals RTM.Microsoft ha liberado la versión RTMde Visual Studio 2005 Team Edition for Database Professionals,un producto diseñado para gestionar cambios en bases de datosque mejora la calidad del software a través del database testing y quetrae los beneficios de Visual Studio Team System y el ciclo de vidadel desarrollo a las bases de datos profesionales. Está disponiblepara su descarga para suscriptores a MSDN desde el 7 de diciem-bre y para su compra desde el 1 de enero. Más información enhttp://msdn2.microsoft.com/en-gb/teamsystem/aa718807.aspx.

Disponibles también...

Page 7: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dnm.noticias<<

dnm.noticias

dotN

etM

anía

<<

7

Microsoft ha anunciado importantesmejoras en la línea de productos, junto conel precio y disponibilidad de MicrosoftExpression Studio para profesionales cre-ativos. Expression Studio es un compo-nente clave en la estrategia de Microsoftpara mejorar la experiencia de usuario,equipando a los diseñadores con una pla-taforma de herramientas end-to-end queimpulsará la colaboración con los desa-rrolladores en la entrega de aplicacionescon experiencias de usuario de próximageneración para la Web, para WindowsVista y otros sistemas.

Comprende Expression Web para lacreación de sitios Web, Expression Blend(antes Interactive Designer) para diseñarexperiencias interactivas ricas paraWindows y Expression Design (antesGraphic Designer) para el diseño de ele-mentos visuales tanto para experienciasWeb como Windows, y una nueva herra-mienta llamada Expression Media, la cual

aporta gestión de los activos digitales yunifica el flujo de trabajo del equipo através de la suite.

Expression Media -basado en iViewMediaPro, producto comprado reciente-mente por Microsoft- soporta más de 100formatos multimedia y aporta acceso fue-ra de línea a los catálogos visuales, hacien-do más fácil que los profesionales creativosgestionen y usen sus activos digitales.Expression Media incluye ExpressionMedia Encoder, una solución completapara la preparación, codificación y des-pliegue de vídeo y audio rico para expe-riencias Web y Windows. La primera CTPde Expression Media se espera para 2007.

Hay un nuevo recurso para la comu-nidad de diseñadores en http://www.micro-soft.com/design. Éste incluye foros, demosen vídeo y blogs de los equipos. El sitioWeb hace especial hincapié en el diseñocreativo y la experiencia de usuario, ofre-ciendo una visión entre bastidores del pro-

ceso de diseño para los prin-cipales productos, como porejemplo Xbox 360, WindowsVista y 2007 Microsoft OfficeSystem.

Expression Web ya estálisto, mientras que el restodel Expression Studio estáplanificado para entregarseen el segundo trimestre de2007. Expression Blend Beta1 y la CTP de diciembre deExpression Design ya estándisponibles para su desacarga.

Más información y des-cargas en: http://www.micro-soft.com/expression, donde seincluye una versión de eva-luación de 60 días de Expression Web.Hasta la aparición de la primera betade Expression Media en 2007, puededescargarse el iView MediaPro enhttp://www.iview-multimedia.com.

Expression Web entregada y Expression Media anunciada.Éstos comparten productoy nuevos avances de plataforma con la primera CTP de WPF/E

Microsoft presenta Expression Studio y WPF/E

WPF/E es el nombre en clave para la nueva tecnología de presentación Web queha sido creada para ejecutarse en un entorno multiplataforma

El pasado mes de diciembre se presentóla primera CTP de WPF/E(verywhere),de la que precisamente hablábamos elmes pasado en una entrevista con ForestKey, director of developer tools productmanagement en Microsoft. Según él“WPF/E es una combinación de dos par-tes muy importantes: por un lado, un sub-conjunto de XAML, que permitirá rende-rizar texto, imágenes, vídeo, etc.; por otro,una versión del CLR más pequeña y espe-cializada, que permite ejecutar una aplica-ción dentro de un explorador como unplug-in, y por tanto puede ejecutarse encualquier plataforma”.

Scott Guthrie, general manager delequipo que es responsable de la arqui-tectura .NET y WPF/E, la presentabadesde su blog en http://weblogs.asp.net/scott-gu. Según Guthrie “lo que hace a WPF/Erealmente atractivo desde la perspectivadel desarrollador es que es fácil de integrarcon las páginas y sitios HTML existentes.

Los desarrolladores pueden escribirJavascript estándar en una página HTMLpara manipular directamente y progra-marlo contra cualquier elemento XAMLDOM, animación de tramas o vídeo den-tro de WPF/E. Esto permite a los desa-rrolladores añadir fácilmente sus activosWPF/E a sus soluciones HTML AJAX dehoy y ser capaces de usar un código basesimple con un framework AJAX consisten-te para trabajar contra HTML y XAMLDOM sobre la página al mismo tiempo”.

WPF/E es un pequeño runtime quenos permitirá crear páginas y aplicacionesWeb que incluyan contenido rico comográficos vectoriales, animación 2D, texto,audio y vídeo de alta fidelidad (sin necesi-dad de Windows Media Player) y usarAJAX para interactuar entre el contenidode la página y el servidor. Estas páginas yaplicaciones Web podrán ejecutarse encualquier lugar, dentro de navegadores ybajo múltiples dispositivos y sistemas ope-

rativos de escritorio, como por ejemplo,Apple Macintosh.

Esta primera CTP puede ejecutarse ensistemas Windows y Macintosh (tanto x86como PowerPC) y soporta los navegado-res IE, Firefox y Safari.

Para poder ejecutar las aplicaciones, elexplorador del usuario necesita tener ins-talado el paquete WPF/E que puede bajar-se desde http://www.microsoft.com/wpfe, don-de podrá encontrar toda la informaciónactualizada sobre WPF/E.

Page 8: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dotN

etM

anía

<<

8

dnm.noticias<<

Microsoft y la escuela de negocios IDE-CESEM se unen parafomentar la creación de empresas

Microsoft, a través de su Plan Empren-dia, y la escuela de negocios IDE-CESEMhan firmado un acuerdo de colaboraciónpara ayudar a todas aquellas compañías debase tecnológica y nueva creación que pre-cisen de asesoramiento en materia de admi-nistración de empresas. Gracias a este pro-yecto conjunto entre ambas entidades, losdesarrolladores de software españoles quequieran aumentar la competitividad de susproyectos empresariales en un mercadopuntero como el de las Tecnologías de laInformación, tendrán la oportunidad deacceder gratuitamente, como parte de lasinnovadoras iniciativas del Plan Emprendia,

a las sesiones de negocio impartidas en lasinstalaciones del centro de estudios empre-sariales.

El acuerdo alcanzado entre ambasentidades contempla que Microsoft ofre-cerá su apoyo en materia de consultoríatécnica y de desarrollo de software, a travésdel Microsoft Technology Center que lacompañía comparte con el Gobierno deAragón. Por su parte, IDE-CESEM,como Escuela de Negocios, impartirá unasjornadas formativas de dos días de dura-ción (14 horas lectivas), con el fin de dotara los participantes del Plan Emprendia delos conocimientos básicos sobre la impor-

tancia de contar con una fórmula jurídi-ca que avale sus proyectos empresariales.

Entre los temas que se tratarán a lolargo de 2007 en estos SeminariosMultidisciplinares de Creación deEmpresas se encuentran la concienciaciónde la creación de empresas, la determina-ción jurídica de la empresa, cómo elabo-rar un bussines plan y su desarrollo con unaestructura de marketing y comunicación,así como la presentación de casos realesde proyectos emprendedores vinculadosal mundo de las TI.

Más información sobre el PlanEmprendia en www.msdnemprendia.com.

dnm.noticias

Ambas entidades proporcionarán los recursos necesarios, tanto a nivel tecnológico comoempresarial, para que los emprendedores españoles hagan realidad sus proyectos.

expo:QA 2006, III Jornadas profesionales deingeniería, calidad y testing de softwareLos días 27, 28, 29 y 30 de noviembre se celebró en el Hotel Meliá Barajas deMadrid la tercera edición de expo:QA.

Las jornadas, organizadas por inQA.labs, se consolidanen el sector de la calidad y el testing de software, donde losprofesionales cuentan con un área común en la que exponerideas e iniciativas en torno a la mejora de procesos de prue-ba o el incremento de la calidad en sus productos. Además,los principales proveedores muestran sus últimas aportacio-nes a este sector.

En esta edición, con una asistencia de más de 150 perso-nas, participaron empresas de la talla de Microsoft, IBM,inQA.labs, Telelogic, PRQA, IRqA, Compuware, Borland,Mercury y Gesein para disfrute de directores de desarrollo,responsables de proyectos, directores de calidad y, en gene-ral, profesionales de TI. La feria se distribuyó en diferentesmódulos y días:• Cursos especializados para profesionales y centrados en

las áreas de testing (mejora de eficiencia), gestión de pro-yectos (riesgos, PMI), gestión de requisitos (estándaresIEEE, MDA) y unit testing. Entre ellos, cabe destacar lapresencia de Michel Bolton, con el curso de RapidSoftware Testing. En España, es la primera vez que se rea-liza este curso escrito por James Bach, uno de los fun-dadores de Context-driven School of Software Testing.La filosofía de Rapid Testing, al contrario que los méto-dos tradicionales de test, aboga por la simplicidad, dadoque hoy en día los productos son demasiado complejos ylos testeadores resultan demasiado caros. Rapid Testingutiliza un método cíclico, así como métodos heurísticos

para optimizar cons-tantemente el test yadecuarlo a los requi-sitos de sus clientes.Rapid Testing es untest rápido, centradoen una misión que eli-mina el trabajo inne-cesario a favor de lonecesario y constan-temente pregunta quépuede hacer el test para acelerar el proyecto.

• Taller sobre la calidad en entornos colaborativos, don-de los asistentes pudieron experimentar directamentecon las herramientas de Mercury para el testing de soft-ware.

• Presentaciones y exposición de las empresas patrocina-doras. En el último día de la feria tuvimos ocasión de asis-tir a diferentes e interesantes presentaciones sobre VSTF,DOORS, ClearQuest, IRqA con TestDirector y QualityCenter y diferentes casos de éxito basados en SQA, métri-cas, Mercury’s Business Technology Optimization, estan-darización de código, continuous integrated testing, auto-matización de tests y test coverage.

El contenido de las ponencias estará disponible próxima-mente en el portal de inQA.labs: www.inqalabs.com.

Page 9: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos
Page 10: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Planificación de la calidadHace ya algún tiempo escribí en este mismo medio un artículo cuyo título era“Aseguramiento de la Calidad. Normas versus personas”. En aquel momentome preguntaba si la mayor eficacia en la persecución del error la logramos acti-vando políticas de recursos humanos que nos ayuden a contratar a los mejoresprofesionales o si, por el contrario, basta con desarrollar sistemas de controlde calidad que nos ayuden a lograrlo.

por tanto, que parte delo concluido en aquella ocasión deba ser menciona-do nuevamente en esta serie que llevo escribiendo des-de hace varias entregas sobre los signos de madurezde las empresas que desarrollan software. Sin embar-go, y para diferenciar este artículo de aquel otro, enéste me ceñiré a lo que supone la realización de pla-nes de calidad en los proyectos de desarrollo de soft-ware frente a lo analizado allí, que iba más en la direc-ción de indagar sobre qué potenciaba más la calidad,si los métodos o si las personas.

En cualquier caso y, por trabajar con una defini-ción operativa razonable definiremos el aseguramien-to de la calidad en el proceso de desarrollo de softwa-re como la concordancia del software producido con losrequisitos funcionales y de rendimiento explícitamente esta-blecidos, con los estándares de desarrollo explícitamente docu-mentados y con las características implícitas que se esperande todo software desarrollado profesionalmente.

Cualquier compañía de software debe garantizarque con sus productos no se produce el triste espec-táculo de ver a los usuarios de los mismos, durantelos primeros días de cualquier implantación, sufrien-do los múltiples errores que una versión poco teste-ada suele portar. Si los desarrolladores fuéramosconscientes del enorme impacto negativo que estotiene para nosotros, para nuestras empresas, paranuestro prestigio, para nuestro futuro, seguro quenos esforzábamos más en garantizar que nuestrosproyectos tiendan al Zero error tan demandado encualquier metodología para el desarrollo de softwa-re que se precie.

Nuestra profesión no consiste sólo en desarrollarsoftware, consiste en desarrollar software libre de erro-res, y en la consecución de este objetivo el control dela calidad es un pilar básico. En ello se basa nuestratesis de que compañías que no tienen adecuadamen-te protocolizados los mecanismos que usan para garan-tizar que los productos que construyen estén libres deerrores no tienen cabida en el complejo mundo delsoftware actual.

Pero ¿cómo garantizar esto? Bien, no es muydifícil. En primer lugar hay que tener claro que todoproyecto debe tener realizado su correspondienteplan de pruebas y su correspondiente plan de cali-dad. Ambos no deben ser confundidos. El primero

Antonio Quirós

dnm.opinion

<< No me gusta repetirme y odio,

Antonio Quirós es colaborador habitual de

dotNetManía.Co-fundador de las revistas

clippeRManía, FOXManía yAlgoritmo.Actualmente es director de operaciones en

Alhambra-Eidos.

Cualquier compañía de software debegarantizar que con sus productos no seproduce el triste espectáculo de ver a

los usuarios de los mismos (…)sufriendo los múltiples errores que una

versión poco testeada suele portar

Page 11: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

debe contener una definición rigurosa (casos de usode pruebas bien definidos) de todas las pruebas quese han de realizar sobre los distintos componentes,programas, módulos, subsistemas, etc. que se vayana construir. El plan de pruebas debe contener lasinstrucciones para su ejecución y las normas deactuación (iteraciones ante fallo, elaboración delinforme de pruebas, etc.) que debe ejecutarse paraseguir el mismo. Las sucesivas iteraciones sobre laspruebas nos irán dando garantía de que vamos afi-nando hasta lograr el producto libre de fallos quenecesitamos.

El plan de calidad es más abstracto y debe conte-ner, como mínimo, los siguientes elementos:

• Una descripción general de las políticas de cali-dad que estamos aplicando a nuestro proyecto.

• Una relación de todos los entregables del pro-yecto con sus correspondientes criterios deaceptación. Por supuesto que aquí debemosincluir tanto el software como la documenta-ción. Entregables son tanto una especificaciónde requisitos como el acta de una reunión, elcódigo fuente de una clase, el ejecutable de unsubsistema, etc. Diseñado así, es muy fácil paranuestro cliente supervisar el entregable, revi-sar si se cumplen los criterios de aceptación y,si procede, que nos valide la entrega realizada.Así, por ejemplo, un criterio de aceptación delcódigo fuente debería ser que esté escrito segúnla guía de estilo que hayamos determinado, uncriterio de aceptación de un ejecutable es quehaya pasado el correspondiente plan de prue-bas, etc.

• Una descripción de las labores de control ymonitorización que se han realizado en el pro-yecto. Por supuesto que dichas labores debencorresponderse con las que hayamos determi-nado como genéricas en nuestra política de cali-dad. Cualquier excepción debe ser remarcadacon la explicación correspondiente que la hahecho posible.

• La matriz de trazabilidad de los requisitos esuna pieza importantísima del control de calidad,ya que es la que nos garantiza que todos losrequisitos de usuario están tratados en los corres-pondientes requisitos de sistemas y/o en los casosde uso.

• Una lista de comprobación de que todas las acti-vidades de control de calidad se han llevado acabo, con la fecha y el nombre del responsablede verificarlas. Aquí debería certificarse que sehan realizado las pruebas (tanto las unitariascomo las de integración) y que los resultadosson satisfactorios, que se han realizado igual-mente las peer reviews, que no quedan inciden-cias reportadas por el cliente y pendientes deresolver, etc.

Hay que reseñar también que el control de cali-dad va más allá de la duración del propio proyecto ydebe también proponer qué otras acciones de audito-ría posterior realizaremos sobre el proyecto objeto delplan. Algunas cuestiones muy interesantes son:

• La realización del análisis post-mortem. Este esun informe de resumen del proyecto dondedeben recogerse los parámetros básicos de suejecución: confrontación de datos estimados yreales, incidencias específicas a mencionarse yapreciaciones especiales tanto del jefe como deotros miembros del equipo del proyecto.

• El paso del proyecto por la comisión de buenasprácticas en la que se debe analizar todas las prác-ticas que hayan contribuido a que el proyectohaya sido exitoso. Todo ello con el fin de trans-mitir al resto del personal técnico dicha infor-mación y garantizar así la repetibilidad de estoséxitos en el futuro.

• El paso del proyecto por el foro de errores de lacompañía para que en dicho foro se reseñen todasaquellas decisiones incorrectas que se han con-cretado en un daño de cualquier tipo para el pro-yecto. La finalidad de este instrumento, obvia-mente, no es señalar culpables, sino analizar cau-sas y corregir problemas para el futuro.

En fin, para concluir ya, simplemente remarcarque el hecho de que una empresa tenga determinadasu política de calidad y que realice planes de calidadad hoc para cada proyecto que desarrolla no es un ele-mento baladí sino que representa un signo, más querelevante, de que tiene el suficiente grado de madu-rez como para garantizar que el éxito que haya obte-nido en proyectos anteriores no es fruto del azar sinoque obedece al desarrollo de unas prácticas adecuadasy que, por tanto, podemos tener garantía de la repe-tibilidad de dicho éxito.

dotN

etM

anía

<<

11

dnm.opinion<<

La matriz de trazabilidad de los requisitos es una pieza importantísima

del control de calidad, ya que es la que nos garantiza que todos los

requisitos de usuario están tratados en los correspondientes requisitos de

sistemas y/o en los casos de uso

Page 12: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Entrevista a David Chappell

Con ocasión de la conferencia de SOA y Business Process celebrada recientementeen Madrid, tuvimos la ocasión de charlar con David Chappell, Principal de Chappell &Associates (www.davidchappell.com) en San Francisco.David es además autor de librossobre software empresarial que se han publicado en diez idiomas y se han utilizado enciertas carreras del MIT, la ETH de Zurich y docenas de otras universidades.Es ponen-te habitual en eventos y conferencias en Estados Unidos,Europa,Asia y Latinoamérica.

¿podría presentarse ante los lectores?Me llamo David Chapell, soy conferenciante,

escritor y consultor de Chapell & Associates en SanFrancisco, California. Estoy ampliamente focalizadoen tecnología .NET, aunque también he realizadolabores de consultoría para empresas como HP, IBMy otros.

Mi último libro se titula “Understanding .NET”y últimamente he escrito una gran cantidad de artí-culos sobre .NET Framework 3.0.

He venido a España como ponente en la edicióneuropea del Tech-Ed y actualmente estoy realizandodiversas charlas en un tour por toda Europa, entreellas la de hoy sobre SOA y BPM.

La semana pasada estuvo, pues, en el Tech-Edeuropeo de Barcelona. Para los que no pudieron asis-tir a la cita, ¿qué aspectos le gustaría destacar?

El Tech-Ed es un gran evento, por lo que es difí-cil resaltar unas partes respecto a otras aunque, lógi-camente, hubo mucha atención en torno a la presen-tación de .NET Framework 3.0.

Por otro lado, hubo una gran cantidad de sesio-nes sobre LINQ (Language Integrated Query) a cargode su creador, Anders Hejlsberg, que fueron de lasmás comentadas.

En anteriores ediciones del TechEd presentóBusiness Process Management, pero también Java y.NET. ¿Cómo resumiría para nuestros lectores loscontenidos de esas sesiones?

En la sesión sobre BPM tuvimos ocasión de revi-sar cuál es la estrategia que Microsoft está siguien-

do hoy en día para aplicar soluciones BPM. Los pro-ductos y tecnologías que, según Microsoft, caen den-tro de la categoría general de BPM son Biztalk Server2006 y Windows Workflow Foundation (WF), uni-do al soporte para WF incluido en SharepointServices 3.0 y Microsoft Office Sharepoint Server2007. Existen dos perspectivas en la forma en queMicrosoft está planteando los motores de flujos detrabajo. Dos motores de proceso separados con suspropias herramientas, uno para flujos de trabajo desistema con Biztalk y otro para flujos de trabajohumanos con Windows Sharepoint Services. Hayquien puede pensar que eso no es un BPM, a menosque se combinen ambos planteamientos y, por tan-to, en mi charla pudimos revisar estas tecnologías ycomentar casos como éste.

Carlos Salazar

dnm.directo.entrevistas

<< En primer lugar,

Carlos Salazar es director de Raona Madrid,

ingeniero superior en Informática y posee las

certificaciones MCSD VB yMCSD.NET.

Page 13: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

En la otra sesión, “Comparing .NET and Java,the view from 2006”, tuvimos ocasión de revisarcómo se plantea el futuro de ambas tecnologías, locual resulta bastante interesante dada la situaciónen que nos encontramos. Por un lado, en el mun-do .NET sabemos lo que viene después del .NETFramework 2.0 y es exactamente el .NETFramework 3.0. En cambio, en el mundo Java lacosa es bastante más compleja. En el mundo Java,J2EE 1.4 se encuentra instalado en la mayoría deservidores de aplicación Java existentes pero, miran-do al futuro, existen diferentes alternativas queseguir. No es obvio decidir cuál de estas alternati-vas triunfará después de J2EE 1.4, y eso es lo quepudimos ver en esta sesión comparándolo, porsupuesto, con la evolución en .NET con elFramework 2.0 y 3.0.

A día de hoy existen tres iniciativas diferentes enesta evolución de J2EE:

• JEE5. Liderada por Sun y, por tanto, el suce-sor oficial de J2EE 1.4

• Open SOA. Liderada por IBM y BEA, y en laque podemos encontrar también otras empre-sas adyacentes como Oracle, SAP y, por qué no,Sun. Es en esta iniciativa donde encontramosdos nuevas tecnologías que están adquiriendoimportancia: Service Data Objects (SDO) y ServiceComponent Architecture (SCA).

• El mundo open source. Iniciativa que no está bajocontrol de ninguna empresa y que ha produci-do tecnologías tan relevantes como Struts,Spring Framework, Hibernate, etc.

Es posible que en el futuro no se siga ninguna deestas alternativas o se imponga alguna versión mixtade todo esto, lo cual supondría un gran retraso, ya quesignificaría que ninguna de esas opciones atrae sufi-cientemente a los desarrolladores para ser un compe-tidor real ante .NET; y .NET, como todos, necesitacompetidores.

Siguiendo con BPM, ¿nos podría sintetizar los prin-cipales puntos de Business Process Management y suimportancia para el mercado?

Debemos analizar la gestión de procesos denegocio (BPM) desde el punto de vista del negocioy desde el punto de vista de la tecnología. La visiónde negocio no está totalmente separada de la visióntecnológica, ya que una persona de negocio debeutilizar ciertas herramientas para revisar y gestio-nar los procesos de una organización. Asimismo,desde el punto de vista tecnológico se debe facili-tar la creación, gestión y monitorización de la lógi-ca de los procesos, los flujos de trabajo y las orques-taciones y, por tanto, debemos proporcionar herra-mientas que permitan trabajar, definir, ejecutar ymonitorizar esos procesos.

¿De qué manera podemos orientar el beneficio en eluso de BPM en las organizaciones?

Lógicamente, el beneficio lo obtendremos en lamedida en que las organizaciones se enfoquen a:

• Estandarizar las comunicaciones orientadas aservicio utilizando protocolos comunes comoSOAP para comunicar aplicaciones y con la uti-lización de un marco de trabajo común para cre-ar aplicaciones orientadas a servicios, en estecaso Windows Communication Foundation(WCF).

• Crear la infraestructura orientada a serviciosnecesaria, no únicamente mediante el uso deSOAP sino también con el uso de un Enterprise

dotN

etM

anía

<<

13

dnm.directo.entrevistas<<

Page 14: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Service Bus (ESB) como middleware que sopor-ta la comunicación e interacciones entre apli-caciones, usuarios, procesos de negocio y otrosservicios.

• Utilizar tecnologías BPM de forma efectiva.Independientemente del punto de vista denegocio o tecnológico que comentábamosanteriormente, debemos disponer de herra-mientas de ejecución de flujos de trabajo,herramientas gráficas para el diseño de losmismos, herramientas para implementar solu-ciones de integración, motores de reglas denegocio (Business Rules Engines –BRE–) y, porsupuesto, herramientas de monitorización(Business Activity Monitoring).Basándonos en la oferta de Microsoft para BPM,estamos hablando de productos como BiztalkServer 2006, Windows Workflow Foundation(WF) y Windows Sharepoint Services 3.0(WSS) complementándolo con Microsoft OfficeSharepoint Server 2007 (MOSS 2007).

Así pues, en el ámbito de BPM, ahora Microsoftcubre todas las áreas que indicábamos, desde BAMo la integración con Biztalk hasta los flujos de tra-bajo con Windows Sharepoint Services 3.0 y MOSS2007. Además, Windows Sharepoint Services ya seincluye con Windows 2003 Server, por lo que pocoa poco veremos cómo se va imponiendo su uso en

nuestras organizaciones. También podremos vercómo Windows Workflow Foundation (WF) se vaa utilizar en diferentes áreas, ya sea alrededor de latecnología Microsoft o por terceros.

En muchas organizaciones, SOA es todavía undeseo o un objetivo de futuro más una realidad. Entretodos los beneficios que promete SOA, ¿qué cree quese mantendrá en el futuro?

Soy bastante escéptico en lo que respecta a la habi-lidad de las organizaciones para conseguir los objeti-vos de reusabilidad de SOA y, de hecho, no conse-guirlos podría ser decepcionante para muchas empre-sas. Pero la gente debe darse cuenta de que hay unaparte muy importante que hay que comprender en lainfraestructura necesaria de un ASP o en cómo debenaplicar tecnologías BPM a su problemática y situa-ción interna. Todas estas iniciativas son movimientosque fortalecen y hacen progresar a las organizacionesy, por tanto, la gente no debería decepcionarse si nosiguen al pie de la letra los principios de reutilizaciónprometidos por SOA, ya que de hecho sí que estánmejorando las comunicaciones y la infraestructura desus organizaciones.

¿Podemos hablar de enriquecer la experiencia deusuario desde el punto de vista de SOA?

En efecto, si analizamos los beneficios de SOAdesde el punto de vista de la interfaz de usuario,podemos pensar en unificar y fortalecer la expe-riencia de usuario. Así, debería ser más fácil desa-rrollar interfaces gráficas que se comuniquen condiversas aplicaciones de una forma consistente. Portanto, en el mundo de .NET Framework 3.0 estosignifica que WPF puede aportar una plataformacomún para definir interfaces de usuario que emple-en servicios reutilizables. Creo que en el mundoSOA podríamos tener ese tipo de estándar de defi-nición en cliente.

A pesar de que me considero una “persona de ser-vidor”, últimamente he tenido ocasión de revisar todolo que incluye WPF y creo que es increíblemente inte-resante ver cómo podemos crear nuevas GUI conWPF.

Cuando un desarrollador escucha alguna infor-mación sobre Vista API se siente un poco abrumadopor la cantidad de input que recibe. ¿Serán Vista yLonghorn una especie de “pruebas de habilidad” paralos programadores?

En este caso lo importante no es lo difícil que pue-da ser una u otra tecnología, sino determinar qué tec-nologías de todas las disponibles nos interesan máspara nuestro trabajo. Por ejemplo, si hablamos de.NET Framework 3.0, lo importante es que un desa-rrollador especialista en interfaces de usuario se cen-tre en WPF y no tanto en WF, donde sólo puede nece-sitar ciertos conocimientos de referencia. Así pues,habrá que focalizarse en lo que hacemos y compren-der el resto de tecnologías existentes.

dotN

etM

anía

<<

14

dnm.directo.entrevistas<<

Page 15: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

actualizar proyectos existentes es inte-resante de por sí, en este artículo vamos a tratar lasprincipales diferencias entre C++/CLI y los demáslenguajes .NET. Aún así, debemos citar la que es,bajo todos los aspectos, la primera y principal ven-taja de C++/CLI sobre Visual Basic (C# es un len-guaje nuevo y por ello no tiene código antiguo), queconsiste en la posibilidad de recompilar con míni-mas modificaciones –generalmente ninguna– todoel código C++ existente. Evidentemente, no gana-mos nada con ello salvo la posibilidad, ya citada, deir añadiendo funcionalidades nuevas a un proyectoexistente. Entre las aplicaciones más destacadas deesta técnica está la de utilizar Windows Forms den-tro de una aplicación MFC o ir añadiendo elemen-tos .NET al proyecto. Es lo que Microsoft llamajust do it.

Asignación en pila/montículo manejadoMientras que en otros lenguajes .NET no existe

forma sintáctica de diferenciar si nuestra variable esuna referencia o un objeto en sí, C++/CLI nos obli-ga a que decidamos nosotros dónde va nuestro ele-mento, si en el montículo manejado (heap) o en lapila (stack). De hecho, disponemos de cuatro formasde definir/instanciar una clase.

En primer lugar tenemos las clases-valor (valueclass), que Microsoft recomienda se utilicen para defi-nir tipos sencillos y similares a los nativos. Los obje-tos de este tipo normalmente se colocan en la pila,pero nada nos impide instanciarlos en el montículo.

El segundo tipo de clase, y el más utilizado, es laclase-referencia (ref class), equivalente a las clasesde los otros lenguajes. En este caso, la instanciaciónpor defecto ha de realizarse en el montículo mane-jado, pero tampoco tendremos ningún impedimen-to si queremos obtener una variable en la pila.

En el fuente 1 podemos observar cómo a los obje-tos alojados en el montículo se accede mediante eloperador flecha (->) como si de un puntero se trata-ra, y se instancian mediante el operador ^ para dis-tinguirlos de los tipos valor, a los que se accedemediante el operador punto. Esta decisión de diseñoha sido profundamente pensada por los creadores dellenguaje para evitar los problemas con la versión ante-rior del lenguaje C++ para CLR, de forma que aho-ra conocemos en todo momento el tipo y caracterís-ticas del objeto que estamos usando.

Una ventaja importante de lo anterior consisteen que si estamos leyendo código, rápidamente pode-mos determinar si una variable cualquiera es una refe-

dotN

etM

anía

<<

15

C++/CLI: un nuevo enfoque al desarrollo en C++ para .NET

C++/CLI es el lenguaje de bajo nivel dentro del mundo .NET,puesto que permite rea-lizar tareas que son prácticamente imposibles con otros lenguajes;aparte de ello,per-mite ir incorporando paulatinamente facetas de .NET a proyectos ya existentes, tan-to Win32 como MFC.Otros aspectos importantes son el rendimiento (tanto dentrodel propio .NET Framework como en los cambios de contexto entre manejado/nati-vo) y la facilidad para mezclar ambos tipos de código.

<< Aunque el tema de

Rafael Ontivero “RFOG”

dnm.lenguajes.net

Rafael Ontivero tiene más de 20 años de

experiencia como programadoren múltiples lenguajes y entornos

y como responsable de equiposde desarrollo.Actualmente es

director técnico para España dela multinacional Suzo STC.

Otra de las mayores y más importantesdiferencias de C++/CLI con otros

lenguajes .NET la ofrece la destruccióndeterminista

Page 16: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

rencia o el propio objeto, a diferencia de C# o VB, enque deberemos tener presente su tipo.

Destrucción determinista

Otra de las mayores y más importantes diferen-cias de C++/CLI con otros lenguajes .NET la ofrecela destrucción determinista. Mientras que en los otroslenguajes el programador nunca sabe cuándo sus obje-tos serán liberados por el sistema, en C++/CLI la libe-ración se puede forzar cuando se estime oportuno.Con esto no queremos decir que los programadoresestén obligados a liberar sus recursos manualmente–poco habríamos ganado entonces frente al C++ tra-dicional–, sino a que podemos, voluntariamente, des-truir nuestros objetos cuando queramos sin tener queestar pendientes del recolector de basura, lo que enciertas situaciones de estrés en las que creamos y des-truimos objetos de forma continuada nos supone unaevidente ventaja sobre otros lenguajes, pues nuestrosobjetos son destruidos inmediatamente, evitando asíagotar el montículo manejado o volver loco al reco-lector de basura.

El concepto subyacente es bastante complejo y estárelacionado con la interfaz IDisposable, pero podemosexplicarlo bastante fácilmente sin necesidad de meter-nos en los entresijos de .NET Framework.

Para no ser demasiado prolijos, diremos que enC++/CLI existen dos tipos de destructores. Si median-te el operador gcnew obtenemos la referencia a un nue-vo objeto alojado en el montículo manejado, con dele-te realizamos su liberación. También podemos dejarque nuestra referencia salga de ámbito, momento enel cual el objeto al que representa quedará marcadopara su destrucción cuando el recolector de basura loestime oportuno.

Si utilizamos delete estamos empleando destruc-ción determinista; si no lo hacemos, estamos dejandoque el sistema se ocupe de la liberación (de igual for-ma que en C#). Pero ¿qué ocurre cuando nuestra cla-se incorpora otros objetos no manejados y estamosdejando al recolector de basura que se encargue detodo? ¿Debemos implementar toda la parafernalia delmétodo Dispose() y demás?

No es necesario, ya que C++/CLI presenta uncomportamiento más sencillo. Debemos implemen-tar dos destructores: el destructor típico del C++ tra-dicional y otro nuevo, conocido como destructor definalización. En el primero pondremos el código nece-sario para la liberación de los recursos manejados ynativos si los hubiera, y en el segundo sólo incluire-mos la liberación de los nativos. No es necesario decirque no necesitamos el destructor de finalización si nohemos asignado recursos nativos.

El fuente 2 muestra un ejemplo un tanto artificialpero que expone lo explicado hasta ahora. La claseDestruccion cuenta con los dos destructores antesmencionados, y dentro de main() creamos tres obje-tos, uno de ellos en pila y otros dos alojados en elmontículo. Al final llamamos a delete para liberar solo

dotN

etM

anía

<<

16

dnm.lenguajes.net<<

#using <system.dll>

using namespace System;

// *** Este tipo de clase sólo debe utilizarse para tipos pequeñosvalue class ClaseValor{public:void Presentate(String ^inst){Console::WriteLine(

L”Hola, soy una clase valor y me instancian en {0}”,inst);}

};

// *** Este tipo de clase es 100% compatible con otros lenguajes .NETref class ClaseRef{public:void Presentate(String ^inst){Console::WriteLine(

L”Hola, soy una clase referencia y me instancian en {0}”,inst);}

};

int main(void){ClaseRef ^crMonti = gcnew ClaseRef();crMonti->Presentate(“montículo”);

ClaseRef crPila;crPila.Presentate(“pila”);

ClaseValor ^cvMonti = gcnew ClaseValor();cvMonti->Presentate(“montículo”);

ClaseValor cvPila;cvPila.Presentate(“pila”);

// *** No es necesaria la liberación determinista explícita// delete crMonti;// delete cvMonti;

}

Fuente 1. Instanciación y uso de clases-valor y clases-referencia

NOTA

Para compilar el código de ejemplo, se debe disponerde una copia de Visual Studio 2005 con el soporte deC++ instalado o de Visual C++ 2005 Express. En elmenú de inicio de Windows, dentro de la carpeta VisualStudio/Tools, se instala una serie de accesos directospara obtener consolas de comandos listas para podercompilar dentro de ellas. Abriendo una de ellas y tecle-ando cl /clr <fichero.cpp> podremos compilar y eje-cutar los ejemplos suministrados. ][

Page 17: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

uno de ellos, y dejamos que sea el sistema el que seencargue del otro.

En la figura 1 podemos ver qué ocurre exactamen-te. El objeto abandonado al sistema (porRef2) llama aldestructor de finalización debido a que es el sistemaquien libera los recursos manejados y nos deja a noso-tros la tarea de liberar los nativos. El otro objeto asig-nado por referencia, al ser eliminado por nosotros, eje-cuta el destructor normal y determinista.

El lector atento habrá observado que tambiénse llama al destructor normal del objeto referen-ciado por valor. ¿No debería llamarse al de finali-zación, puesto que es .NET quien lo libera? Bien,la explicación es muy sencilla: dentro de .NETFramework, una clase ha de estar alojada en elmontículo para que el recolector de basura puedarealizar su trabajo, y si podemos alojarla en la pila

gracias a las características especiales de C++/CLI,estamos forzando, de nuevo, destrucción determi-nista… que ocurrirá cuando la variable salga deámbito.

En otras palabras, en C# (o VB.NET) una varia-ble de tipo referencia no almacena el objeto en sí, sinouna referencia a él, por lo que cuando se sale de ámbi-to lo que desaparece no es el objeto, sino la variableque lo representa (y el objeto queda marcado para sudestrucción, sin saber cuándo lo será). En el caso quenos ocupa, lo que se destruye es el propio objeto, porlo que estamos, de nuevo, operando con destruccióndeterminista.

Pero aquí C++/CLI no está jugando limpio connosotros, ya que el diseño de .NET prohibe alojarobjetos en la pila, y el lenguaje realmente está cum-pliendo las reglas. Nuestro objeto teóricamente situa-do en la pila, realmente lo está en el montículo, peroel compilador nos ofrece la apariencia de que está don-de nos pensamos. Lo que sí se está cumpliendo es ladestrucción determinista.

Código limpioEn la versión anterior de C++ para el CLR, cono-

cida como Extensiones manejadas, una decisión de diseñopoco cuidadosa llevó a que el programador se sintie-ra bastante incómodo y desorientado cuando estabaleyendo e interpretando código fuente.

dotN

etM

anía

<<

17

dnm.lenguajes.net<<

#using <system.dll>

using namespace System;

ref class Destruccion{

int m_id;public:

Destruccion(int id){

m_id=id;Console::WriteLine(“Soy el constructor de {0}”,id);

}~Destruccion(){

Console::WriteLine(“Soy el destructor normal de {0}. Debes liberar recursos manejados y no-manejados”,m_id);}

protected:!Destruccion(){

Console::WriteLine(“Soy el destructor finalización de {0}. Debes liberar sólo recursos no-manejados”,m_id);}

};

void main(void){

Destruccion porValor(0);Destruccion ^porRef1 = gcnew Destruccion(1);Destruccion ^porRef2 = gcnew Destruccion(2);

delete porRef1;}

Fuente 2.Destrucción determinista

Figura 1. Programa del fuente 2 en ejecución

Page 18: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

En esta versión, este problema se ha solucionadode forma elegante y limpia. Disponemos de la mis-ma categoría de clase, la clase manejada (instanciadamediante ref class), pero ahora estamos completa-mente seguros de qué nos llevamos entre manos.

Como una clase manejada es un concepto de cla-se distinto al del tradicional en C++, la instanciamoscon la nueva palabra reservada gcnew, y su manejadores el “tejadillo” en lugar del asterisco; de esta formasomos plenamente conscientes de qué estamoshaciendo. Durante la vida del objeto ya no es nece-sario que sepamos si es una referencia o un punteropuesto que sólo tenemos que usarlo, y finalmente ala hora de su destrucción también nos es en ciertamedida indiferente, por lo que no se añade ningunapalabra reservada más. Estamos, pues, interfiriendolo menos posible en el lenguaje y consiguiendo teneruna nueva categoría de clase sin afectar para nada alcódigo existente ni a las futuras ampliaciones de C++,como el próximo TR0.

Esto nos lleva al siguiente paso natural, que es elde disponer de referencias de seguimiento (trackingreferences); igual que podemos tener una referencia aun objeto o a un puntero dentro del mundo nativo,también podemos tenerla en el manejado. El con-cepto subyacente es el de “alias”, “etiqueta” o “ele-mento de seguimiento”, y nada tiene que ver con elconcepto de referencia CLR, aunque a simple vistaparezca lo mismo.

Al contrario que en el C++ tradicional, aquí el sis-tema en tiempo de ejecución sí que mantiene el segui-miento y no destruye el objeto hasta que todas susreferencias de seguimiento hayan desaparecido.

Otro concepto heredado de C, que C++ mantu-vo y que por supuesto también soporta C++/CLI, esel paso de una cantidad variable de argumentos a fun-ciones, y al igual que todo dentro del CLR, es unmecanismo seguro en cuanto a tipos y a desborda-mientos, puesto que los argumentos se reciben comoun array. La única limitación consiste en que todoshan de ser del mismo tipo.

El fuente 3 muestra estas dos características.Inicialmente implementamos una función global querecibe un número indeterminado de parámetros deltipo Int32 y devuelve la suma de los mismos. En elinterior de ésta podemos ver cómo recorrer todos ycada uno de los parámetros pasados. También podría-mos haber usado la propiedad Length del array.

Ya en main() llamamos a la función pasándole 4enteros, asignamos el valor devuelto a la variable resy lo mostramos en pantalla. Las instrucciones siguien-tes toman una referencia del valor devuelto, incre-mentan res dentro de la función suma1res(), y mues-tran por pantalla el valor de res pero utilizando sureferencia de seguimiento. El valor mostrado será 21.Comprobamos que trackRes sigue en todo momen-to y ejecuta sobre la variable res.

Interop o “It Just Works”

En C# puede producirse cierto desaliento cuan-do toca bregar con elementos de Win32 que no tie-nen su equivalente directo dentro de las clases .NET,dado que las llamadas a código nativo pueden resul-tar demasiado abstrusas y engorrosas de implemen-tar. Mientras tanto, en C++/CLI el uso de códigonativo es directo: tan solo se ha de incluir el ficherocabecera correspondiente y realizar las llamadas ade-cuadas. De hecho, una clase manejada puede conte-ner punteros a elementos nativos siempre y cuandono se desee código seguro.

En el fuente 4 podemos observar con detalledos aspectos del mismo concepto. En primer lugar,dentro de main() se han colocado dos salidas detexto, una nativa utilizando los flujos estándar deC++ y la otra mediante un método de la claseConsole de .NET Framework. A continuación, unaclase manejada que contiene un puntero a otra nati-va, instanciada en el constructor de la primera.Observe que en la manejada se han implementadolos dos destructores y en ambos se libera explíci-tamente el puntero nativo. Conociendo el ejem-plo, y sabiendo que esta clase sólo va a ser destruidapor el recolector de basura, no es necesaria laimplementación del destructor de finalización, peroes buena idea tenerlo por lo que pudiera pasar.

dotN

etM

anía

<<

18

dnm.lenguajes.net<<

using namespace System;

Int32 suma(... array<Int32>^args){

Int32 sum=0;for each(Int32 d in args)

sum+=d;return sum;

}void suma1res(Int32% r){

r++;}

int main(void){

int res=suma(2,4,6,8);Console::WriteLine(res);

int% trackRes=res; // referencia de seguimientosuma1res(trackRes);res++;

Console::WriteLine(trackRes);Console::WriteLine(res);

return 0;}

Fuente 3.Manejo de referencias de seguimiento y paso deargumentos variables.

Page 19: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Mezcla de variables

Disponemos de dos posibilidades a la hora de mez-clar variables nativas y manejadas, o más bien una for-ma de convertirlas y otra más para utilizar una varia-ble o clase manejada directamente desde el códigonativo siempre que su formato sea compatible.

La conversión de variables nativas a variablesmanejadas y viceversa requiere, igual que en losdemás lenguajes .NET, el uso del marshaling, porlo que no vamos a entrar en detalles; simplementeafirmar que mediante la clase Marshal es posible laconversión.

Pero hay veces que es necesaria no la conversión,sino el uso directo de una variable manejada por códi-go nativo, como en el caso de funciones de retrollama-

da, o simplemente por una cuestión de rendimiento.Es lo que se conoce como bloqueo o fijación de una varia-ble, operación que se realiza mediante el uso de unpin_ptr convenientemente asignado.

El acto de bloquear un elemento CLI es en símismo bastante peligroso, pues lo que se está hacien-do es marcar dicho elemento como no movible, porlo que el recolector de basura no podrá ni moverloni liberarlo hasta que no se desbloquee. Esto signi-fica que en determinadas situaciones se impida larecolección y compactación de memoria, así comola asignación de nueva memoria aunque ésta estédisponible.

El fuente 5 nos muestra cómo realizar un blo-queo sobre un elemento de una clase. La clase mane-jada TipoManejado posee una variable miembro públi-ca. Dentro de main(), inicialmente asignamos dichavariable a un puntero del tipo pin_ptr (que bloqueael objeto dentro del CLR, imposibilitando su movi-miento dentro del montículo), para luego asignarleel valor 8. Más adelante, asignamos el puntero blo-queado a un nuevo puntero nativo, y asignamos 255al entero al que éste último apunta. La salida porpantalla es 8 y 255.

dotN

etM

anía

<<

19

dnm.lenguajes.net<<

En C++/CLI el uso de código nativoes directo: tan solo se ha de incluir elfichero cabecera correspondiente y

realizar las llamadas adecuadas

#using <system.dll>

using namespace System;

#include <iostream>

using namespace std;

class ClaseNativa{public:ClaseNativa(){cout << “Ctor nativo “;

}};

ref class ClaseManejada{ClaseNativa *pNativa;

public:ClaseManejada(){pNativa = new ClaseNativa();cout << “en Ctor manejado” << endl;

}~ClaseManejada(){delete pNativa;

}protected:!ClaseManejada(){delete pNativa;

}};

void main(void){cout << “Hola, Mundo en C++ nativo” << endl;Console::WriteLine(“Hola, Mundo en C++ manejado”);

ClaseManejada ^m = gcnew ClaseManejada();

// *** Dejamos la liberación al recolector de basura}

Fuente 4.Utilización de código nativo en C++/CLIusing namespace System;

ref class TipoManejado { public:

int i; };

int main(){

TipoManejado ^mt = gcnew TipoManejado; pin_ptr<int> pt = &mt->i; *pt = 8; Console::WriteLine(mt->i);

char *pc = (char*) pt; *pc = 255; Console::WriteLine(mt->i);

}

Fuente 5. Bloqueo de variables

Page 20: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Métodos y variables globales

En C++/CLI también podemos disponer de funcio-nes globales, tanto nativas como manejadas, con la ayu-da del preprocesador. Si queremos disponer de un méto-do manejado global tenemos que rodearlo de las direc-tivas #pragma managed y #pragma unmanaged, y justamen-te lo contrario en el caso de querer tener un método nati-vo. El uso de las directivas anteriores es opcional lamayoría de las veces, pero es conveniente indicarlo paraclaridad.

El uso de variables CLR globales está restringidoa los tipos de datos que se alojan en la pila. Por ellono podremos tener variables manejadas estáticas niglobales que sean referencias.

El fuente 6 nos muestra cómo realizar estas tareas.Observe al final de main() que no es necesario el mars-haling a la hora de convertir un tipo nativo en otro mane-jado siempre que exista un constructor para ello. La asig-nación de la cadena al puntero cadGlobal pudiera inter-pretarse como un error, pero no lo es, puesto que asig-namos un puntero a una cadena estática previamentesituada en el segmento de datos.

Observe también la declaración de una variablemanejada global llamada intGlobal.

Rendimiento y optimización

C++/CLI es el lenguaje que produce un mejor ren-dimiento dentro de la plataforma .NET. Dentro delas partes de código manejado, el compilador realiza,debido a las características inherentes al mismo, todauna serie de optimizaciones sobre el código fuenteque otros lenguajes no llevan a cabo. Con respecto alos segmentos de código nativo, está claro para todosque su rendimiento está muy por encima del de VisualBasic, Delphi o cualquier otro lenguaje existente,excepto quizás del de C.

También dentro de los cambios de contexto entrecódigo manejado y no manejado el C++/CLI gana porgoleada a los demás lenguajes en cuanto a velocidad y,como ya hemos visto, facilidad. En el artículo “A ratio-nal attempt to substantiate C++/CLI as a first class CLIlanguage”, de Nishant Sivakumar, disponible enhttp://www.codeproject.com/managedcpp/whycppcli.asp,se detalla la diferencia de rendimiento entre C# yC++/CLI durante la ejecución de transiciones repetidasentre código nativo y manejado.

Plantillas, genéricos y STL.NETLos programadores de las versiones más recien-

tes de Visual Basic .NET y C# tienen a su disposicióntoda la potencia de los tipos genéricos, y no hay nique decir que el C++/CLI los soporta también porcompleto. Pero las plantillas (en inglés templates) sonotra cosa. Mientras que la resolución de tipos en losgenéricos se lleva a cabo en tiempo de ejecución, la

de las plantillas se realiza en tiempo de compilación,lo que permite detectar antes posibles problemas yevitar así la generación de excepciones durante la eje-cución del programa.

Otra diferencia muy importante entre estos dos ele-mentos consiste en que para las plantillas el compiladorgenera código para cada tipo de dato instanciado, de for-ma que si a partir de una misma plantilla definimosmuchos tipos de datos nuevos, el código crecerá de for-ma consecuente, mientras que con los genéricos, eltamaño del código será el mismo independientementede la cantidad de tipos de datos “concretos” definidos, ysolo ocuparán espacio en tiempo de ejecución confor-me se vayan necesitando, mientras que con las plantillasestará presente todo el código.

Un programador de C++ sin la STL (StandardTemplate Library, biblioteca que forma parte del están-dar de C++) es un programador al que le falta lo másbásico para trabajar. La STL es una colección de plan-tillas que representan estructuras de datos altamenteoptimizadas y funcionales, así como algoritmos e ite-radores para ser aplicados a esos datos.

La STL clásica se puede utilizar sin problemas den-tro del lenguaje C++/CLI para código nativo, pero paratipos .NET es necesario seguir siempre una serie de reglasexplicadas en el artículo “A rational attempt to substan-tiate C++/CLI as a first class CLI language” ya citado;

dotN

etM

anía

<<

20

dnm.lenguajes.net<<

#using <system.dll>

using namespace System;

#include <iostream>

using namespace std;

Int32 intGlobal;

#pragma managedvoid metodoManaged(void){Console::WriteLine(“método manejado”);

}#pragma unmanaged

void metodoNativo(void){cout << “método nativo” << endl;

}char *cadGlobal;#pragma managed

void main(void){metodoManaged();metodoNativo();cadGlobal =

“Asignación nativa dentro de codigo manejado”;String ^s = gcnew String(cadGlobal);Console::WriteLine(s);

}

Fuente 6.Métodos y variables globales

Page 21: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

también podemos mezclar genéricos y plan-tillas mediante herencia. El uso conjunto deestas dos últimas características conlleva unimportante coste en rendimiento, por lo queno se recomienda su uso.

Está previsto que dentro de unosmeses Microsoft ofrezca lo que se ha dadoen llamar STL.NET, que no es otra cosaque la implementación de la STL reali-zada íntegramente en C++/CLI bajo lacobertura de .NET Framework, elimi-nando así todos los problemas de rendi-miento y la necesidad de tener que utili-zar código mixto.

Diferencias menores con losdemás lenguajes

Pero no por ello menos importantes.No suele ser muy habitual el uso del pre-procesador dentro del mundo manejado,quizás por el grado de simplificación al quese le ha reducido en los lenguajes CLR,pero para C++/CLI se encuentra presentecon toda la potencia equivalente a la de suimplementación del C++ nativo. Podemosdefinir macros con valores, macros función,macros con argumentos variables, conca-tenaciones y un largo etcétera.

Dado que una clase manejada no pue-de contener variables constantes, ni tam-poco serlo, se ha implementado la palabrareservada literal para realizar la mismafunción; esto es, ser equivalente a staticconst. Es común sustituir los númerosmágicos que pueblan el código con macros,o con elementos static const dentro declases (que conservan el tipo y permitenevitar errores tontos, pues realizan una comprobaciónsintáctica completa). Una variable literal no ocupa espa-cio de almacenamiento, sino que es directamente susti-tuida allí donde se haya indicado.

Los punteros interiores (interior_ptr) son un tipoespecial de punteros permitido solamente enC++/CLI. Como su nombre indica, son punteros den-tro de un tipo referencia, esto es, son punteros a algúnelemento interno de una clase, y su característica prin-cipal es que siguen a la clase dentro del montículo, porlo que se les permite todo lo que a un puntero nativo.Un puntero interior puede contener la dirección deun objeto del tipo value class situado en la pila, o ladirección de un manejador a un objeto en el montí-culo CLR, pero no la del propio objeto situado en elmontículo manejado; también puede apuntar a unobjeto nativo. Su declaración es sencilla:

array<double>^ data = {1.5, 3.5, 6.7, 4.2, 2.1};interior_ptr<double> pstart = &data[0];

ConclusiónA lo largo de este artículo se han destacado las

facetas en las que C++/CLI destaca y se separa de losdemás lenguajes .NET de Microsoft. A diferencia delas Extensiones manejadas para C++ (la anterior ver-sión de C++ para .NET), con este nuevo lenguaje sepuede realizar cualquier tarea prácticamente de lamisma forma que con C# o VB.NET, con la venta-ja de tener más control sobre el código generado.Aunque también hay que decirlo: el lenguaje pre-senta una sintaxis más barroca, sintaxis que no asus-tará a un programador avezado de C++, pero posi-blemente sí a los de otros lenguajes. En nuestra opi-nión, las ventajas superan ampliamente al coste, sobretodo teniendo en cuenta las futuras incorporaciones,como la disponibilidad de la STL.NET, o la posibi-lidad de tener punteros a objetos manejados y refe-rencias a objetos nativos.

dotN

etM

anía

<<

21

dnm.lenguajes.net<<

Para saber más

• A fecha de hoy tan solo se han publicado dos libros sobre C++/CLI:- “C++/CLI and the NET Framework”, de Stephen R. J. Frasier (APress,

2006). Este libro cubre en sus primeros capítulos el lenguaje C++/CLI yluego pasa a describir diferentes aspectos de .NET Framework desde elpunto de vista del lenguaje, como el acceso a ficheros, las colecciones o elacceso a datos.

- “Ivor Horton’s Beginning Visual C++ 2005”, de similares características alanterior,pero explicando con mayor profundidad tanto los temas C++/CLIcomo los nativos, pues también cubre el C++ nativo, y la programaciónWin32 y MFC.

• Está pendiente de salir al mercado “CLR via C++/CLI”, de Jeffrey Richter yJulian Templeman, autores ampliamente reconocidos.

• Microsoft está publicando continuamente artículos sobre la integración decódigo nativo con código .NET. Entre ellos podemos destacar “IntegrateWindows Forms Into Your MFC Applications Through C++ Interop”,que seráde utilidad a aquellos que utilicen MFC (http://msdn.microsoft.com/visualc/default.aspx?pull=/msdnmag/issues/06/05/mixandmatch).

• Hay infinidad de bitácoras dedicadas al lenguaje, entre las que podemos des-tacar la de Nishant Sivakumar (http://blog.voidnish.com).

• Visual C++ Developer Center (http://msdn.microsoft.com/visualc) es el puntode entrada y portal de novedades sobre el lenguaje, y en él podrá encontrarnumerosas referencias útiles.

• La especificación de C++/CLI (fruto de su estandarización por ECMA) está dis-ponible en http://www.ecma-international.org/publications/standards/Ecma-372.htm.

• “A Design Rationale for C++/CLI”, de Herb Sutter (http://www.gotw.ca),documento en continua evolución,detalla, explica y racionaliza los puntos másoscuros del lenguaje, aclarando en gran medida todas las dudas que pudieransurgir en su aprendizaje.

En castellano

• Por desgracia, poco o nada hay en castellano sobre C++/CLI, a excepción delo que ha escrito el autor de este artículo. En su sitio Web (http://spaces.msn.com/lococolina) se puede encontrar un pequeño resumen del lenguaje (unas100 páginas en formato Word) y la traducción de un artículo de NishantSivakumar.

• El autor, junto con Octavio Hernández, ha traducido al castellano el docu-mento de Herb Sutter antes mencionado. Dicha traducción está disponibleen http://www.pokrsoft.com/cpp/a_design_rationale_es.zip.

• Recientemente se acaban de abrir dos foros Web en castellano enhttp://forums.microsoft.com/msdn-es.

Page 22: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

podemos por fin desarrollar infor-mes para trabajar con Reporting Services, y en su caso,desde el propio Visual Studio 2005 podemos trabajarcon el control ReportViewer, que es el control dondese presentan los datos de informes en páginas Web oaplicaciones Windows.

¿Cómo podemos entonces usar un DataSet con elcontrol ReportViewer? Eso es justamente lo que apren-deremos a hacer en este artículo.

Iniciando nuestro proyectoNo nos vamos a enredar demasiado, y vamos a lle-

var a cabo un ejercicio de aprendizaje netamente prác-tico, porque practicando es como se entiende la teoríay como se aprende a hacer las cosas; así que vamos ainiciar un nuevo proyecto de tipo Windows Forms ya insertar un control ReportViewer dentro del formu-lario principal.

Para dar un aspecto más vistoso a nuestro pro-yecto, vamos a utilizar las etiquetas inteligentes (smarttags) del control ReportViewer, y a seleccionar la opción“Acoplar en contenedor principal”. De esta manera,acoplaremos el control ReportViewer al formulario,como se puede ver en la figura 1.

Agregando un DataSetEl siguiente paso es agregar un DataSet al proyec-

to. Para ello, haremos clic con el botón derecho del ratónen el explorador de soluciones y seleccionaremos laopción “Agregar” > “Nuevo elemento”. Seleccionaremosel elemento “Conjunto de datos” como plantilla a utili-zar. De esta manera, se abrirá el diseñador del DataSet,que por defecto tendrá el nombre de DataSet1.xsd.

Dentro del diseñador del DataSet, pulsaremos elbotón derecho del ratón y seleccionaremos la opción“Agregar” > “DataTable” del menú contextual. Deesta manera, agregaremos un DataTable con nombreDataTable1 por defecto, y lo que deberemos hacer acontinuación es agregar los registros que queremosque tenga nuestro DataSet.

Para llevar a cabo nuestra pequeña demostra-ción, utilizaremos la base de datos de ejemploAdventureWorks, y en concreto la tabla Production.Product. Atendiendo a esta tabla, nos fijaremos en loscampos Name, ProductNumber y Color.

Dentro del DataSet, incluiremos los tres camposque hemos fijado y que queremos mostrar en nuestroinforme. Esto es lo que se puede ver en la figura 2.Debemos prestar especial atención al tipo de los cam-pos, para indicarlo así en las propiedades de cada uno.En nuestro ejemplo, los tres campos son de tipo nvar-

Trabajo con DataSet y ReportViewerCuando se trabaja con asiduidad con SQL Server 2000 Reporting Services, enmuchas ocasiones se tiene la necesidad de operar con conjuntos de datos (DataSet).Sin embargo, SQL Server 2000 Reporting Services no nos ayuda mucho cuando setrata de trabajar con conjuntos de datos, y para usarlos estamos obligados a haceralgún pequeño enredo.

<<

Jorge Serrano

dnm.plataforma.net

Con Visual Studio 2005

Jorge Serranoes colaborador habitual de

dotNetManía. Es IngenieroInformático y MVP de VB y de

.NET. Es Webmaster dePortalVB.com y autor de

diferentes libros y artículostécnicos.

Figura 1.Formulario Windows con elcontrol ReportViewer acoplado en él

Page 23: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

char, por lo que indicaremos que todos los camposson del tipo .NET String, que es precisamente el selec-cionado por defecto.

Creación del informe y asignación alDataSet

Si acudimos a la ventana del explorador de solu-ciones y en concreto a la solapa “Orígenes de datos”,veremos que allí se encuentra el DataSet que hemoscreado anteriormente, junto a los campos de sucorrespondiente DataTable, con nombre DataTable1por defecto. Esto es justamente lo que se puede veren la figura 3.

A continuación, añadiremos una plantilla de tipo“Informe” al proyecto, eligiendo la opción “Agregar”>“Nuevo elemento” del menú contextual que apareceal hacer clic con el botón derecho del ratón sobre elnodo del proyecto.

Accederemos directamente al diseñador de infor-mes de Visual Studio 2005, y en él y como primer pasoinsertaremos el objeto tabla del cuadro de herra-mientas. En este objeto, tenemos tres grupos de datosdiferenciadores: el encabezado, el detalle y el pie.

Nuestro objetivo en esta demostración es prestar aten-ción al apartado de detalle.

Personalización del informeSólo a modo de personalizar el informe y como

demostración, nos fijaremos en el campo Color.Nuestro objetivo no es el de presentar el nombrede este campo, sino el de presentar el color del mis-mo. Como hemos insertado un objeto cuadro detexto en este campo, será necesario que modifi-quemos los valores de color de fondo y de borde deeste control, para que presentemos ahí el color quecontiene el campo.

El campo Color puede tener el valor nulo o unvalor de color, así que haciendo clic sobre el obje-to cuadro de texto, accederemos a la ventana depropiedades (F4). Dentro de la ventana de propie-dades de este objeto, nos fijaremos primero en lapropiedad BackgroundColor. Desplegaremos estapropiedad y seleccionaremos la opción “Expresión”,con lo que accederemos a una ventana dentro dela cual deberemos escribir la expresión con la quequeremos producir el color de fondo del objeto.La ventana para editar la expresión se puede ver enla figura 5.

dotN

etM

anía

<<

23

dnm.plataforma.net<<

Figura 2.Campos creadosen el DataSet

Figura 3.Campos del DataSet yDataTable desde la ventana de

Orígenes de datos

Figura 4. Informe preparado con los campos insertados en él

Figura 5.Ventana para editar la expresión

Page 24: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

La expresión con la que vamos a tra-bajar es la que se indica en la que indi-ca a continuación:

=iif( Fields!Color.Value is Nothing, "Transparent", Fields!Color.Value)

Una vez hecho esto, accederemosa la propiedad BorderStyle y modifi-caremos esta propiedad con otraexpresión similar a la del caso ante-rior. En este caso, la expresión deberáser la siguiente:

=iif( Fields!Color.Value is Nothing, "None", "Solid")

Con esto, si el campo Color es dife-rente de nulo, colorearemos el fondodel color del campo y pondremos un

borde en el objeto insertado en la tablapara resaltarlo más aún. En este punto,lo único que nos queda es escribir elcódigo de nuestro ejemplo.

Escribiendo el código de nues-tra aplicación

A continuación escribiremos el códi-go de este ejemplo, que se presenta enel fuente 1.

Nuestro ejemplo se conecta a la basede datos AdventureWorks, ejecuta la sen-tencia SQL para recoger los datos que nosinteresan de la tabla Production.Producty los vuelca al DataSet que hemos diseña-do al principio.

Finalmente, asocia los datos delDataSet al control ReportViewer, quienenlaza los campos del DataSet con los cam-

pos del informe, con el objetivo de pre-sentarlos en pantalla. De esta manera, alejecutar el código de nuestra demostra-ción obtenemos un informe en pantalla,con los datos volcados desde un DataSet,tal y como se indica en la figura 6.

ConclusionesEn este artículo hemos aprendido a

cargar datos desde un DataSet a uninforme de Reporting Services utili-zando el control ReportViewer de VisualStudio 2005. Además, hemos visto cómoparametrizar datos o expresiones desdelas propiedades de los objetos que for-man parte de un informe.

Este ejemplo nos abre diferentes víaspara poder desarrollar aplicaciones queconsuman informes y cuyos datos pue-dan variar según diferentes necesidades,pudiendo parametrizarlos o personali-zarlos según las diferentes situaciones enque nos podamos encontrar.

dotN

etM

anía

<<

24

dnm.plataforma.net<<

Fuente 1

Imports System.Data.SqlClientImports Microsoft.Reporting.WinForms

Public Class Form1

Private Function ObtenerCadenaConexion() As StringReturn “Data Source=.\SQLEXPRESS; “ ¡%

“Initial Catalog=AdventureWorks;Integrated Security=SSPI;”End Function

Private Function ObtenerSQL() As StringReturn “SELECT Name, ProductNumber, Color FROM Production.Product;”

End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) %Handles MyBase.Load

Dim miDataSet As New DataSetmiDataSet = CargarDatos()Me.ReportViewer1.ProcessingMode = ProcessingMode.LocalMe.ReportViewer1.Name = “Visor de reportes”Me.ReportViewer1.LocalReport.ReportPath = “..\..\Report1.rdlc”Dim rds As New ReportDataSourcerds.Name = “DataSet1_DataTable1”rds.Value = miDataSet.Tables(0)Me.ReportViewer1.LocalReport.DataSources.Add(rds)Me.ReportViewer1.RefreshReport()

End Sub

Private Function CargarDatos() As DataSetDim datos As New DataSet1Using conexion As New SqlConnection()

conexion.ConnectionString = ObtenerCadenaConexion()conexion.Open()Dim comando As New SqlDataAdapter(ObtenerSQL(), conexion)comando.Fill(datos.Tables(0))comando = Nothingconexion.Close()

End UsingReturn datos

End Function

End Class

Figura 6. Ejecución de la demostración

La carga de datos desde unDataSet a informes de

Reporting Services nos abrenuevas vías para desarrollaraplicaciones que consuman

informes

Page 25: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos
Page 26: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

de su propialógica de negocio, un código se ejecute en un contextoseguro, se ejecute con tolerancia a fallos o pueda ser audi-table. La AOP [2] pretende que aspectos adicionalescomo éstos puedan expresarse y lograrse sin que paraello haya que entrometerse en la lógica del código prin-cipal de la aplicación, orientado a la solución del proble-ma que se quiere resolver.

En un trabajo previo publicado en dotNetManía[1] hablamos de cómo hacer ProgramaciónOrientada a Aspectos basándonos en la posibilidadque brinda .NET de colocar metainformación den-tro del código a través un recurso tan importante comoson los atributos. Una propuesta de solución parahacer AOP en .NET ([3] y [4]) se basa en definir y“colocar” adecuadamente atributos .NET en el códi-go para expresar “aspectos” que permitan incorporarpropiedades y funcionalidades adicionales a la expre-sada por el código pero sin disturbar la funcionalidadprincipal de éste. Esto nos proporciona una adecua-da modularidad sintáctica sin exigir cambios al len-guaje fuente y los compiladores.

Como finalmente el comportamiento de una apli-cación computacional termina manifestándose en suejecución sobre un procesador, los aspectos debentambién manifestarse en alguna forma de código quese ejecutará en conjunción con el código principal.En la terminología de la AOP se denomina “entrete-jer código” (code weaving) a hacer que en tiempo deejecución la ejecución del código principal se entre-mezcle con la ejecución del código asociado a losaspectos. La AOP pretende que esto se logre con lamayor transparencia posible de cara al desarrollador

y satisfaciendo los objetivos de siempre: reusabilidady modificabilidad.

En [1] mostramos posibles soluciones para esteefecto de “entretejido”. Éstas se basaban bien en usarlos mecanismos de .NET para interceptar las llama-das a métodos y poder evaluar el código con aspec-tos, o en usar una herramienta que generase y colo-case intermediarios (objetos proxy) en el código final;estos intermediarios interceptarían las llamadas a unmétodo y ejecutarían la funcionalidad de los aspec-tos, según el tipo de aspecto. Sin embargo, estos enfo-ques presentan inconvenientes: para el primer caso,el mecanismo de intercepción de .NET es complica-do de usar y añade un coste adicional de tiempo enejecución; para el segundo caso, la colocación de losintermediarios exige el uso de una herramienta, locual no es cómodo para el desarrollador acostumbra-do a hacerlo todo desde Visual Studio y a su organi-zación de los proyectos.

Atributos,aspectos y cómo entretejer códigodesde Visual Studio para hacer AOP en .NET (I)

Con la Programación Orientada a Aspectos (Aspect Oriented Programming – AOP)se pretende que la funcionalidad del código principal de una aplicación y la funcio-nalidad adicional indicada en forma de “aspectos” puedan ser reusadas, modifica-das y extendidas sin afectarse entre sí.

<<

Yamil Hernández

dnm.plataforma.net

Podemos querer que,con independencia

Miguel KatribMiguel Katrib es Dr.en

Computación y Catedrático delDpto.de Ciencia de la

Computación de la Universidadde La Habana.Dirige el Grupo

WEBOO dedicado a la enseñanzay desarrollo de la Orientación aObjetos y la Programación en la

Web.Miguel es redactor dedotNetManía y asesor de

programación y tecnología .NETpara CARE Technologies S.A.

Yamil Hernández esInstructor de Programación de la

Cátedra de Programación eIngeniería de Software del Dpto.

de Ciencia de la Computación dela Universidad de la Habana.Yamil

es desarrollador y programadordel grupo WEBOO donde se

dedica especialmente a laProgramación Orientada a

Aspectos,Metaprogramación yReflexión. Es colaborador e

ilustrador de dotNetManía.

Miguel Katrib

Una propuesta de solución para hacerAOP en .NET se basa en definir y

“colocar” adecuadamente atributos.NET en el código

Page 27: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

En este artículo se verá cómo defi-nir aspectos mediante atributos, cum-pliendo de este modo con la sintaxis delos lenguajes .NET, cómo lograr la eje-cutabilidad de estos aspectos indicandolos puntos de corte desde el propioVisual Studio y cómo entretejer el códi-go de los aspectos con el código princi-pal de la aplicación haciendo que sea elentorno integrado el que haga esteentretejido en tiempo de compilación.Para ello mostraremos cómo puede serextendida la funcionalidad de VisualStudio 2005 utilizando el mecanismo deañadidos (add-ins) que éste ofrece [5].

Tipos de aspectosAnders Hejlsberg, dando respues-

ta a algunas preguntas sobre AOP enMSDN TV, comenta sobre la dificul-tad de conocer cómo será la interaccióndinámica entre los códigos (es decir,dónde entra un código a ejecutar, dón-de sale…), y por tanto plantea su preo-cupación sobre la AOP como una dis-ciplina de programación de dominiogeneral. Coincidimos con estas preocu-paciones. No debemos ver la AOP conla excentricidad de estar a la moda. Estopodrá ganarnos detractores, pero pen-samos que es más acertado ver la AOPcomo un complemento al desarrollo desoftware orientado a objetos.

Este artículo considerará tres cate-gorías de aspectos, que están relacio-nadas con el dónde, cuándo y cómointeractúa la funcionalidad de losaspectos con la funcionalidad del códi-go principal.

El dónde es lo que se engloba bajoel concepto de la AOP conocido comopunto de corte (point cut). En nuestrapropuesta, los aspectos estarán asocia-dos a un método (o a un tipo, si consi-deramos que esto significa a todos losmétodos de dicho tipo).

Con respecto al cuándo, se consi-derarán tres categorías de aspectos:aquellos cuya funcionalidad se aplicaantes de ejecutar un método, los aspec-tos cuya funcionalidad se aplica despuésde ejecutar un método y, por último,los aspectos cuya funcionalidad puedesuplantar la ejecución de un método.Estas tres categorías de aspectos serecogen en el código del fuente 1. El

método Advice define la funcionalidaddel aspecto. En el caso de un aspectoBeforeAspect, el Advice se ejecutaráantes de ejecutar el método llamado; enel caso de un aspecto AfterAspect, seejecutará después de ejecutar el méto-do llamado, y en el caso de un aspectoInsteadAspect, se ejecutará en lugar delmétodo llamado.

El cómo se relaciona con la inter-pretación que tienen los parámetros delmétodo Advice en dependencia de cuán-do se aplica:

• El primer parámetro, target, indi-ca al objeto receptor del métodollamado y será null en el caso deun método estático. Note queentonces Advice tendrá sobre elobjeto del método al se le ha colo-cado el aspecto la misma visibili-dad que tiene cualquier cliente dela clase.

• El segundo parámetro, targetMethod, de tipo MethodBase, deno-ta al objeto de reflexión que des-cribe al método cuyo aspecto va aser evaluado.

• El tercer parámetro, de tipoobject[], es un array que recibi-rá los mismos parámetros que sele han pasado al método cuyoaspecto va a ser evaluado; es un

array de longitud cero en el casode que sea un método sin pará-metros.

• Para el caso de aspectos de tipoAfterAspect, el método Advice tie-ne un cuarto parámetro, ref objectresult. Este parámetro recibirá elvalor de retorno del método invo-cado (en caso de void, el valor esnull). De este modo, el valor deretorno de un método puede serutilizado en la funcionalidad delaspecto.

• La ejecución del Advice de unaspecto de tipo InsteadAspectdevuelve un valor de tipo object,que sería el sustituto del valorque devolvería el método origi-nal invocado. Note que de modogenérico el tipo devuelto esobject; es responsabilidad del pro-gramador que el objeto que sedevuelva sea realmente del mis-mo tipo que el que devuelve elmétodo original, pues esto nopuede ser verificado en tiempo decompilación.

El diccionario AspectPool de la cla-se AspectAttribute servirá como alma-cén para guardar información globalrelacionada con los aspectos.

dotN

etM

anía

<<

27

dnm.plataforma.net<<

Page 28: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Ejemplo de BeforeAspectSupongamos una clase A:

class A {//...public void F1(){...}public void F2(){...}

}

para la que se quieren auditar los momentos decomienzo de la ejecución del método F1. Para ello,decoramos el método con el aspecto LogBefore de tipoBeforeAspect, y especificamos la dirección y el nom-bre del fichero donde se guardará la información, enel ejemplo Log.txt.

class A {//...[LogBefore ("Log.txt")]public void F1(){...}public void F2(){...}

}

Si se quisieran auditar todas las llamadas a todoslos métodos de un tipo B, entonces bastaría con aso-ciar el aspecto LogBefore a la definición del tipo, sintener que hacerlo para cada uno de sus métodos.

[LogBefore ("Log.txt")]class B {

...public void H1(){...}public void H2(){...}

}

El atributo LogBefore se definiría entonces como semuestra en el fuente 2. Note que en este caso, de losparámetros del método Advice, solo se ha usado el pará-metro targetMethod, que es lo único que hace falta paraseguir el rastro de los métodos que han sido llamados.

Ejemplo de InsteadAspectEn este ejemplo se define un aspecto que permi-

te indicar que un método sea tolerante a fallos; es decir,que si durante la ejecución del método ocurriese unaexcepción, se vuelva a intentar la ejecución del mis-mo (hasta una determinada cantidad de veces, quepuede fijar quien coloca el aspecto).

De este modo, para indicar que el método F1 de A

se intente ejecutar hasta 3 veces en caso de fallo y queel método F2 se intente ejecutar hasta 5 veces, se podrí-an decorar esos métodos con el aspecto FaultTolerant,como se muestra a continuación:

class A{//...[FaultTolerant(3)]public void F1(){...}[FaultTolerant(5)]public void F2(){...}

}

dotN

etM

anía

<<

28

dnm.plataforma.net<<

private class AspectAttribute: Attribute{// pool para intercambio entre los aspectospublic static Hashtable AspectPool = new Hashtable();

}[AttributeUsage(AttributeTargets.Method |

AttributeTargets.Property |AttributeTargets.Class | AttributeTargets.Interface, Inherited = true)

public abstract class BeforeAspect: AspectAttribute{public abstract void Advice(object target,

MethodBase targetMethod,params object[] parameters);

}

[AttributeUsage(AttributeTargets.Method |AttributeTargets.Property, Inherited = true,AllowMultiple = false)

public abstract class InsteadAspect: AspectAttribute{public abstract object Advice(object target,

MethodBase targetMethod,params object[] parameters,);

}

[AttributeUsage(AttributeTargets.Method |AttributeTargets.Property |AttributeTargets.Class | AttributeTargets.Interface, Inherited = true)

public abstract class AfterAspect: AspectAttribute{public abstract void Advice(object target,

MethodBase targetMethod,params object[] parametersref object result);

}

Fuente 1

public class LogBefore : BeforeAspect{private string path;

public LogBefore (string path){this.path = path;

}

public override void Advice(object targetObject, MethodBase targetMethod, params object[] parameters)

{StreamWriter strm = File.AppendText(path);strm.WriteLine("Method " + targetMethod.Name +

" began at: " + DateTime.Now);

strm.Close();}

}

Fuente 2

Page 29: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dotN

etM

anía

<<

29

dnm.plataforma.net<<

Para lograr esto, el aspecto FaulTolerant se definecomo de tipo InsteadAspect (fuente 3). En este caso,el entretejido que se haga de un aspecto de tipoInsteadAspect con el código tiene que garantizar quecuando se haga una llamada como a.F1() no se ejecu-te el método F1, sino que en su lugar se ejecute el méto-do Advice del aspecto FaultTolerant. Note que es den-tro del método Advice donde se ejecuta realmente elmétodo llamado (F1 en este caso) cuando se hacetargetMethod.Invoke(target,parameters). Es el entre-tejido que se hace el que provoca que sea el métodoAdvice el que se llame en lugar del método original;esto permite capturar la excepción que devuelva la eje-cución del método original (que se invoca mediantereflexión) y reintentar su ejecución.

El tener aislado este patrón de reintento dentrode la funcionalidad del aspecto ilustra la separaciónde incumbencias y permite no replicar el mismo códi-go en cada uno de los métodos que se quisieran hacertolerantes a fallos.

Ejemplo de AfterAspect

El mismo ejemplo de llevar la traza del comienzode la ejecución de un método nos sirve para ilustrarel uso de un atributo AfterAspect. Usando un aspectode este tipo se podrá auditar cuándo termina la ejecu-ción de un método. Sea la misma clase A del ejemplode BeforeAspect.

class A {//...public void F1(){...}public void F2(){...}

}

Para llevar un registro de los momentos en quefinaliza la ejecución del método F1, se decora ahora elmétodo con el aspecto LogAfter de tipo AfterAspect.

class A {//...[LogBefore("Log.txt")][LogAfter("Log.txt")]public void F1(){...}public void F2(){...}

}

Note que el atributo LogAfter se define de igualforma que el LogBefore (fuente 4). Es el mecanismo de“entretejido” el que según el tipo de aspecto distin-gue si la funcionalidad (método Advice) se aplica anteso después de la ejecución del método.

Extendiendo Visual Studio con un “WeaverAdd-in” para hacer el entretejido

Macros y add-ins no son una novedad en las herra-mientas de desarrollo. De hecho, las primeras versio-nes de Word y Excel ya tenían un lenguaje propio parala definición de macros, que luego fue sustituido porVisual Basic for Applications (VBA). Pero Visual Studio.NET (en lo adelante VS) tiene ahora probablemen-te la infraestructura más rica para el trabajo con macrosy add-ins.

Las macros son pequeños programas que permi-ten automatizar tareas repetitivas (ver un trabajo pre-vio sobre macros en dotNetManía [6]). Pero si que-remos hacer algo más que automatizar procesos repe-

class FaultTolerant: InsteadAspect{int times;public FaultTolerant(int times){ this.times=times; }public override object Advice(

object target, MethodBase targetMethod,object[] parameters)

{while(true)try{return targetMethod.Invoke(target,parameters);

}catch (Exception e){if (times == 0) throw e.InnerException;else times --;

}}

}

Fuente 3

public class LogAfter : AfterAspect{private string path;

public LogAfter (string path){this.path = path;

}

public override void Advice(object targetObject, MethodBase targetMethod, ref object result, params object[] parameters)

{StreamWriter strm = File.AppendText(path);strm.WriteLine("Method " + targetMethod.Name +

"begin at: " + DateTime.Now);strm.Close();

}}

Fuente 4

Page 30: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

titivos debemos hacer uso de los add-ins. Un add-ines código compilado que se agrega directamente den-tro del proceso de VS. Más que una simple automa-tización de tareas comunes, un add-in es una formade enriquecer el IDE de VS. Para que VS pueda reco-nocerlo, éste debe implementar la interfazIDTExtensibility2. Afortunadamente, VS ofrece unasistente que genera automáticamente las clases nece-sarias para la programación de un add-in, incluyen-do una plantilla que hace posible que solo tengamosque rellenar con el código apropiado los métodos quehay que definir de esta interfaz: OnConnection,OnDisconnection, OnAddInsUpdate, OnStartupComplete yOnBeginShutdown. La clase generada por el asisten-te, además de implementar la ya mencionada inter-faz IDTExtensibility2, implementa también la inte-faz IDTCommandTarget, necesaria cuando se quieretrabajar con uno o más comandos nombrados(fuente 5). En este trabajo, los comandos que sehan nombrado se llaman addPointCutCommand yremovePointCutCommand (fuente 6). Para los métodosOnConnection, QueryStatus y Exec, el asistente generaun código de propósito general, que debe ser o noadaptado en dependencia de la funcionalidad que sevaya a programar.

Al ejecutar un add-in, que a fin de cuentas es unproyecto .NET desarrollado con Visual Studio (figu-ra 1, ventana 1), se levanta un nuevo proceso VS (figu-ra 1, ventana 2). El add-in se ejecutará en este nuevoproceso, lo que permite depurar el código del add-indentro del proceso original de VS, lo cual resulta muyútil durante el proceso de desarrollo del mismo. Unavez depurado el add-in, éste puede “instalarse”, que-dando integrado dentro de VS .NET y extendiendoasí su funcionalidad.

En el asistente para la creación de add-ins de VSse puede especificar en qué momento se desea queéste se cargue. Una de las posibles opciones es quese cargue al hacer clic sobre algún nuevo ítem dealgún menú de VS. Por defecto, VS incluye los add-ins en el menú “Herramientas”, aunque hay una gran

dotN

etM

anía

<<

30

dnm.plataforma.net<<

public class Connect : IDTExtensibility2, IDTCommandTarget{public void OnConnection(object application,

ext_ConnectMode connectMode, object addInInst, ref Array custom)

{//...

}

public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)

{}public void OnAddInsUpdate(ref Array custom){}public void OnStartupComplete(ref Array custom){}public void OnBeginShutdown(ref Array custom){}

public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText)

{//...

}

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)

{}}

Fuente 5

Figura 1.VS 2 como resultado de la ejecución de VS 1

Microsoft.VisualStudio.CommandBars.CommandBar codeWindowMenu = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["Code Window"];

try{Command command1 = commands.AddNamedCommand2(weaverAddInInstance,

"addPointCutCommand","Add PointCut","Click here to add Point Cut",true, 59, ref contextGUIDS,(int)vsCommandStatus.vsCommandStatusSupported +(int)vsCommandStatus.vsCommandStatusEnabled,(int)vsCommandStyle.vsCommandStylePictAndText,vsCommandControlType.vsCommandControlTypeButton);

Command command2 = commands.AddNamedCommand2(weaverAddInInstance,"Click here to remove Point Cut","Remove PointCut","Executes the command for Weaver",true, 59, ref contextGUIDS,(int)vsCommandStatus.vsCommandStatusSupported +(int)vsCommandStatus.vsCommandStatusEnabled,(int)vsCommandStyle.vsCommandStylePictAndText,vsCommandControlType.vsCommandControlTypeButton);

command1.AddControl(codeWindowMenu, 1);command2.AddControl(codeWindowMenu, 2);

}catch (System.ArgumentException) { }

Fuente 6

Page 31: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos
Page 32: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

flexibilidad para lograr añadirlos como items de cual-quier menú de VS.

Todos los menús presentes en VS están conteni-dos dentro de una colección CommandBars. Sobre estacolección se puede iterar para tener acceso a cadaCommandBar. El siguiente código permite iterar sobrelos menús:

foreach (Microsoft.VisualStudio.CommandBars.CommandBar cb in(Microsoft.VisualStudio.CommandBars.CommandBars)_

applicationObject.CommandBars)//...

Para la implementación del entretejido de aspec-tos (que hemos denominado Weaver Add-in) se hanañadido dos nuevos items al menú de contexto (el queaparece al pulsar con el botón derecho) del editor decódigo de VS .NET. El nombre de este menú es“Code Window”, y a él añadiremos dos nuevos items,“Add PointCut” y “Remove PointCut”, para que que-de como se muestra en la figura 2.

El código que se muestra en el fuente 6 añade al menúde contexto dos nuevas opciones, que podrán ser mani-puladas como comandos nombrados (named commands).Un comando nombrado es una suerte de código funcio-nal al que se le asocia un nombre, a través del cual aquélpodrá ser accedido programáticamente o invocado direc-tamente desde el propio IDE de Visual Studio.Prácticamente casi cualquier acción que un desarrolla-dor puede ejecutar dentro del IDE se encuentra dispo-nible en forma de un comando nombrado.

Es fácil agregar items a un menú de contexto o auna barra de comandos haciendo uso del métodoAddNamedCommand2, que devuelve como resultado el nue-vo comando que se ha creado. Los parámetros delmétodo son:

• AddInInstance: La instancia del add-in que estáadicionando este nuevo comando.

• Name: El nombre programático del nuevo coman-do (addPointCutCommand y removePointCutCommand

en el código del fuente 6). Esta cadena es elnombre de comando que usará el resto del add-in para identificarlo; por ejemplo, cuando seaplica el método Exec en el fuente 5.

• ButtonText: El nombre que mostrará visualmen-te el comando si es un botón o un icono (“Add

PointCut” y “Remove PointCut” en el ejemplodel fuente 6).

• Tooltip: El texto de ayuda que se despliega cuan-do en el IDE se pasa con el puntero del ratónsobre el comando.

• MSOButton: Indica si el tipo de figura quemuestra el nuevo comando es una “OfficePicture” o el ID de un recurso de mapa debits de 16x16 (pero no un icono). En el fuen-te 6 se ha pasado el valor true para indicarque no se usará un recurso de mapa de bitspropio, sino uno de los que brinda VS pordefecto. Si quisiéramos personalizar la ima-gen a mostrar para el comando habría quepasar false y embeber el mapa de bits comoun recurso de nuestro proyecto.

• Bitmap: El ID del mapa de bits que se desea mos-trar en el botón. En el fuente 6 se utiliza el valor59, que representa al icono ☺, predetermina-do para el asistente de VS. Para cambiarlo, lue-go de agregar el correspondiente mapa de bitscomo recurso al proyecto se debe utilizar el valor1 como ID.

• ContextUIGUIDs: Define en entorno en que pue-de ejecutar el comando (modo de depuración,modo de diseño, etc.).

• vsCommandStatusValue: Valor de enumeración quedefine el estado del comando. Puede servsCommandStatusEnabled, vsCommandStatusInvisible, vsCommandStatusLatched, vsCommandStatusNinched, vsCommandStatusSupported o vsCommand

StatusUnsupported.• CommandStyleFlags: Valor de enumeración que

define el estilo visual de cualquier interfaz deusuario añadida por el comando. Puede servsCommandStyleComboCaseSensitive, vsCommandStyleComboNoAutoComplete, sCommandStylePict,vsCommandStylePictAndText o vsCommandStyle

Text.• ControlType: Valor de enumeración que define

el tipo del control que se agrega cuando la inter-faz de usuario es creada. Puede ser vsCommandControlTypeButton, vsCommandControlTypeDropDownCombo, vsCommandControlTypeMRUButton ovsCommandControlTypeMRUCombo.

dotN

etM

anía

<<

32

dnm.plataforma.net<<

Para la implementación del entretejido de aspectos se han añadido dos nuevositems al menú de contexto del editor de código de Visual Studio

Page 33: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Hasta aquí, con el código del fuen-te 6 lo que se ha hecho es solo darleuna apariencia visual al add-in, esdecir, indicar dónde y cómo apareceéste dentro del IDE. Ahora nos restadarle funcionalidad al add-in, es decir,programar qué queremos que ocurracuando éste se ejecute (cuando seseleccione uno de los items de menúasociados, en el caso del ejemplo quenos ocupa).

Colocando puntos de corte(point cuts)

Una vez que la funcionalidad pro-gramada en el add-in se ha integrado aVS, podemos especificar los puntos decorte (point cut), o sea, dónde se llevaráa cabo el entretejido de los aspectosrepresentados mediante atributos .NET,sobre el código de nuestra aplicación.En la sección anterior vimos cómo secolocan dentro del IDE los comandospara poner y quitar puntos de corte; acontinuación vamos a describir cómoimplementar la funcionalidad que que-remos que tengan estos comandos.

El compilador de C# no generacódigo IL ejecutable para los atribu-tos que se hayan colocado en el códi-go fuente. Un atributo queda en cier-to modo seriado dentro del ensambla-do resultante, y permanece pasivodurante la ejecución de éste, salvo queel propio ensamblado, u otro que loutilice, analice por reflexión el atribu-to y le de alguna interpretación. En elcaso de los atributos asociados a aspec-tos, queremos que la funcionalidad delos mismos quede “entretejida” en elcódigo resultante de la compilación,algo que hay que indicarle al compi-lador. Esto es lo que lograremosimplementando la semántica de loscomandos addPointCutCommand yremovePointCutCommand.

Por ejemplo, para indicar que seponga un punto de corte a un métodoF1 mediante el decorado con los aspec-tos LogBefore y LogAfter, se usa el editorde VS, se da clic derecho y se seleccio-na la opción “Add PointCut” (figura 2),que se ha añadido al menú según loexplicado en la sección anterior. Demanera similar se puede quitar un pun-to de corte (figura 3).

El código del add-in debe asegu-rar también que sólo se pueda ponerun punto de corte en los lugares per-mitidos (en este trabajo hemos consi-derado que un punto de corte puede

estar asociado únicamente a la entra-da de un método). Es deseable, portanto, que el menú de contexto deleditor del IDE despliegue los corres-pondientes items de nombres “AddPointCut” o “Remove PointCut” solocuando éstos sean aplicables, es decir,si el cursor se encuentra en cualquierpunto del texto del código de unmétodo. Para lograr lo anterior seimplementarán los métodos Query

Status y Exec de la interfaz IDTCommandTarget.

Cuando durante la ejecución de unadd-in se añade un comando nombra-do (o sea, cuando se ejecuta el méto-do AddNamedCommand2, como ocurre enel fuente 6), VS invoca al métodoQueryStatus (fuente 5). Para estable-cer el estado del comando nombrado,que se identifica por el nombre pasa-do a través del parámetro commandName,se debe asignar un valor de la enume-ración vsCommandStatus al parámetropasado por referencia status. Porejemplo, mediante:

se indica que el comando addPointCutCommand está habilitado y soportado.Esto a su vez indicará a VS que invo-que el método Exec cuando se haga clicen cualquiera de los nuevos comandosque se han añadido (en nuestro caso,addPointCutCommand o removePointCut

Command).Lo primero que se suele hacer des-

de un add-in es acceder y manipulardo

tNet

Man

ía<<

33

dnm.plataforma.net<<

Figura 2. Estableciendo un punto de corte

Figura 3. Eliminando un punto de corte

En el caso de los atributos asociados a aspectos, queremosque la funcionalidad de los mismos quede “entretejida” en el

código resultante de la compilación

if (commandName == "Weaver.Connect.addPointCutCommand)status = (vsCommandStatus)

vsCommandStatus.vsCommandStatusSupported |vsCommandStatus.vsCommandStatusEnabled;

Page 34: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

algunos objetos de tipos definidos en el espacio denombres EnvDTE que son recibidos como parámetrosen OnConnection. Este método es llamado cada vez queel add-in es cargado por VS. Los objetos antes men-cionados de EnvDTE pueden accederse a partir del obje-to raíz de la extensibilidad de VS, que es pasado comoprimer parámetro de OnConnection como una instan-cia del tipo DTE, que representa al IDE del VS que estáejecutando. El segundo parámetro de OnConnectiondescribe cómo el add-in ha sido cargado; las distintasformas en que esto puede ocurrir están enumeradasen el tipo ext_ConnectMode del espacio de nombresExtensibility. El tercer parámetro es una instanciade nuestro propio add-in, de tipo EnvDTE.AddIn, y elcuarto parámetro es un array vacío que puede usar-se para guardar y pasar información local específicadel add-in.

En el método Exec (fuente 7) debe implementar-se lo que queremos que ocurra al ejecutar alguno delos comandos nombrados, o sea, hacer clic sobre elítem que hemos añadido al menú de contexto. Eneste caso, el método Exec lleva un control sobre aque-llos métodos a los que se les ha colocado (o quitado)

un punto de corte. Para ello,mantiene un ArrayList de nom-bre aspectizedMethods. Estainformación será usada al hacer-se la compilación y el entreteji-do de los aspectos. La informa-ción sobre el lugar donde se hacolocado el punto de corte esextraída del editor de texto deVisual Studio, como se verá en lanúmero siguiente.

ConclusionesEl modelo de extensibilidad

de Visual Studio nos permiteenriquecer mediante add-ins elentorno de desarrollo con nue-vas funcionalidades. Esta prime-ra entrega no ha pretendido serun tutorial sobre add-ins, pero hamostrado cómo usar los mismospara indicar dónde colocar lospuntos de corte y cómo dejar estainformación almacenada paraque pueda ser utilizada por elcompilador.

Queda por ver cómo hacerque el add-in entreteja el códigoantes de la compilación paralograr que el código resultante dela compilación lleve a cabo en eje-cución la funcionalidad expresa-da mediante los atributos que han

sido utilizados en calidad de aspectos. Este será el obje-to de la segunda parte de este artículo.

dotN

etM

anía

<<

34

dnm.plataforma.net<<

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)

{handled = false;if (executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault){TextSelection selection = (TextSelection)_applicationObject.ActiveWindow.Selection;

// get the starting pointEditPoint Start = selection.TopPoint.CreateEditPoint();// get the element under the cursorCodeElement element = _applicationObject.ActiveDocument.

ProjectItem.FileCodeModel.CodeElementFromPoint(Start, vsCMElement.vsCMElementFunction);

if (element.Kind == vsCMElement.vsCMElementFunction){if (commandName == "Weaver.Connect.addPointCutCommand"){aspectizedMethods.Add(element as CodeFunction);selection.MoveToPoint(element.

GetStartPoint(vsCMPart.vsCMPartHeader),false);}else if (commandName == "Weaver.Connect.removePointCutCommand"){aspectizedMethods.Remove(element as CodeFunction);selection.MoveToPoint(element.

GetStartPoint(vsCMPart.vsCMPartHeader), false);}_applicationObject.

ExecuteCommand("Edit.ToggleBookMark", string.Empty);}

handled = true;}

}}

Fuente 7

Referencias

[1] Kiczales, Gregor et al “Aspect OrientedProgramming”, Springer Verlag, Proceedings of ECO-OP 1997.

[2] Hernández, Yamil y Katrib, Miguel “Aspectos e inter-cepción de métodos en .NET”, publicado endotNetManía nº 10, diciembre de 2004.

[3] Katrib, Miguel y Hernández, Yamil “Aspectos en .NET:Una propuesta basada en atributos”, Ideas 2005.

[4] Katrib, Miguel y Hernández, Yamil “Aspect OrientedProgramming in .NET based in Attributes“, aceptadopara su publicación en JOT, marzo de 2007.

[5] Smith, Les “Writing Add-Ins for Visual Studio .NET”,APress, 2002.

[6] Quintero, Carlos “Macros en Visual Studio 2005”,publicado en dotNetManía nº 26, mayo de 2006.

Page 35: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Hasta ahora hemos estado usando los eventos dela forma habitual: para comunicarle a la aplicaciónreceptora que algo ha ocurrido, y en esa comunica-ción solo hemos usado una vía, de forma que la cla-se que produce el evento “informe” de qué es lo queestá ocurriendo, información que enviamos con losparámetros pasados al método receptor. Pero, ¿cómopodemos hacer que la aplicación receptora (el clien-te) pueda comunicarse con la clase que produce elevento (el servidor), por ejemplo, para cancelar unaacción o para pasarle cierta información?

Usando parámetros por referencia en los eventos

En principio, esto es algo sencillo de realizar, yaque lo único que tenemos que hacer es declarar porreferencia uno (o varios) de los parámetros. De estaforma podemos asignar un valor a ese parámetro yusarlo en la clase que produce el evento. Por ejem-plo, si tenemos el evento usado en los ejemplos delos artículos anteriores que avisa del cambio en elvalor de una propiedad, podemos agregar un tercerparámetro para indicar si cancelamos dicha asigna-ción. En el código del fuente 1 vemos cómo definirel delegado, el evento y la propiedad, que tiene encuenta esta nueva posibilidad de cancelar la asigna-ción, dato que sabremos si la aplicación clientedevuelve un valor verdadero en la variable usada parael tercer parámetro.

Como es de esperar, el método de la clase clien-te que recibe la notificación de que el evento se haproducido debe tener la misma “firma” que el dele-

gado, incluyendo el parámetro por referencia y, comoes natural, podemos ignorar dicho parámetro o asig-narle un valor verdadero en el caso de que queramoscancelar la asignación. En el código del fuente 2 can-celamos esa asignación si el nuevo valor es una cade-na vacía o la longitud de la misma es inferior a 3caracteres.

Parámetros personalizados en los eventosEn este cuarto artículo dedicado a los delegados y eventos nos centraremos en cómocomunicarnos entre la clase que define los eventos y la que los intercepta.Veremos esacomunicación de dos formas diferentes,usando parámetros por referencia y de la for-ma recomendada, que es definiendo nuestra propia clase para usar como parámetrode los eventos.También abordaremos una característica exclusiva de C#,que es la posi-bilidad de usar clases base como parámetros de los métodos que reciben los eventos.

<<

dnm.inicio.fundamentos

Guillermo “Guille” Som

dnm.incio.taller

Guillermo “Guille” SomEs Microsoft MVP de Visual Basic

desde 1997. Es redactor dedotNetManía,mentor de SolidQuality Iberoamericana, tutor de

campusMVP,miembro de InetaSpeakers Bureau Latin

America, y autor de los libros “Manual Imprescindible

de Visual Basic .NET” y “Visual Basic 2005”.

http://www.elguille.info

dotN

etM

anía

<<

35

Comunicarse con la clase que produce el evento

Fuente 1. Definición de un evento que permite cancelar la acción

public delegate void NombreCambiadoEventHandler(string nuevo, string anterior, ref bool cancelar);

public event NombreCambiadoEventHandler NombreCambiadoRef;

private string m_Nombre;public string Nombre{get { return m_Nombre; }set{// Lanzar el evento// indicando el nuevo valor y el anterior,// además de la variable para saber si cancelaif( NombreCambiadoRef != null ){bool cancelado = false;NombreCambiadoRef(value, m_Nombre, ref cancelado);if( cancelado ){

// Lo que haya que hacer para avisar// que se ha cancelado la asignaciónreturn;

}}m_Nombre = value;

}}

Page 36: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Hay que aclarar que esa comprobación que hace-mos en el lado del cliente en realidad la podíamoshacer en la propiedad, pero de lo que aquí se trata esde ver un ejemplo de cómo cancelar (o informar a laclase que ésa es nuestra intención), no de la soluciónmágica a todos nuestros problemas. Además, al hacer-lo en el lado del cliente, esto nos da la posibilidad deque cada aplicación que use esa clase decida la com-probación que debe hacer. Por ejemplo, si la propie-dad fuera una contraseña, el cliente podría validar sicumple ciertos requisitos impuestos por la aplicación.

Usando clases como parámetro de los eventos

Si necesitamos pasar más datos (ya sean por valoro por referencia), tendremos que indicar más pará-metros en la definición del delegado asociado con elevento, y aunque eso no es ningún problema, .NETnos permite una forma más elegante de hacerlo: usan-do un tipo personalizado como parámetro, es decir,una clase. Es más, el propio .NET Framework tieneuna clase que podemos usar para estos menesteres:EventArgs. De hecho, todos los eventos de los contro-les del espacio de nombres Windows.Forms se basan (ose derivan) de esa clase; por tanto, podemos hacer lomismo que hace el entorno en el que estamos progra-mando, y crear nuestra propia clase basada enEventArgs. De esa forma también nos resultará máscómodo pasar (y recuperar) datos en ambos sentidos,con lo que de camino nos ahorramos la definición deparámetros por referencia, que entre otras cosas, noson deseables, al menos a la hora de dar claridad anuestro código.

Crear clases para usar como parámetrode un evento

Para mantener las cosas sencillas, vamos a crearuna clase que usaremos como parámetro de los even-tos. Esta clase tendrá la misma funcionalidad que lamostrada en el código del fuente 1; es decir, la clasetendrá tres propiedades, dos de solo lectura y la ter-cera de lectura/escritura, ya que será la usada parasaber si se quiere cancelar la acción de asignar un nue-

vo valor a la propiedad. Las otras dos, las que indicanlos valores nuevo y anterior, serán de solo lectura, yaque lo único que le interesa al método receptor delevento es saber qué valores contienen, y como sonvalores directamente relacionados con una propiedadde una clase, no deberíamos manipularlos, ya que silo hacemos nos estaríamos saltando a la torera uno delos pilares de la programación orientada a objetos: laencapsulación. Pero... como somos los diseñadores dela clase, podemos hacer lo que mejor nos parezca, aun-que no voy a ser yo el que incite a esa decisión.

Las dos propiedades que vamos a exponer comode solo lectura las vamos a definir con los dos bloquesde código que habitualmente tienen todas las propie-dades, que como sabemos son el bloque get, que nospermite obtener el valor de la propiedad, y el bloqueset, que es el usado cuando asignamos el valor. Paradar esa funcionalidad de solo lectura a pesar de defi-nir el bloque set, vamos a usar la nueva característi-ca de .NET Framework 2.0 que nos permite cambiarel ámbito (o visibilidad) de uno de los bloques de laspropiedades (ver el número 20 de dotNetManía). Deesta forma, la clase expondrá públicamente solo el blo-que get, y el bloque set lo dejaremos como internal(Friend en Visual Basic) para que solo podamos usar-lo desde el propio ensamblado.

En el código del fuente 3 vemos la definición dela clase DatosCambiadosEventArgs, que es la que usa-remos como parámetro del delegado y el eventodefinidos en la clase Cliente (ver el fuente 4). Ambasclases están definidas en una biblioteca de clases,que tendremos que añadir a las referencias del pro-

dotN

etM

anía

<<

36

dnm.inicio.taller<<

Fuente 2. El método que recibe el evento puede cancelar la asignación

static void cli_NombreCambiadoRef(string nuevo, string anterior, ref bool cancelar)

{// Cancelamos la acción si el nuevo valor no// cumple las condiciones que estimemos oportunasif( string.IsNullOrEmpty(nuevo) || nuevo.Length < 3 ){Console.WriteLine( “cancelando... debe tener más” +

“ de 2 caracteres...”);cancelar = true;

}}

Fuente 3. La definición de la clase basada en EventArgs

public class DatosCambiadosEventArgs : EventArgs{

// Propiedad de solo lectura cuando se accede// desde fuera del propio ensambladoprivate string m_Nuevo;public string Nuevo{

get { return m_Nuevo; }internal set { m_Nuevo = value; }

}

// Propiedad de solo lectura cuando se accede// desde fuera del propio ensambladoprivate string m_Anterior;public string Anterior{

get { return m_Anterior; }internal set { m_Anterior = value; }

}

private bool m_Cancelar;public bool Cancelar{

get { return m_Cancelar; }set { m_Cancelar = value; }

}}

Page 37: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

yecto en el que definimos la clase que interceptarálos eventos y añadir la importación correspondien-te del espacio de nombres que las contiene. Una vezhecho eso, la podremos usar tal como vemos en elcódigo fuente 5.

Definir la clase del evento en el mismo ensambladoque el cliente

Si en lugar de crear un ensamblado para las clases(la que produce el evento y la que define el paráme-tro de dicho evento) decidimos que estén todas en elmismo ensamblado (proyecto), el hecho de propor-cionar ámbitos diferentes a los bloques set de las dospropiedades que queremos que sean de solo lecturano nos soluciona la papeleta, ya que al estar declara-dos esos bloques con internal, serán accesibles desdecualquier parte del mismo ensamblado, y por tantotambién desde el código de la aplicación cliente. Porlo tanto, en estos casos es preferible optar por la for-ma “recomendada” de definir esas propiedades comode solo lectura, y para poder asignarles el valor quetendrán lo haremos por medio de un constructor para-metrizado. De esta forma, desde el constructor podre-mos asignar los valores correspondientes a los cam-pos privados que siempre definimos para cada propie-dad. En el código del fuente 6 tenemos la definiciónde la clase usada como parámetro de los eventos.

En el código del fuente 6 también podríamos haberusado la característica de tener diferentes niveles deaccesibilidad en las propiedades, pudiendo definir

dotN

etM

anía

<<

37

dnm.inicio.taller<<

Fuente 4. Parte de la clase Cliente en la que se definen loseventos que usan la clase definida en el fuente 3

public class Cliente{public delegate void DatosCambiadosEventHandler(

DatosCambiadosEventArgs e);

public event DatosCambiadosEventHandler NombreCambiado;

private string m_Nombre;public string Nombre{get { return m_Nombre; }set{// Lanzar el evento// indicando el nuevo valor y el anteriorif( NombreCambiado != null ){// Declaramos un objeto del tipo de la clase// usada para usar como parámetro del evento.DatosCambiadosEventArgs e =

new DatosCambiadosEventArgs();e.Cancelar = false;// Desde el propio ensamblado podemos acceder// al bloque set de las propiedadades Nuevo // y Anteriore.Nuevo = value;e.Anterior = m_Nombre;// Lanzamos el evento usando como argumento el // objeto creado a partir de la clase.NombreCambiado(e);// Comprobar si se cancela la asignaciónif( e.Cancelar ){

// Lo que haya que hacer para avisar// que se ha cancelado la asignaciónreturn;

}}m_Nombre = value;

}}// No mostrado el resto de la definición de la // clase Cliente

Fuente 5. El método que intercepta el evento definido en el fuente 4

static void cli_NombreCambiado(DatosCambiadosEventArgs e){if( string.IsNullOrEmpty(e.Nuevo) || e.Nuevo.Length <

3 ){Console.WriteLine(“ cancelando... debe tener” +

“ más de 2 caracteres...”);e.Cancelar = true;// Si la clase que define el parámetro// está en otro ensamblado// esta propiedad será de solo lectura//e.Nuevo = “Miguel”;

}}

Fuente 6. Definición de la clase basada en EventArgs usandoun constructor con parámetros

class DatosCambiadosEventArgs : EventArgs{

public DatosCambiadosEventArgs(string nuevo, string anterior)

{m_Nuevo = nuevo;m_Anterior = anterior;

}

private string m_Nuevo;public string Nuevo{

get { return m_Nuevo; }}

private string m_Anterior;public string Anterior{

get { return m_Anterior; }}

private bool m_Cancelar;public bool Cancelar{

get { return m_Cancelar; }set { m_Cancelar = value; }

}}

Page 38: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

como private el bloque set, ya que solo necesitaría-mos accederlo desde la propia clase que lo define,impidiendo de esa forma que se pueda asignar un valordesde fuera de la clase.

Métodos de apoyo para producir los eventos

Otra de las recomendaciones que atañen a los even-tos que tenemos definidos en una clase (o tipo), es lade crear un método (habitualmente definido como pro-tegido) que sea el que en realidad se encargue de pro-ducir el evento. De esa forma, cuando queramos lan-zar un evento, en lugar de hacerlo directamente usare-mos ese método, al que le pasaremos los parámetroscorrespondientes y será el encargado de producir elevento. La razón de hacerlo así, y la de definir esosmétodos como protected (protegidos) es para que des-de las clases derivadas tengamos una forma fácil de pro-ducir los eventos que define la clase base sin necesidadde escribir todo el código que necesitemos cada vez quetengamos que producir un evento. La nomenclaturarecomendada para este tipo de métodos es que tengael mismo nombre que el evento, pero empezando conOn; en el caso del evento NombreCambiado, ese métodose llamará OnNombreCambiado. Esos métodos de apoyotambién suelen ser de tipo void (no devuelven un valor),pero en el ejemplo que estamos usando a lo largo deeste artículo podemos hacer que devuelva un valor detipo bool, de forma que nos indique si se cancela o nola asignación de la propiedad. El hacerlo así es porquees preferible que devuelva un valor verdadero o falsoen lugar de usar un parámetro por referencia.

Para que tengamos las cosas claras, en el códigodel fuente 7 podemos ver la definición del método deapoyo para el evento NombreCambiado, además de vercómo podemos usar ese método desde el bloque setde la propiedad Nombre.

Recordemos que el método de apoyo OnNombreCambiado devuelve un valor de tipo bool porque eso eslo que necesitamos, ya que desde la propiedad tene-mos que saber si se cancela o no la asignación del nue-vo valor. En el código completo que acompaña al artí-culo, la propiedad Apellidos también utiliza un méto-do para lanzar el evento, pero en ese caso el valor dela propiedad Cancelar se ignora; por tanto, el méto-do está declarado como void (Sub en Visual Basic), yaque no necesita devolver nada.

Eventos definidos en clases para usarlasen formularios

Todos los eventos de los controles de Windows.Forms siempre tienen dos parámetros: el primero hacereferencia al objeto que produce el evento (el control)y el segundo contiene la información sobre el evento(normalmente una clase derivada de EventArgs). Si noha de proporcionar ninguna información, este último

parámetro se define del tipo base EventArgs, pero siem-pre se utiliza, más que nada para dar “consistencia” ala forma de declarar los eventos.

Sabiendo esto, debemos hacer un par de aclara-ciones. La primera es que si nosotros definimos unaclase basada en cualquier control, con idea de poderusarla en los formularios, y añadimos nuevos eventos,e incluso creamos nuestra propia clase para definir losparámetros de esos eventos, a la hora de producir elevento debemos tener en cuenta que el primer pará-metro del delegado asociado a ese evento (y por tan-to del método que recibe la notificación) es de tipoobject, y representa al control que produce el even-to. Como somos nosotros los que hemos definido esaclase, y desde ella lanzamos el evento, ese primer pará-metro debe hacer referencia a la propia clase que pro-duce el evento. Por otra parte, el segundo parámetroes de la clase que usamos para dar información alreceptor del evento sobre lo que debe tener en cuen-ta en relación con ese evento que acaba de producir-se; y aquí es cuando entra la segunda aclaración, yaque para ser “consistentes” con la forma de definir yusar los eventos en los formularios, nuestros eventostambién deben tener siempre un segundo parámetro

dotN

etM

anía

<<

38

dnm.inicio.taller<<

Fuente 7. Definición y uso de un método de apoyo desde elque lanzamos el evento

public string Nombre{get { return m_Nombre; }set{// Lanzar el evento// indicando el nuevo valor y el anterior.if( NombreCambiado != null ){// Usamos el método de apoyo para lanzar el eventoif( OnNombreCambiado(value, m_Nombre) ){// Lo que haya que hacer para avisar// que se ha cancelado la asignaciónConsole.WriteLine( “ Cancelado el nuevo “ +

“nombre: {0}.”, value);return;

}}m_Nombre = value;

}}

// Si vamos a usar un método de apoyo para lanzar // el evento y vamos a tener en cuenta la propiedad// Cancelar el método debería devolver el valor de// cancelaciónprotected bool OnNombreCambiado(string nuevo, stringanterior){DatosCambiadosEventArgs e =

new DatosCambiadosEventArgs(nuevo, anterior);e.Cancelar = false;NombreCambiado(e);return e.Cancelar;

}

Page 39: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

derivado del tipo EventArgs; si no es necesario pro-porcionar información extra, al menos debemos usarla propia clase base.

En el código del fuente 8 vemos la definición delmétodo asociado al evento de una clase derivada deTextBox que produce el evento TextoCambiado (el equi-valente a DatosCambiados que hemos estado viendohasta ahora).

En nuestro caso, el evento TextoCambiado seráequivalente al evento TextChanged definido en la cla-se base (TextBox) de nuestro control, evento quenosotros aprovechamos para saber cuándo se pro-duce un cambio en el texto. Y para saber cuándo seproduce el evento, podemos usar el método asocia-do al evento que la propia clase base TextBox defi-ne: OnTextChanged. Aunque dentro de ese métodono hagamos nada en especial (salvo que queramosvolver a asignar el texto que ya hubiera de antes),debemos hacer la llamada al evento TextoCambiadopara que el cliente se entere de que se está cambian-do el texto, y antes de llamar al método OnTextoCambiado hay que seguir haciendo la comprobaciónde que en realidad alguien está interceptando elevento, así evitamos los problemas que comento enel cuadro “De la importancia de comprobar en C#si se interceptan los eventos”.

En el código del fuente 9 podemos ver cuál podríaser el código del método OnTextChanged, que es másextenso en el código incluido en el ZIP que acompa-ña al artículo, para que veamos otras posibilidades rela-cionadas con lo que podemos hacer si el cliente can-cela la acción.

Aunque ese cambio también se puede producir alasignar directamente el texto. Por tanto, en la propie-dad Text también hacemos la correspondiente com-probación, tal como podemos ver en el código delfuente 10.

Y ya que estamos con un control personalizado,comentar que podemos usar el atributo DefaultEventAtribute para indicar cual será el evento prede-terminado de la clase. En nuestro caso, será el even-

dotN

etM

anía

<<

39

dnm.inicio.taller<<

Fuente 8. El evento DatosCambiados aplicado a una clasederivada de TextBox

// El delegado para el evento TextoCambiadopublic delegate void DatosCambiadosEventHandler(

object sender, DatosCambiadosEventArgs e);

public event DatosCambiadosEventHandler TextoCambiado;

protected bool OnTextoCambiado(string nuevo, string anterior)

{DatosCambiadosEventArgs e =

new DatosCambiadosEventArgs(nuevo, anterior);e.Cancelar = false;TextoCambiado(this, e);return e.Cancelar;

}

Fuente 9. El código del método protegido OnTextChanged

protected override void OnTextChanged(EventArgs e){// Si no hacemos esta comprobación,// no podremos agregar el control al formulario.if( TextoCambiado != null ){// Lanzar el evento, aunque no hagamos nada, por // tanto tampoco hace falta saber si se cancela o noOnTextoCambiado(this.Text, m_Text);

}// Dejamos que la clase base termine de procesar // el eventobase.OnTextChanged(e);

}

Fuente 10. En la propiedad Text del control tambiéncomprobamos si se debe aceptar el cambio

public override string Text{

get { return base.Text; }set{

if( TextoCambiado != null ){

if( OnTextoCambiado(value, base.Text) ){

return;}

}m_Text = value;base.Text = value;

}}

Como hemos estado viendo en los ejemplos de esta serie de artículos, cadavez que en C# queremos lanzar un evento, siempre debemos comprobar si eseevento se está interceptando (comprobamos si el evento no es nulo).Tal compro-bación no es necesario hacerla en Visual Basic, y esta nota de advertencia va espe-cialmente dirigida a los que antes programaban con Visual Basic (para .NET o ante-rior) y también para aquellos que quieren empezar a trabajar con C#,ya que si nohacemos esa comprobación y no se está interceptando el evento, será en tiempode ejecución cuando recibamos el error de que el objeto no está creado; pero lainformación que recibiremos no será demasiado aclaratoria. Por ejemplo, si eseevento se produce en una clase derivada como es el caso de MiTextBox,y se inten-ta lanzar (sin antes comprobar si se está interceptando) en el método OnTextChanged,esto impedirá incluso que ese control lo podamos agregar a un formulario en tiem-po de diseño. El diseñador de Windows Forms simplemente producirá un errorde que hacemos referencia a un objeto no inicializado y, con suerte (haciendo eltrabajo manualmente),detectaremos que el causante de ese error es la propiedadText. En el código de ejemplo que acompaña a este artículo encontrarás una ver-sión “errónea” del control MiTextBox.

De la importancia de comprobar en C# si se interceptan los eventos

Page 40: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

to que acabamos de definir, tal comovemos en el código del fuente 11. Deesa forma, al hacer doble clic en el con-trol, se generará automáticamente eseevento.

Usar parámetros de la clase base enlos métodos que reciben eventos

Tal como vimos en el artículo dedi-cado a los delegados (dotNetManíanº 30), una de las novedades de C# 2.0es permitir (por medio de la contra-varianza) usar en los delegados pará-metros de la clase base del tipo real-mente definido en el delegado. Porejemplo, el delegado que usamos enel evento TextoCambiado tiene defini-do un parámetro del tipo DatosCambiadosEventArgs que se deriva deEventArgs; pues bien, el método queintercepta ese evento lo podemos defi-nir usando como parámetro o un tipoDatosCambiadosEventArgs o de cual-quiera que esté en la jerarquía de esaclase, en nuestro caso, el tipoEventArgs (y por extensión el tipoObject), con lo cual podemos haceralgo como lo mostrado en el códigodel fuente 12.

Esto mismo es aplicable al resto deeventos, y no solo a los que nosotrosdefinamos. Por ejemplo, podemos inter-ceptar el evento MouseMove tal comovemos en el fuente 13.

Como ya comentamos en su momen-to, esto no está permitido en Visual Basicni en las versiones anteriores de C#. Y lohemos querido aclarar (tanto que enVisual Basic no se puede hacer como queen C# 2.0 sí se puede), porque ahora quedesde el pasado mes de noviembre estádisponible la nueva versión 3.0 de .NETFramework (antes conocido comoWinFX), al interceptar los eventos pro-ducidos en los controles usados enWindows Presentation Foundation (lo queantes se conocía como Avalon), en reali-dad el parámetro de esos eventos sueleestar derivado de RoutedEventArgs, y esmuy común que al estar acostumbra-dos a crear métodos que interceptaneventos en los controles definidos enWindows.Forms queramos seguir usandoel parámetro EventArgs. Si usamos esetipo de parámetro en vez del “correcto”,en C# no pasará nada y todo funcionarábien, pero en Visual Basic recibiremosun error indicándonos que el evento aso-

ciado con ese método no tiene la mismafirma que el definido en el evento. Enrealidad, lo que hay detrás de esa nuevacaracterística de los eventos “enrutados”de los controles que usaremos en nues-

tros proyectos XAML no es tan simplecomo la forma de usarlos, pero ese es otrotema.

ConclusionesCon este artículo damos por finali-

zado, al menos por ahora, el tema de losdelegados y eventos que hemos estadotratando desde hace tres números. Porsupuesto, confiamos que todo lo comen-tado haya servido para dar al lector unavisión clara de cómo usar los eventos ylos delegados, al menos desde el puntode vista de la relación tan estrecha quetienen con los eventos.

A pesar de que lo habitual en esta sec-ción de la revista es que el código mos-trado y el lenguaje usado sea C#, el núme-ro anterior lo dedicamos completamen-te a Visual Basic, ya que en ese artículonos centramos en una instrucción exclu-siva de la versión 2005 de ese lenguaje.Con esto quiero aclarar que no es que notengamos en cuenta a los programadoresde Visual Basic en esta sección de inicio,ya que como suele ser costumbre, el códi-go que acompaña a estos artículos siem-pre incluye los ejemplos en ambos len-guajes (al menos cuando hay equivalen-cia, ya que en ocasiones, algunas de lascosas mostradas solo se pueden hacer enuno de los dos lenguajes). Pero la inten-ción siempre es mostrar los fundamentosde la programación en .NET, y será cosadel lector decidir con qué lenguaje poneen práctica esa información, y siempreintentamos que todo quede explicado deuna manera suficientemente clara, cual-quiera que sea el lenguaje que el lectordecida usar.

dotN

etM

anía

<<

40

dnm.inicio.taller<<

Fuente 11. Indicar que evento es el que usaráel diseñador de formularios como evento

predeterminado

[DefaultEvent(“TextoCambiado”)]public class MiTextBox : TextBox{

Fuente 12. Podemos definir métodos que usen parámetros de clases base del parámetro que el delegado define

void miTextBox1_TextoCambiado(object sender, EventArgs e){

DatosCambiadosEventArgs e2 = (DatosCambiadosEventArgs)e;if( string.IsNullOrEmpty(e2.Nuevo) || e2.Nuevo.Length < 4 ){

label1.Text = “¡¡¡ Debes escribir más de tres caracteres !!!”;label1.Text += “\nAnterior: “ + e2.Anterior;e2.Cancelar = true;

}else{

label1.Text = miTextBox1.Text;}

}

//private void btnAsignar_MouseMove(object sender, MouseEventArgs e)private void btnAsignar_MouseMove(object sender, EventArgs e){

MouseEventArgs e2 = (MouseEventArgs)e;label1.Text = e2.X + “, “ + e2.Y;

}

Fuente 13. Con el resto de eventos también podemos usar las clases base comoparámetro del método

Page 41: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos
Page 42: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

(Community Technology Preview) dediciembre de 2006 nos muestra numerosas venta-jas, como son las animaciones de gráficos vecto-riales en 2D y la reproducción de vídeo y audio. Yla forma de poder representar este mundo de ani-maciones y sonido en nuestros navegadores se nospresenta en forma de plug-in; en esta versión pre-liminar son varios los navegadores soportadosademás del Internet Explorer 6 y 7, como Firefoxo Safari; incluso es posible ejecutarlo sobre Mac yPowerPC.

WPF/E se nos presenta actualmente como unaalternativa para crear diversos elementos en nuestraspáginas que proporcionarán un valor añadido a nues-tro código HTML. Ambos mundos pueden convivirya que siguen una misma filosofía. En la actualidadaccedemos a los elementos de HTML medianteJavascript, ya que estos elementos son enviados alcliente en texto plano; del mismo modo, WPF/E nosbrinda esta oportunidad, dotándonos de la potenciade poder acceder a sus elementos XAML desdeJavascript.

Iniciándonos en WPF/EPrimeramente crearemos un sencillo ejemplo

mediante el que mostraremos paso a paso cómo pode-mos incorporar el plug-in de WPF/E en nuestras pági-nas y hacer uso del mismo. Nuestro ejemplo constaráde una simple pelota que irá rebotando en los bordesde nuestro control; para ello, utilizaremos un docu-mento XAML que definirá dos imágenes, una de fon-do y otra que representará la pelota en cuestión.Gracias a la utilización de Javascript, podremos inte-ractuar con las propiedades de nuestra pelota.

Aunque en la actualidad Microsoft nos provee deunas plantillas para la creación de proyectos WPF/E(incluidas junto al CTP SDK –ver figura 1–), las cua-les nos abstraen de todas las interioridades no vincu-ladas con la funcionalidades propias de nuestra apli-cación, en este artículo intentaremos desvelar algu-nas de éstas y profundizar en ellas, ya que eso nos pro-porcionará una visión más detallada.

Para comenzar, crearemos un proyecto Web clá-sico mediante la plantilla “ASP.NET Web Site”. Eneste proyecto web incluiremos, mediante “Add NewItem”, un fichero XML que renombraremos comoXAML (si dispone de las extensiones OrcasDevelopment Tools, que nos permiten trabajar conficheros XAML, podrá disfrutar de Intellisense). Unavez creado este fichero, incluiremos el código mos-trado en el fuente 1.

Una mirada a WPF/EWPF/E (Windows Presentation Fundation Everywhere) se nos presenta como unsubconjunto de WPF. Este subconjunto ha sido seleccionado con la intención deproporcionarnos diversas funcionalidades que permitirán la creación de entornosvisuales ricos en nuestras páginas; tales entornos eran impensables hasta el momen-to, mediante la utilización únicamente de HTML.

<< La reciente CTP

José Luis Quintero

dnm.plataforma.net

José Luis Quinteroes consultor senior de

Matchmind.Actualmenteresponsable del Centro de Alto

Rendimiento (CAR.NET) enTecnología Microsoft.Miembroactivo de la comunidad con su

sitio Web http://www.elquintero.net

Figura 1.Nuevo proyecto WPF/E Javascript Application

Page 43: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

En este código podemos observar,aparte de los establecimientos de espa-cios de nombres, la declaración de dosimágenes que se encuentran ubicadasen nuestro directorio resources.También podemos destacar la llama-da al método MoverPelota en elmomento de la finalización de la car-ga del documento; este método seráel encargado de acceder a las propie-dades de nuestra imagen y dotarla delmovimiento que esperamos. El códi-go de dicho método podemos verlo enel fuente2.

Como se puede observar, gracias ala definición de los identificadorescreados en el documento XAML(x:Name="Pelota") podremos acceder anuestros elementos desde Javascript entiempo de ejecución.

Una vez creados tanto el ficheroXAML como el fichero Javascript quenos dotará de la funcionalidad de movi-miento, pasaremos a definir los ele-mentos necesarios en nuestra páginapara que pueda ser mostrado nuestrocontrol WPF/E.

Junto a las plantillas de creaciónde proyectos WPF/E Microsoft nosproporciona un fichero Javascript(aghost.js, incluido en el SDK), elcual se encarga de la identificacióndel navegador del cliente y de tomarla decisión sobre cómo incrustarnuestro control. En el caso deInternet Explorer, esto se realizamediante la etiqueta <object>, encar-gada de instanciar el objeto en formade ActiveX; en el caso de otros nave-gadores, como puede ser Firefox, seutilizará <embed>. En el fuente 3podemos ver la definición de nuestraetiqueta <object> para el caso deInternet Explorer.

Ya que contamos con el mencio-nado fichero aghost.js, nos servire-mos de él y lo incluiremos en la pági-na junto con nuestro ficheroJavascript, como se muestra en elfuente 4.

Una vez asociados los ficherosJavascript y abstrayéndonos de cómose incrustará nuestro control en elnavegador, procederemos a crear unanueva instancia, a la cual le indicamoslos parámetros necesarios, como sepuede ver en el fuente 4. Con esto ya

1 <Canvas xmlns=”http://schemas.microsoft.com/client/2007”2 xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”3 Loaded=”javascript:MoverPelota”>4 <Image Source=”resources/FondoPelota.png” Width=”500” Height=”400” />5 <Image x:Name=”Pelota” Source=”resources/Pelota.png” Width=”58” Height=”56” />6 </Canvas>

Fuente 1

1 var x=250; var y=200;2 var xpos=1;var ypos=1;3 var velocidad=1;4 function MoverPelota() {5 x+=velocidad*xpos;6 y+=velocidad*ypos;7 var wpfe = document.getElementById(“Controlwpfe”);8 var(imgPelota = wpfe.findName(“Pelota”))9 if (x>wpfe.width-imgPelota.width) xpos=-1;10 if (x<14) xpos=1;11 if (y>wpfe.height-imgPelota.height) ypos=-1;12 if (y<0) ypos=1;13 imgPelota[“Canvas.Left”] = x;14 imgPelota[“Canvas.Top”] = y;15 window.setTimeout(“MoverPelota()”, 10);16 }

Fuente 2

1 <object2 id=”WpfeControl”3 width=”100”4 height=”100”5 classid=”CLSID:32C73088-76AE-40F7-AC40-81F62CB2C1DA”>67 <param name=”BackgroundColor” value=”#ffebcd” />8 <param name=”SourceElement” value=null />9 <param name=”Source” value=”Ejemplo.xaml” />10 <param name=”WindowlessMode” value=”true” />11 <param name=”MaxFrameRate” value=”30” />12 <param name=”OnError” value=”myErrorHandler” />13 </object>

Fuente 3

...1 <head>2 <title>Una mirada a “WPF/E”</title>3 <script type=”text/javascript” src=”js/aghost.js”></script>4 <script type=”text/javascript” src=”js/scriptPelota.js”></script>5 </head>6 <body>7 <div id=”wpfeControl1Host”>8 <script type=”text/javascript”> 9 var ag = new agHost(“wpfeControl1Host”,// Elemento HTML que posicionará

// nuestro control10 “Controlwpfe”, // ID del Control ActiveX de WPF/E que creamos 11 “487”,”400”, // Ancho y alto del control12 “white”, // Color de fondo13 null, // Nombre de etiqueta de script que contiene el XAML14 “pluginPelota.xaml”, // Archivo fuente15 “false”, // IsWindowless false - fondo transparente16 “30”, // Especifica el número máximo de frames por segundo17 null); // Especifica la función de gestión de errores18 </script>19 </div>20 </body>...

Fuente 4

dotN

etM

anía

<<

43

dnm.plataforma.net<<

Page 44: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

contamos con nuestra primera aplica-ción WPF/E; el resultado de la mismalo podemos ver en la figura 2.

Otras virtudes de WPF/E

Ahora que contamos con la base fun-damental para adentrarnos en este mun-do de animaciones y gráficos vectoria-les, intentaremos desvelar algunas de lasgrandes ventajas que nos proporcionaWPF/E. Muchas de ellas ya las pode-mos imaginar si hemos buceado un pocoen el universo de WPF.

Pinceles y formas básicas

En todo entorno gráfico existenoperaciones básicas, con las cuales setrabaja para formar diversas formasmás complejas; habitualmente sedenominan pinceles. En WPF/Etambién contamos con estos pincelesgracias a la clase SolidColorBrush, quenos proporciona la capacidad de cre-ar pinceles que posteriormentepodremos utilizar para rellenar nues-tras formas.

Como se muestra en el fuente 5, lospinceles pueden ser definidos con colo-res sólidos semitransparentes o bienestablecerles un degradado. El resulta-do que produce este código lo podemosver en la figura 3.

También vemos en este ejemplo laforma de crear diversas formasmediante otros elementos de XAML,que proporciona multitud de ellos,entre los que podemos encontrar:Ellipse, Rectangle, Line, Polygon(representa una forma cerrada con unnúmero arbitrario de lados), Polyline(nos muestra una serie de líneasconectadas que pueden o no consti-tuir una forma cerrada), Path (nosproporciona una forma de represen-tar diversas formas complejas comoarcos y curvas).

Transformaciones 2D

WPF/E nos permite la manipula-ción tanto de imágenes como de formasen dos dimensiones, y para ello nos dotade diversas clases:

• RotateTransform: Rota un elemen-to con el ángulo especificado.

• ScaleTransform: Escala un ele-mento a partir de la especificaciónde sus coordenadas X e Y.

• SkewTransform: Sesga un elemen-to a partir de los valores especifi-cados en sus ángulos AngleX eAngleY.

• TranslateTransform: Desplaza unelemento a partir de los valores ex-presados en sus coordenadas X e Y.

En el fuente 6 definimos un con-junto de formas, a las cuales les aplica-mos las diversas transformaciones. Elresultado de este código lo podemos veren la figura 4.

dotN

etM

anía

<<

44

dnm.plataforma.net<<

Figura 2. Ejecución del ejemplo

1 <Canvas xmlns=”http://schemas.microsoft.com/client/2007”2 xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”>34 <Rectangle Width=”100” Height=”100” Fill=”Red” />56 <Ellipse Width=”100” Height=”100” Canvas.Left=”80” Canvas.Top=”65”>7 <Ellipse.Fill>8 <RadialGradientBrush>9 <GradientStop Color=”Yellow” Offset=”0.0” />10 <GradientStop Color=”Red” Offset=”0.25” />11 <GradientStop Color=”Blue” Offset=”0.75” />12 <GradientStop Color=”LimeGreen” Offset=”1.0” />13 </RadialGradientBrush>14 </Ellipse.Fill>15 </Ellipse>1617 <Rectangle Opacity=”0.6” Height=”100” Width=”100” Canvas.Left=”155”18 Canvas.Top=”10” Stroke=”#105581” StrokeThickness=”10” Fill=”#5991B5” />1920 <Path Data=”M 20,100 C 20,340 300,-200 150,150z”21 Stroke=”#135E92” Fill=”#CAF2DF”22 Canvas.Left=”30” Canvas.Top=”105” />2324 </Canvas>

Fuente 5

Figura 3. Ejecución del ejemplo delfuente 5

Figura 4. Ejecución del ejemplo del fuente 6

Page 45: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Creando animaciones

Al igual que en WPF, para el tra-tamiento de animaciones podemoscontar con el elemento <Storyboard>.Este elemento nos permite modificarcasi cualquier propiedad de un ele-mento XAML en tiempo de ejecucióny variarla en función del tiempo,dotándonos de una gran funcionali-dad, gracias a la cual podremos reali-zar animaciones de diversos tipos,como traslaciones, cambios de opaci-dad, rotaciones, etc.

Para mostrar lo expuesto ante-riormente hemos programado dos ani-maciones, que podemos ver en el fuen-te 7. En la primera de ellas realizamosuna rotación de un rectángulo, varian-do para ello su propiedad Angle de 0a 360 grados en un intervalo de tiem-po de 5 segundos. En la segunda delas animaciones modificamos la pro-piedad Left de una imagen que con-tiene una forma de paloma, consi-guiendo así un efecto de movimientode la misma.

El resultado de ambas animacionesse presenta la figura 5, en la que pode-mos observar tanto el efecto de trasla-ción de la imagen como el de rotacióndel rectángulo.

Vídeo y audio

En lo concerniente a reproducciónde vídeo y audio, WPF/E nos propor-ciona el elemento <MediaElement>. Esteelemento nos permite la reproduccióntanto de vídeo como de audio, sopor-

dotN

etM

anía

<<

45

dnm.plataforma.net<<

...1 <Rectangle2 Canvas.Left=”50” Canvas.Top=”20” Width=”50” Height=”50”3 Fill=”RoyalBlue”>4 <Rectangle.RenderTransform>5 <RotateTransform Angle=”45” />6 </Rectangle.RenderTransform>7 </Rectangle>89 <Rectangle10 Canvas.Left=”25” Canvas.Top=”120” Width=”50” Height=”50” Fill=”Green”>11 <Rectangle.RenderTransform>12 <SkewTransform AngleY=”10”/>13 </Rectangle.RenderTransform>14 </Rectangle>1516 <Ellipse Canvas.Left=”100” Canvas.Top=”30”17 Width=”50” Height=”50” Fill=”RoyalBlue”>18 <Ellipse.RenderTransform>19 <ScaleTransform ScaleX=”2”/>20 </Ellipse.RenderTransform>21 </Ellipse>2223 <Ellipse Opacity=”0.6” Canvas.Left=”125” Canvas.Top=”125”24 Width=”50” Height=”50” Fill=”RoyalBlue”>25 </Ellipse>2627 <Ellipse Canvas.Left=”125” Canvas.Top=”125”28 Width=”50” Height=”50” Fill=”RoyalBlue”>29 <Ellipse.RenderTransform>30 <TranslateTransform X=”10” Y=”10”/>31 </Ellipse.RenderTransform>31 </Ellipse>

...

Fuente 6

...3 <!—Rectangulo—>4 <Rectangle5 Canvas.Left=”50” Canvas.Top=”90” Width=”50” Height=”50” Fill=”RoyalBlue”>6 <Rectangle.RenderTransform>7 <RotateTransform x:Name=”Transform” Angle=”45” CenterX=”25” CenterY=”25” />8 </Rectangle.RenderTransform>9 <Rectangle.Triggers>10 <EventTrigger RoutedEvent=”Rectangle.Loaded”>11 <BeginStoryboard>12 <Storyboard>13 <DoubleAnimation14 Storyboard.TargetName=”Transform”15 Storyboard.TargetProperty=”Angle”16 From=”0” To=”360” Duration=”0:0:5” RepeatBehavior=”Forever” />17 </Storyboard>18 </BeginStoryboard>19 </EventTrigger>20 </Rectangle.Triggers>21 </Rectangle>22 <!—Paloma—>23 <Canvas.Triggers>24 <EventTrigger RoutedEvent=”Canvas.Loaded”>25 <EventTrigger.Actions>26 <BeginStoryboard>27 <Storyboard>28 <DoubleAnimation29 Storyboard.TargetName=”Paloma”30 Storyboard.TargetProperty=”(Canvas.Left)”31 To=”300” Duration=”0:0:3” RepeatBehavior=”Forever” />32 </Storyboard>33 </BeginStoryboard>34 </EventTrigger.Actions>35 </EventTrigger>36 </Canvas.Triggers>37 <Image x:Name=”Paloma” Height=”77” Width=”55”38 Canvas.Left=”10” Canvas.Top=”5” Source=”resources/Paloma.png” />...

Fuente 7

Figura 5. Ejecución del ejemplo delfuente 7

Page 46: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

tando actualmente los formatos WMV(Windows Media Video) y WMA (WindowsMedia Audio), aunque en futuras versio-nes el número de formatos se veráampliado, incluyéndose soporte paraMP3, entre otros.

Para poder incluir un elemento mul-timedia en nuestro control WPF/E, úni-camente deberemos declarar un ele-mento de este tipo, como se muestra enel fuente 8.

Al igual que los demás controlesderivados de UIElement, un objetoMediaElement contendrá las propieda-des compartidas de estos elementoscomo son Opacity, Clip, RenderTransform, etcétera, permitiéndolosvariar y distorsionar nuestro elemento.Adicionalmente, este control contienepropiedades propias como son:

• Stretch: Permite especificar dequé forma se mostrará nuestro vídeo en el control MediaElement,

soportando comovalores None, Uniform,UniformToFill y Fill.

•IsMuted: Permitedeshabilitar el audiode nuestro vídeo.

•Volumen: Permiteespecificar el volu-men de audio delobjeto MediaElement.Puede variar entre 0y 1, siendo su valorpor defecto 0,5.

También podre-mos controlar lareproducción delvídeo mediante losmétodos play, pausey stop, que podremosinvocar desde códigoJavascript. En elfuente 9 podemos verun ejemplo de unpequeño reproductormultimedia.

Al igual que en elprimero de nuestrosejemplos, controla-mos los eventos dereproducción delvídeo gracias a

Javascript; el código que implementaesta funcionalidad puede verse en elfuente 10, y el reproductor en ejecu-ción en la figura 6.

ConclusionesComo hemos podido ver a lo lar-

go de todo este artículo, WPF/E nosbrinda la oportunidad de construirexperiencias de usuario más ricas einnovadoras, incluyendo en las mis-mas vídeo, audio y animaciones en dosdimensiones. Todo ello gracias a unplug-in multi-navegador muy ligero (1Mb actualmente), con el cual pode-mos interactuar mediante códigoscript. Si unimos todo lo anterior aque los lenguajes utilizados muestrancompatibilidades ya conocidas conotras tecnologías como AJAX deASP.NET y WPF, podemos afirmarque este producto nos provee de unagran herramienta en el ámbito delentorno Web.

dotN

etM

anía

<<

46

dnm.plataforma.net<<

1 function btnStop_Click(sender, args) {2 sender.findName(“Reproductor”).stop();3 }45 function btnPause_Click(sender, args) {6 sender.findName(“Reproductor”).pause();7 }89 function btnPlay_Click(sender, args) {

10 sender.findName(“Reproductor”).play();11 }

1 <MediaElement x:Name=”Reproductor”2 Source=”resources/xbox.wmv”3 Width=”300” Height=”300” />

Fuente 8

1 <Canvas xmlns=”http://schemas.microsoft.com/client/2007”2 xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”>3 <MediaElement x:Name=”Reproductor” Source=”resources/xbox.wmv”4 Width=”300” Height=”300”/>5 <!— Boton Play—>6 <Canvas MouseLeftButtonDown=”javascript:btnPlay_Click”>7 <Rectangle Stroke=”#FF122C7E” StrokeThickness=”2” Canvas.Top=”262” RadiusX=”2”8 RadiusY=”2” Height=”23” Width=”55”>9 <Rectangle.Fill>10 <LinearGradientBrush StartPoint=”0.5,2.109” EndPoint=”0.5,-1.109”>11 <GradientStop Color=”#FF0068FF” Offset=”0.433”/>12 <GradientStop Color=”#FFEAEAEA” Offset=”0.269”/>13 <GradientStop Color=”#FF0B0E12” Offset=”0.769”/>14 </LinearGradientBrush>15 </Rectangle.Fill>16 </Rectangle>17 <TextBlock Canvas.Top=”264” Canvas.Left=”13” FontSize=”12”18 Foreground=”#FFFFFF” Text=”Play” />19 </Canvas>...48 <!— Marco del Video—>49 <Rectangle Canvas.Top=”32” Stroke=”#FF122C7E” Height=”230”50 Width=”300” StrokeThickness=”6” RadiusX=”2” RadiusY=”2” />51 <!— Logo WPF—>52 <Path Stroke=”transparent” Canvas.Left=”210” Canvas.Top=”170”53 StrokeThickness=”0.5”54 Data=”M... “>55 <Path.Fill>... <RadialGradientBrush>

Fuente 9

Fuente 10

Figura 6. Ejecución del ejemplo de los fuentes 7 y 8

Page 47: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dotN

etM

anía

<<

47

informa que se puedencrear manejadores personalizados usando tanto laextensión ASHX como la AXD. Aparte de laspequeñas diferencias sintácticas ¿cuál es la dife-rencia real entre estas dos opciones? No me pue-do creer que sea solamente una cuestión de sinta-xis; debe haber algo más. ¿Alguna idea?

No te convence la afirmación y tienes razón. Ladiferencia real entre los manejadores ASHX y AXDtiene más de distribución que de mera sintaxis.Entremos en detalles. Un manejador HTTP es uncomponente especial de ASP.NET –léase, una cla-se con una interfaz bien definida– que el entornode ejecución usa para procesar peticiones entrantesque se dirigen a ASP.NET. La clase System.Web.UI.Page es, por tanto, la más compleja y sofisticada detodos los manejadores HTTP. Recursos tales comoASMX, ASCX y ASAX tienen su propio manejadorHTTP que se encarga de procesar las peticiones.En particular, el manejador HTTP encargado deservir los recursos ASAX finaliza la petición lanzan-do una excepción debido a que los recursos ASAXno se sirven al usuario, sino que son consumidosinternamente.

Cuando tienes que manejar un tipo de recursode forma especial, escribes un manejador persona-lizado. Por ejemplo, imagínate que necesitas extra-er una imagen de una base de datos, añadir unanota de copyright y devolverlo al usuario. ¿Cómolo harías? Las imágenes solo pueden servirsemediante la etiqueta <img> y esta etiqueta solo acep-ta un tipo gráfico MIME. La idea es que establez-cas un manejador HTTP personalizado, y por lo

tanto su URL, y le pases información suficiente enla cadena de consulta poder recuperar la imagenque necesitas. Internamente, el manejador HTTPprocesará los bits de la imagen y añadirá cualquiermarca de agua solicitada, configurando de formacorrecta la respuesta para servirle la imagen.Después, enlazarás este código a la etiqueta <img>usando la URL de manejador HTTP.

Como se ha mencionado, un manejador HTTPes una clase administrada que implementa la inter-faz IHttpHandler. La interfaz se compone de dosmétodos: IsReusable y ProcessRequest. El prime-ro simplemente devuelve un valor booleano queindica si se requiere una nueva instancia de la cla-se de manejador para cada petición; el otro méto-do simplemente define el comportamiento delmanejador y configura el stream de respuesta como

Mi meta es el rendimiento

Dino Esposito

dnm.todotnet.qa

<< La documentación de ASP.NET

Dino Esposito es mentor de Solid Quality

Learning y autor de “ProgrammingMicrosoft ASP.NET 2.0 CoreReference” y “Programming

ASP.NET 2.0 Applications AdvancedTopics”, ambos de Microsoft

Press.Afincado en Italia,Dino esun ponente habitual en los

eventos de la industria a nivelmundial.Visite su blog en:

http://weblogs.asp.net/despos.Puede enviarle sus consultas [email protected]

Rendimiento y distribución son los temas que trataremos este mes. Un lector pre-gunta cómo mejorar el arranque de una aplicación.No es tarea fácil; y no hay ningu-na “bala de plata” disponible. De cualquier forma, sí existe un larga lista de posiblessugerencias. Por otro lado, los manejadores (handlers) ASP.NET son adecuados paraservir peticiones especiales de una forma especial.Pueden escribirse bien como ASHXo como recursos AXD. ¿Cuál es mejor?

Un manejador HTTP es una claseadministrada que implementa lainterfaz IHttpHandler. La interfazse compone de dos métodos:IsReusable y ProcessRequest

“”

Page 48: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dotN

etM

anía

<<

48

dnm.todotnet.qa<<

se requiera. ¿Cómo se enlaza un manejador HTTPa una URL? En el fichero Web.config, se registra laclase del manejador HTTP como manejador para unconjunto de peticiones. A continuación vemos unejemplo.

<httpHandlers><add verb="*"

path="myHandler.aspx" type="Samples.SimpleHttpHandler,

SimpleHandler"validate="false" />

</httpHandlers>

Con esta configuración activa, cualquier peti-ción dirigida a myHandler.aspx será servida por laclase SimpleHttpHandler. El atributo verb permiteseleccionar los verbos que se tendrán en conside-ración. El atributo validate indica si el entorno deejecución de ASP.NET tiene que comprobar la exis-tencia del manejador al comenzar la aplicación o lohará bajo demanda.

El endpoint asociado con un manejador HTTPno tiene por qué ser un recurso físico. Una de lasdiferencias entre ASHX y AXD es, precisamen-te, si se trata de un recurso físico o un endpointvirtual.

Puedes escribir un manejador personalizadocomo una clase en C# o Visual Basic. NET y com-pilarlo en un ensamblado. A continuación, distri-buyes el ensamblado al directorio bin de la apli-cación y editas el fichero Web.config adecuada-mente. Funciona, y puedes usar cualquier exten-sión para definir la URL de destino. Sin embar-go, la extensión que utilices tiene que ser conoci-da por IIS. En otras palabras, IIS debe reconoceresa extensión, pongamos *.xyz, y en particular,saber que los recursos del tipo XYZ debe ser envia-dos al entorno de ejecución de ASP.NET. Así quesi quieres utilizar extensiones XYZ primero tie-

nes que añadir esa extensión a la metabase de IIS.Si no quieres, o no tienes permisos para escribiren la metabase de IIS, entonces debes utilizar laextensión AXD. La extensión AXD es registradaautomáticamente en la metabase de IIS cuando seinstala ASP.NET 2.0. A partir de ese momento,cualquier petición que termine en AXD es auto-máticamente redirigida a ASP.NET. Pero todavíaqueda configurar el fichero Web.config, para espe-cificar a qué endpoint apunta el manejador. Al edi-tar el fichero Web.config, se reinicia la sesión y seborra el estado de la sesión y el caché. Una solu-ción problemática, si hay que usarla con una apli-cación activa.

Escrito como un fichero ASHX, el manejadorHTTP, es, de alguna forma, auto-contenido. Sepuede insertar código C# o Visual Basic .NET yasea en línea, dentro del fichero ASHX, o en unaclase separada de código. A diferencia del AXD, laextensión ASHX es registrada automáticamente enASP.NET para ser manejada por la clase que indi-ca el propio fichero. Cualquier fichero ASHXcomienza por una cabecera especial:

<%@ WebHandler Language="C#" Class="Samples.MyHandler" %>

El atributo Class puede ser omitido si se inser-ta el código en línea. De lo contrario, todo el con-tenido del fichero ASHX está en la línea de cabe-cera. Con este truco del ASHX, se supone que laURL apunta a un recurso del servidor, que –inter-namente– utiliza la clase suministrada para gestio-narlo. Consecuentemente, para habilitar un mane-jador ASHX, todo lo que hay que hacer es colocarel fichero en cualquier carpeta de la aplicación Web,incluyendo la carpeta raíz. No se necesitan cam-bios ni en IIS ni en el fichero Web.config. La dis-tribución es de “costo cero”, y no se necesita rei-niciar la aplicación.

Concluyendo, si tu objetivo es minimizar el cos-to de la distribución (digamos que, porque vas ahacer cambios frecuentes a una aplicación activa)utiliza los recursos ASHX. En ese caso, el ficherocontendrá o hará referencia directa al código fuen-te. Si tu meta es la flexibilidad y no quieres enlazarun endpoint a un fichero en el servidor, opta por laextensión AXD. De esta forma, sitúas la informa-ción de enlace en el Web.config. La extensión AXDes preferible a cualquier otra personalizada, por-que te ahorras la edición manual de la metabase deIIS en tiempo de distribución.

Mi aplicación Windows tarda mucho en mos-trar su primera interfaz de usuario y no existe nin-gún cuello de botella donde el código pueda “col-garse” que justifique ese rendimiento tan pobre. Heañadido una ventana de “splash”, pero todavía resul-

Si tu meta es la flexibilidad y noquieres enlazar un endpoint aun fichero en el servidor, opta

por la extensión AXD

“”

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

Page 49: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dotN

etM

anía

<<

49

dnm.todotnet.qa<<

ta demasiado lenta. ¿Se puede intentar alguna otracosa?

Nos guste o no, las aplicaciones administradas.NET requieren de la carga del Framework antesde iniciar su funcionamiento. Si la aplicación es laprimera que se lanza cada mañana, cuando el usua-rio se conecta, ella correrá con los “costos” de esacarga inicial de la máquina virtual de .NET. Esteescenario es conocido también como “arranque enfrío”. En esta situación, una buena cantidad detiempo se gasta en operaciones de entrada/salidarequeridas para la carga de páginas en memoria.Tras esto, cualquier lanzamiento de la misma apli-cación (o de otra aplicación .NET), será significa-tivamente más rápido debido a que la mayoría delos ensamblados .NET ya se encuentran cargadosen memoria. Este otro escenario se conoce como“arranque en caliente”. No hay mucho que se pue-da hacer para minimizar esto, salvo reducir elnúmero de ensamblados a cargar. La reducción dela carga en memoria también disminuye la posibi-lidad de que la máquina tenga que entrar en algúnmomento en procesos de paginación. Como nor-ma general, ten en cuenta que una DLL de mayortamaño es también preferible a un conjunto demódulos pequeños.

Siempre hablando en general, deberías tratar deminimizar el trabajo realizado en Form_Load. Ten encuenta que no se muestra ninguna interfaz de usua-rio hasta que todo el trabajo de ese evento ha con-cluido. Ejemplos de procesos que enlentecen la car-ga inicial, son el relleno de los controles, operacio-nes de red o bases de datos, cachés de datos, etc.

Las tareas relativas a la inicialización y configu-ración, sin embargo, no se consideran críticas. Unaregla, muchas veces olvidada, establece que no debe-rías mostrar ninguna interfaz de usuario que no senecesite mostrar al principio. Por ejemplo, ¿por quérellenar todas y cada una de las páginas de un con-trol TabControl? Será mejor hacerlo cuando la apli-cación está en espera o cuando resulte absolutamen-te necesario. Si optas por el evento Application.Idle, ¡recuerda destruir el manejador de eventoscuando termines!

Ciertos controles ricos, tales como ListView yTreeView, nunca debieran de ser cargados enForm_Load porque esta tarea es una posible fuentede cuellos de botella. Y si tienes que hacerlo, almenos incluye ese proceso entre un par de senten-cias BeginUpdate/EndUpdate, de forma que se deten-ga el repintado del control para cada cambio indi-vidual. Además, utiliza el método AddRange() cuan-do tengas que insertar varios items. En general, lasoperaciones masivas son más eficientes que los cam-bios individuales.

Si todavía no obtienes el rendimiento deseado,evita la compilación Just-In-Time (JIT) mediante

el uso de la utilidad ngen.exe. Esto transforma elcódigo intermedio (lenguaje IL) en código máqui-na específico de tu CPU. Esto tiene ventajas einconvenientes, no obstante. Por un lado, el códi-go nativo puede ser compartido entre procesos.Esto no es una ventaja para el código en sí, peroes bueno cuando se comparten ensamblados. Porel contrario, el código JIT es privado a un proce-so y debe ser recreado cada vez. Omitiendo la com-pilación JIT, con toda seguridad apreciarás unamejora en el rendimiento. Es difícil decir, sinembargo, cuál será el impacto en un “arranque enfrío”. No existe compilación JIT, pero sí algunaoperación adicional de entrada/salida de carga decódigo binario.

El uso de ensamblados firmados también pue-de ayudar si les sitúas en el GAC (Global AssemblyCache). En este caso, te ahorras el tiempo que llevaverificar la firma del ensamblado para cada páginade memoria. Y, finalmente, puedes tratar de asig-nar una dirección de memoria base bien conocidapara cada DLL de tu programa. Haciéndolo de esaforma, evitas la carga del proceso de reubicación enmemoria.

En tu correo mencionas una ventana splash.Como has podido observar, una ventana de este tipohace cualquier cosa menos mejorar el rendimiento.Simplemente, entretiene al usuario un poco mejo-rando su percepción del rendimiento de la aplica-ción. Pero no hace nada para reducir el costo de lacarga.

Esta reciente oleada sobre AJAX trae a colaciónel objeto XMLHttpRequest. Sé que este objeto estáampliamente soportado, pero ¿es un estándar rati-ficado?

No todavía. Hay un comité W3C que trabajaactualmente en la elaboración de una API estándarpara el objeto XMLHttpRequest. El último borradorde trabajo está disponible en http://www.w3.org/TR/XMLHttpRequest.

Traducción por Marino Posadas

Ciertos controles ricos comoListView y TreeView, nunca

debieran de ser cargados enForm_Load, porque esta tarea

es una posible fuente de cuellosde botella

“”

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

Page 50: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

La aparición de herramientas como MicrosoftOffice 2007 trae consigo que todos los ojos de usua-rios y desarrolladores acaben fijándose al milímetroen cada aspecto de la nueva versión. Este tipo de apli-caciones a las que accede un número muy grande depersonas suelen ser tomadas como referencia por losdesarrolladores en aquellos aspectos más interesantesde cara a actualizar o mejorar la interfaz de usuariode sus aplicaciones.

Ribbon.NET proporciona unas librerías quepermiten dar el look and feel de Office 2007 a las apli-caciones desarrolladas bajo la plataforma .NET.Mediante una fácil implementación, estarás en dis-posición de dar a tus formularios un aspecto similaral que ofrece Office 2007, con bordes redondeados,tonos azul pastel, botones que parecen salirse de lapantalla, etc.

El aspecto de las aplicaciones transformadasmediante estas librerías parecerá haber sido sacadodirectamente del corazón de Office 2007. Hay quedestacar que los diseños que ahora muestra Office2007 han sido creados para entroncar con el nuevosistema operativo de Microsoft, Windows Vista.Desarrollados utilizando el nuevo motor de presen-tación de WinFX, estos controles representan unaauténtica revolución en el diseño y presentación deformularios.

Ribbon.NET permite formatear con aspecto deOffice 2007 los siguientes tipos de controles:

• RibbonFormBase: subclase que proporciona a losformularios Windows Forms el estilo y aspecto deOffice 2007.

• RibbonControl: proporciona el aspecto estándar deOffice 2007 a elementos en general.

• RibbonButton: permite crear botones con el aspec-to de Office 2007.

• RibbonButtonBar: permite crear paneles de contro-les con el aspecto de Office 2007.

• RibbonStatusBar: aporta a la barra de estado losestilos y el aspecto de Office 2007.

El código fuente muestra un pequeño fragmentode código en el que se puede apreciar lo sencillo quees implementar este tipo de librerías, en concreto unbotón de un formulario.

Si quieres estar a la última moda en diseño de apli-caciones, te recomendamos estas librerías que te ayuda-rán a dar ese toque final a tus aplicaciones y servirán devalor añadido de cara a su presentación.

Lorenzo Ponte

dnm.laboratorio.net

Lorenzo Ponte es redactor dedotNetManía. Es arquitecto de

sistemas y aplicaciones .NET.Experto en datawarehousing ybusiness intelligence,marketingintelligence y CRM analítico.

Actualmente es consultor de laempresa Matchmind y webmaster

de clikear.com

this.ribbonButtonControl.BackColor = System.Drawing.Color.Transparent;this.ribbonButtonControl.Image = (System.Drawing.Image)(resources.GetObject("ribbonButtonControl12.Image")));this.ribbonButtonControl.ImageAlignment = System.Drawing.ContentAlignment.MiddleLeft;this.ribbonButtonControl.Location = new System.Drawing.Point(169, 3);this.ribbonButtonControl.Name = "ribbonButtonControl12";this.ribbonButtonControl.Selected = false;this.ribbonButtonControl.Size = new System.Drawing.Size(70, 22);this.ribbonButtonControl.Style = CW.Ribbon.Renderers.RibbonControlRenderers.Office2007Blue;this.ribbonButtonControl.SuperTipSettings.DescriptionText = "";this.ribbonButtonControl.SuperTipSettings.FooterText = "";this.ribbonButtonControl.SuperTipSettings.ShowDelay = 1000;this.ribbonButtonControl.SuperTipSettings.TitleText = "Super Tip";this.ribbonButtonControl.SuperTipSettings.Visible = true;this.ribbonButtonControl.TabIndex = 1;this.ribbonButtonControl.Text = "Options";this.ribbonButtonControl.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;this.ribbonButtonControl.Click += new System.EventHandler(this.ribbonButtonControl12_Click);

Ficha técnicaNombre Ribbon.NETVersión 1Fabricante ComponentWorkshopWeb www.componentworkshop.com/Ribbon.aspxCategoría DiseñoPrecio $89Valoración

Ribbon.NET

Page 51: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dotN

etM

anía

<<

51

dnm.laboratorio.net<<

PowUploadTener que subir archivos a un servidor remoto

es una tarea diaria a la que se enfrentan multitudde desarrolladores. No solo los desarrolladoresdemandan este tipo de servicio; los usuarios comu-nes también quieren por sí mismos actualizar susportales o intranets, pudiendo subir documentos,imágenes, etc. confidenciales para ser utilizados porsus organizaciones.

Para realizar este tipo de acciones existe un pro-tocolo específico, FTP (File Transfer Protocol). Es unprotocolo bastante limitado a la hora de integrarlodentro de una aplicación o poder usarlo desde cual-quier PC conectado a Internet. PowUpload solucio-na este tipo de problemas. Entre sus principales carac-terísticas están que puede ser implementado en cual-quier aplicación desarrollada bajo la plataforma .NET,que todo el tráfico se realiza mediante HTTP (lo quehace posible utilizarlo desde cualquier PC que poseatan solo una conexión a Internet) y que permite subirde una vez hasta 1 Gb (con .NET Framework 1.0/1.1)o 2 Gb (con .NET Framework 2.0).

La forma de implementación es muy sencilla: pri-mero se debe crear un formulario, añadiéndole entreotros uno o más controles <INPUT TYPE=FILE> necesa-rios para seleccionar los archivos a subir. A continua-ción, podemos agregar un botón al formulario y aso-ciarle al evento ServerClick un gestor de evento quellame al método de PowUpload que se encargará derecorrer los controles tipo FILE e ir subiéndolos simul-táneamente al servidor.

PowUpload también proporciona un elementovisual consistente en una barra de progreso que indi-ca en todo momento el porcentaje de subida durante

el proceso. Este componente es muy importante, yaque nos dará una referencia de lo que queda por subiral servidor. PowUpload también permite cancelar elproceso en cualquier momento, matando el procesoque utiliza y liberando la memoria del PC.

Otra de las características útiles de PowUpload es lacompatibilidad con SSL (HTTPS), para el caso en quelos archivos a subir necesiten un extra de seguridad.

El código fuente muestra la programación típicadel evento que desencadena las subidas.

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

{string FolderToSave = Server.MapPath("") + "\\Archivos\\";Upload UploadResult = new Upload();if(UploadResult.Files != null && UploadResult.Files.Count>0){UploadedFile myFile = UploadResult.Files["file1"];myFile.SaveAs(FolderToSave + myFile.SafeFileName, true);IMGPATH = "UploadedFiles/" + myFile.SafeFileName;ReadProperties();

}}

Ficha técnicaNombre PowUploadVersión 1Fabricante element-itWeb www.element-it.com/PowUpload.aspxCategoría UtilidadesPrecio $199Valoración

PowerWEB Zoom for ASP.NET

PowerWEB Zoom es un componente que dotade la posibilidad de aumento/reducción (zoom)visual a aquellas aplicaciones que lo tengan imple-mentado. Mediante una interfaz muy intuitiva, sepuede controlar mediante el ratón un cuadro queva ampliando las partes de la pantalla por las queéste pasa.

Este componente está especialmente indicadopara ampliar fotos de gran resolución, resaltandozonas que necesiten ser vistas con mayor preci-sión. Un claro ejemplo al que se podría aplicarPowerWEB Zoom son los mapas de GoogleMaps. Otra de sus aplicaciones potenciales es lade hacer accesible una aplicación Web a colecti-vos de personas con dificultades de visión; estecomponente les permitirá ver los contenidos másampliados.

A continuación se detallan algunas de las caracte-rísticas de PowerWEB Zoom:

• Compatibilidad con ASP.NET 1.x y 2.0.• Permite configurar el teclado con teclas rápi-

das para hacer un uso más ágil de sus funciona-lidades.

Ofrece diferentes modos de renderización deimágenes.

Ficha técnicaNombre PowerWEB ZoomVersión 1Fabricante DARTWeb www.dart.com/powerweb/zoom.aspCategoría Categoría:UtilidadesPrecio $499Valoración

Page 52: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

técnicas del nuevo VisualStudio 2005 y .NET Framework 2.0 decidimos llevara cabo una idea que ya iba calando en mi interior haciatiempo: la creación de un grupo de usuarios. Bueno,realmente la intención inicial fue la de apuntarnos algrupo de usuarios que operase en Barcelona, pero al nohaber ninguno, decidimos crearlo… Hablo en pluralporque a lo largo de todo el proceso me animó y apo-yó mi buen amigo y compañero de aventuras .NET-ianas David Zardoya, genial programador se le mirepor donde se le mire (normalmente de abajo hacia arri-ba, ya que es bastante alto).

Lo cierto es que fue una idea tremenda y, ni cortosni perezosos, abordamos a Alfonso Rodríguez deMicrosoft, quien nos animó a llevar adelante el proyec-to… A lo largo de dos meses se realizó un par de sesio-nes sobre varias de las características del nuevo .NET2.0, refactorización y plantillas de código, así como unasesión magistral sobre ASP.NET por parte de AurelioPorras, experto de Microsoft. Luego el tema quedóparado algún tiempo debido a problemas con el hostingy a temas personales/laborales que no nos permitierondedicarle mucho tiempo. Hasta hace alrededor de unmes y medio, cuando tuve la buena fortuna que me lla-mara Pep Lluis Baño de Spain.NET, podríamos decirque el pionero de los grupos de usuarios de España, yme animó a reactivar el tema.

Total, que aquí estamos de nuevo, con los proble-mas de hosting solucionados. Ahora tenemos una fla-mante y renovada página Web, http://www.bcndev.net;se han establecido colaboraciones con el centro de for-mación Soft-Obert, que nos ha cedido amablementeaulas para realizar las reuniones, con proyectores, aireacondicionado y soporte técnico para temas de redes;y se ha hecho un plan de promoción con el objetivo deincrementar el número de socios y ofrecer los serviciosque puedan ser de interés para los mismos. El grupovolvió a activarse -oficialmente- con la ayuda de Alfonso

Rodríguez el pasado 23 de noviembre, durante la pre-sentación del nuevo .NET Framework 3.0.Precisamente en la fecha en que se escribe este artícu-lo ha tenido lugar la segunda sesión del grupo de usua-rios, en la que se presentaron dos ponencias: una sobreMONO, el entorno open source para el desarrollo y laejecución multiplataforma de .NET (presentada porToni Recio), y la otra ponencia sobre WindowsWorkflow Foundation, llevada a cabo por quien escri-be estas líneas.

Cabe destacar el buen ambiente, colaboración yganas de los asistentes, así como la intensidad de lascharlas que tuvimos después de las ponencias, centra-das sobre las posibilidades de estas dos tecnologías. Porcierto, las presentaciones y código fuente de las ponen-cias están colgadas en nuestra página Web a disposiciónde quien desee conocer las principales característicasde estos productos.

Como objetivos principales, el grupo de usuarios deBarcelona, BcnDev.Net, tiene los de fomentar el apren-dizaje, fomentar el espíritu de compartición de cono-cimientos y realizar un “pique” sano para que vayamosincidiendo en diferentes temas de interés y exponién-

dotN

etM

anía

<<

52

dnm.comunidad.net<<

BcN DEV.NET developers community of Barcelona

<< En una de las presentaciones

Como decía Hadi en la presentación del Grupo de Usuarios de Málaga en la ediciónde dotNetManía de septiembre,“¿qué podíamos hacer para complicarnos aún más lavida?”. Pues algo similar pasó por nuestras cabezas a mediados de este año 2006…

Page 53: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dolos a los demás compañeros, ya que es imposible estaren todo, pero si cada uno se encarga de estudiar unaparte y la transmite a los demás, tanto nuestra necesi-dad de aprendizaje como nuestra curiosidad interiorestarán algo más satisfe-chas. Además de estefomento del intercambiode conocimientos y expe-riencias, BcnDev.Net tie-ne el objetivo de aportarvalor al colectivo de desa-rrolladores .NET de Barcelona. Este valor se pretendecanalizar vía el portal Web creado sobre dotNetNuke,un framework de aplicaciones Web muy flexible y fácil-mente extensible. Hemos abierto una bolsa de trabajogratuita y una sección de noticias en las que iremoscomentando las novedades de interés general y local.También enviamos un boletín periódico a los socios conlas noticias de interés del sector. Asimismo, pretende-mos abrir una sección de artículos y apuntarnos a la ini-ciativa de Panorama Box, de la cual estamos esperandorespuesta.

El grupo tiene en total actualmente unos 60 miem-bros, varios de ellos con muchas ganas de hacer cosas.Por lo demás, es un grupo abierto; cabe decir que comotodos los demás grupos de usuarios: aquí todos somosiguales y tenemos voz por igual. En nuestros foros o enlas ponencias cualquiera puede proponer y participar.Y hablando de ponencias, nuestra próxima sesión, pla-nificada para el 25 de enero de 2007, estará centrada

únicamente en Windows Presentation Foundation(WPF). Uno de los ponentes es Toni Recio(http://www.tonirecio.com) y el otro es José Cubero(http://jusep-net.blogspot.com); ambos llevan bastante tiem-

po trabajando con elproducto y sus betas.

Si sois desarrollado-res o aficionados a .NET,no dejéis de venir a estareunión o las siguientes.¡Realmente el poder asis-

tir a una charla de un experto como Toni Recio o DavidZardoya, o incluso de Marçal Serrate (si conseguimosanimarle a que exponga sus experiencias con la arqui-tectura CSLA de Rockford Lhotka) no tiene precio!Y puede que por febrero podamos arrancar algunas horasde David Carmona y Aurelio Porras, dos de los gurúsen .NET de Microsoft España. ¡No lo dudéis, acerca-os! Sin duda alguna, vamos a divertirnos y a aprendermucho.

Encontraréis más información sobre el grupo y deta-lles sobre los eventos planificados en nuestra páginaWeb (http://www.bcndev.net).

Desde estas líneas aprovecho para agradecer aAlfonso Rodríguez su apoyo incondicional, y a PacoMarín por ofrecernos este espacio para dar a conocera BcnDev.Net.

dotN

etM

anía

<<

53

dnm.comunidad.net

José Luis Latorrefundador del Grupo de Usuarios .NET de Barcelona

Windows Presentation Foundation

Organiza: BcN DEVFecha: 25 de enero de 2007Ubicación: Soft Obert

St. Antoni Maria Claret, 122 08025 Barcelona

Horario: 18:00 a 20:00 h

Tema: Windows Presentation Foundation, intro-ducción, ejemplos y posibilidades

Ponentes: Toni Recio, Josep CuberoMás información: http://www.bcndev.net

Prepárate para un nuevo día para eldesarrollador

Organiza: MSDN EspañaFechas y lugares:• Sevilla: 16 de enero de 2007 • Valladolid: 18 de enero de 2007 • Tenerife: 23 de enero de 2007 • Málaga: 25 de enero de 2007

En estas sesiones técnicas tendremos la oportunidad de veren detalle las nuevas funcionalidades de Microsoft .NETFramework 3.0 y más:

º Windows Presentation Foundation, el subsistema depresentación unificado para Windows, con el que cre-ar una nueva generación de interfaces de usuario sobre.NET.

º Windows Communication Foundation, desarrollode aplicaciones distribuidas en nuevos modelos decomunicación como servicios Web seguros, fiables ytransaccionales capaces de interoperar a través de dis-tintas plataformas.

º Las capacidades de definición de flujos de trabajo decla-rativos que estarán disponibles para los desarrolladores através del Windows Workflow Foundation, incluido en.NET Framework 3.0.

º Por último, veremos Sharepoint 2007, una plataforma úni-ca, integrada y ampliable que permite construir aplicacionesweb con funcionalidad avanzada de visualización, búsquedaso gestión de contenidos, entre otras.

Más información: http://www.microsoft.com/spanish/msdn/spain.even

tos.

even

tos.

even

tos

Page 54: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 65,00€ IVA incluido y recibir gratuitamente losdos próximos cuadernos técnicos que publique Netalia, y además el CD Volumen 2 con los ejemplares desde el 12 al 22 en for-mato PDF de alta calidad de forma gratuita. Si su dirección está fuera de España consulte los detalles en www.dotnetmania.com

❑ Deseo que me envíen los números atrasados marcados según el precio de portada. Otros:

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 2007

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)

Suscríbase y llévese los dos próximos libros gratis

Oferta válida hasta el 31 de enero de 2007 o hasta agotar existencias

además, el CD Vol. 3 con los números 13 al 23 en PDF

❑ Nº19 (6,50€) ❑ Nº20 (8,50€) ❑ Nº21 (6,50€) ❑ Nº22 (6,50€) ❑ Nº23 (6,50€) ❑ Nº24 (6,50€) ❑ Nº25 (6,50€)

❑ Nº26 (6,50€) ❑ Nº27 (6,50€) ❑ Nº28 (6,50€) ❑ Nº29 (6,50€) ❑ Nº30 (6,50€) ❑ Nº31 (6,50€) ❑ Nº32 (6,50€)

Page 55: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dotN

etM

anía

<<

55

<<

Microsoft SQL ServerTM 2005:Applied Techniques Step by StepSolid Quality Learning

Editorial: Microsoft PressISBN: 0735623163Páginas: 496Primera edición: Junio 2006Idioma: Ingles

Mucho hay escrito ya sobre SQL Server 2005, pero no tanto sobre la aplicación de las téc-nicas soportadas por el producto a la programación del día a día con que se topa el desarro-llador, comenzando por el propio proceso de instalación, y avanzando en dificultad, sin asu-mir conocimientos previos del producto. Ese es precisamente el objetivo de esta obra, fir-mada por varios de los componentes de Solid Quality Learning (autores de la mayoría delos cursos oficiales de Microsoft de SQL Server 2005).

El texto recoge además, todos los aspectos relacionados con la correcta configuración y pues-ta a punto del servidor, así como el uso adecuado de las numerosas utilidades adicionales queacompañan a SQL Server 2005, y un tratamiento detallado de algunas nuevas capacidades,como Notification Services. El libro se complementa con un CD que contiene todo el códi-go de ejemplo utilizado en la larga lista de prácticas que lo acompañan.

CLR via C#,Second EditionJeffrey Richter

Editorial: Microsoft PressISBN: 0735621632Páginas: 736Primera edición: 2006Idioma: Inglés

Ya hemos comentado en esta sección alguna obra de Richter con anterioridad.Considerado uno de los evangelistas tecnológicos más reputados de la actualidad, elautor, literalmente, “se mete en las profundidades del CLR”, para, usando C# como len-guaje de soporte, revisar la construcción de aplicaciones basadas en la versión 2.0 de.NET Framework, con gran profundidad y detallando especialmente aquellos aspectosmás angulosos de su arquitectura.

Si queremos saber cómo funcionan realmente cosas como el recolector de basura, lareflexión, la descripción de metadatos disponible en tiempo de ejecución, la conversióna código IL, o la escritura correcta de aplicaciones multiproceso, ésta es una magníficareferencia. Eso sí, no es un libro para principiantes, y requiere un cierto conocimientoprevio de .NET y el lenguaje C# en particular.

dnm.biblioteca.net<<

dnm.biblioteca.netPor Marino Posadas

Page 56: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>> [ ]

Page 57: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >

Page 58: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos

Explore ASP.NET 2.0 WebPart Infrastructure. Elconocido sitio DevX publi-

ca este mes este documento sobre los WebParts don-de hace un recorrido bastante completo de la infraes-tructura y mecanismos de desarrollo de estos popula-res controles de servidor de la versión 2.0 de ASP.NET:http://www.devx.com/codemag/Article/33332?trk=DXRSS_LATEST.

ImageMinimizer.Programa gratuito, pequeño y rápido que permi-te cambiar el formato, calidad y tamaño de cualquier gráfico. Inclusoadmite comandos del tipo “Enviar a” y el cambio de un conjunto degráficos simultáneamente. Accesible en el sitio web http://www.pho-enixbit.com/site/products.asp?productid=imageminimizer.

Rosario,Hawaii,Mónaco y Edimburgo.No es un viaje, sonproductos en desarrollo

Siguiendo la tradición, Microsoft continúa bautizando susproductos beta con nombres de conocidas ciudades. Losúltimos en conocerse públicamente son: Rosario (nuevaversión de Visual Studio Team System focalizada en pro-cesos de prueba, que seguirá a Orcas), Hawaii (éste, algomás conocido, referente a los productos de desarrollo pos-teriores a Orcas), Mónaco (parte de iLife, conjunto deaplicaciones para crear y gestionar contenido digital) yEdimburgo (un tipo de producto o servicio –todavía nose sabe bien– para el pequeño negocio, asociado a las comu-nicaciones). A todo esto, la Free Software Foundation,liderada por el conocido Richard Stallman, ha comenza-do su campaña particular contra Vista en un nuevo sitiollamado www.badvista.org. Quien suscribe tuvo oportuni-dad de pulsar las opiniones sobre tecnología (y sobre polí-tica) de Stallman a su paso por la Universidad de Deusto.La entrevista está disponible en mi sitio: http://www.ela-vefenix.net/Panorama/Stallman.htm.

La electrónica flexible promete una nueva era de productos

Zhenan Bao, de la Universidad de Stanford (USA) está lide-rando las investigaciones para conseguirel crecimiento de cristales semiconduc-tores orgánicos sobre una superficie, loque podría revolucionar la llamada “elec-trónica flexible”. La técnica es barata deproducción, y podría mejorar también elrendimiento de muchos de los dispositi-vos existentes hoy en día, dado que lostransistores creados mediante esta técnica pueden funcionar has-ta 3 veces más rápido que los que usamos en la actualidad, segúnsus autores. El lector interesado puede leer el artículo comple-to “Crystal printing promises flexible electronics”, enhttp://www.newscientisttech.com/article.ns?id=dn10791&feedId=online-news_rss20. La noticia puede complementarse con otraproveniente de Japón, donde el Dr. Takanori Fukushita, de laUniversidad de Tokio, afirma haber conseguido un tipo de nano-cable capaz de convertir la luz en electricidad, de modo similara como lo hacen los semiconductores de los paneles solares, loque podría ser crucial como sistema energético de los robots.

dotN

etM

anía

<<

58

dnm.desvan<<

Marino Posadas

Documentación de C# 3.0 y LINQ en castellano. Desdehace unos días están disponibles públicamente traduccio-nes al castellano de varios documentos preliminares de C#3.0 y LINQ, realizadas por nuestro editor técnico OctavioHernández. Estos documentos son:• Especificación de C# 3.0: http://www.microsoft.com/spa-

nish/msdn/articulos/archivo/041206/voices/CSharp3Specification.mspx.

• Presentación técnica de ADO.NET vNext: http://www.microsoft.com/spanish/msdn/articulos/archivo/041206/voi-ces/ADONETTechPreview.mspx.

• Próximamente aparecerán otras traducciones de docu-mentos relacionados con LINQ.

Altamente recomendado a todo el que quiera estar altanto de lo que nos deparan las próximas versión de C# yADO.NET (ambas repletas de novedades basadas en LINQ).

Documentos en la Red

no

tici

as.

no

tici

as.

no

tici

as

Utilidades del mes

Giveaway of the Day. Podemos traducirlo como “Regalo deldía”. Es un sitio donde diariamente se pone a la disposición delos usuarios software shareware, pero de forma gratuita durante24 horas. Una razón para visitar el sitio con frecuencia. Dispone,además, de una sección específica para desarrolladores. Disponibleen http://www.giveawayoftheday.com.

Coding4Fun. Interesante centro para desarrolla-dores alojado en MSDN, con secciones de desa-rrollo para Windows, Web, juegos, hardware yeventos. Un diseño muy “fashion”, a lo Vista, y referencias orga-nizadas a todas las API y SDK necesarias para el desarrolladorcurioso. Disponible en http://msdn.microsoft.com/coding4fun.

Sitio del mes

Windows Installer Team Blog.El nombre lo dice todo. El equi-po de Windows Installer y sus “cuitas” con las API y procesos deinstalación. Muy específico. Para tener en la reserva cuando algo“se resiste”… http://blogs.msdn.com/windows_installer_team.

Page 59: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos
Page 60: Visual Basic - Tecnología, Tips de Programación y … · Visual Basic • C# • ASP.NET • ADO.NET • .NET ... quinto cuaderno técnico “Optimización de ... mezclar ambos