Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework

Transcripción

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

Documentos relacionados

PON: P2P Over .NET PON: P2P Over .NET

PON: P2P Over .NET PON: P2P Over .NET Administración Pilar Pérez ([email protected]) Asesor Técnico/Coordinación Marino Posadas ([email protected]) Redactores Antonio Quirós, Dino Esposito, Guillermo 'guille' Som...

Más detalles