Вы находитесь на странице: 1из 60

dedicada a los profesionales de la plataforma .

NET
w
w
w
.
d
o
t
n
e
t
m
a
n
i
a
.
c
o
m
n 57 marzo 2009 6,50 Visual Basic C# ASP.NET ADO.NET AJAX Silverlight .NET Framework
dotNetMana
Consulta de modelos conceptuales con Entity SQL (II) Interop en C# y C++/CLI. Dos puntos de vista de un mismo concepto
La sencillez de una
interfaz compleja
SQL Server Performance Studio
Creacin de colectores de datos personalizados
entrevista
Brian Harry y
Stephanie Saad
Product Manager y General Program Manager
de Team Foundation Server
Microsoft Corp.
SQL Server
WCF y Silverlight juntos
TodotNet@QA
Las 12 preguntas de Spolsky y Team System
ALMana
Bienvenido al nmero 57, de marzo de
2009, de dotNetMana.
Brian Harry es uno de los desarro-
lladores histricos de Microsoft. Tra-
baj en el desarrollo del ncleo de
Visual SourceSafe en 1992 (cuando,
como l dice, no haba ni navegadores
Web), particip en el runtime del CLR
y las libreras de .NET Framework, y
desde 2002 trabaja con el equipo de
Team System como Product Manager
de Team Foundation Server. Es adems
el jefe de Stephanie Saad, nuestra
segunda entrevistada de este mes, que
es General Program Manager para
Team Foundation Server y que ha esta-
do trabajando los ltimos 5 aos en el
ncleo de Visual Studio Team System.
Ambos son entrevistados por Magda
Teruel y Luis Fraile, en su ltima
entrega de tres entrevistas de dos a
dos que venimos publicando desde el
mes de enero.
En la segunda entrega de su serie
sobre Entity SQL, Unai Zorrilla y
Octavio Hernndez presentan las
principales caractersticas del lenguaje
y cmo probar las consultas mediante
la herramienta eSqlBlast.
Con las tecnologas actuales, como
WPF, somos capaces de crear interfa-
ces cada vez ms complejas tcnicamen-
te, pero que adems han de ser senci-
llas tanto de usar como de mantener.
Pero de qu herramientas disponemos
para realizar estas interfaces comple-
jas? En La sencillez de una interfaz
compleja, Eduard Toms hace una
introduccin a PRISM, el marco de tra-
bajo para el desarrollo de aplicaciones
WPF propuesto por Microsoft Patterns
& Practices para hacer posible la crea-
cin de aplicaciones ms mantenibles
y extensibles.
Quin no ha tenido que usar desde
su lenguaje .NET preferido una DLL
externa programada en C o C++? Rafa-
el Ontivero nos explica en Interop en
C# y C++/CLI. Dos puntos de vista de
un mismo concepto cmo interoperar
entre cdigo manejado y cdigo no
manejado tanto desde C# como desde
C++/CLI.
Despus de la introduccin a las nue-
vas posibilidades de monitorizacin de
instancias de SQL Server 2008 que Ela-
dio Rincn hizo el mes pasado, en la
columna de este mes mostramos cmo
crear y capturar informacin de moni-
torizacin mediante colectores de datos
personalizados en SQL Server Perfor-
mance Studio. Creacin de colectores
de datos personalizados.
Por ltimo, en ALMana, con Las
12 preguntas de Spolsky y Team Sys-
tem damos una idea sobre cul es el
mejor punto de partida de un desplie-
gue de Team System, valindonos de
algunos de los puntos propuestos por
Joel Spolsky.
Pero esto no es todo, dentro hay
ms. Espero que sea de su agrado.
Editorial
editorial
Dedicada a los profesionales de la plataforma .NET
Vol. III Nmero 57 Marzo 2009
Precio: 6,50
Editor
Paco Marn
(paco.marin@netalia.es)
Redactor jefe
Marino Posadas
(marino.posadas@dotnetmania.com)
Redaccin
Dino Esposito, Guillermo 'Guille' Som, Luis
Fraile, Luis Miguel Blanco y Miguel Katrib
(Grupo Weboo)
Empresas colaboradoras
Alhambra-Eidos
Krasis
Plain Concepts
Raona
Solid Quality Mentors
Adems colaboran en este nmero
Eduard Toms, Eladio Rincn, Magda Teruel,
Octavio Hernndez, Rafael Ontivero y Unai
Zorrilla.
Diseo y maquetacin
Silvia Gil (Letra Norte)
Atencin al suscriptor
Pilar Prez
(pilar.perez@netalia.es)
Edicin, suscripciones y publicidad
.netalia
c/ Robledal, 135
28522 - Rivas Vaciamadrid (Madrid)
www.dotnetmania.com
Tf. (34) 91 666 74 77
Fax (34) 91 499 13 64
Imprime
Grficas MARTE
ISSN
1698-5451
Depsito Legal
M-3.075-2004
dotNetMana dotNetMana
Paco Marn
sumario
57
Entrevista a Brian Harry y Stephanie Saad 10-13
Durante el Tech-Ed 2008, celebrado en Barcelona el pasado noviembre, dotNetMana tuvo la
oportunidad de conversar con Brian Harry y Stephanie Saad, destacados miembros del equipo que
desarrolla Team Foundation Server en Microsoft.
Consulta de modelos conceptuales con Entity SQL (II) 14-18
En nuestra entrega anterior, presentamos los conceptos fundamentales relacionados con Entity SQL,
el lenguaje de consulta de modelos conceptuales incorporado al Marco de entidades de ADO.NET
(ADO.NET Entity Framework), y mostramos el papel que este lenguaje juega dentro de ese
novedoso marco de trabajo y las posibilidades que ofrece. A partir de este mes, nos centraremos en
describir su sintaxis y semntica, y en mostrar cmo hacer uso de stas para resolver situaciones
similares a las que encontraremos frecuentemente al consultar nuestros modelos.
La sencillez de una interfaz compleja 20-30
En este artculo se hace una introduccin a PRISM, el marco de trabajo para el desarrollo de
aplicaciones visuales WPF propuesto por Microsoft Patterns & Practices para hacer posible la
creacin de aplicaciones ms mantenibles y extensibles. Tambin se presentan diversos patrones
relacionados con PRISM, como Presentacin separada e Inversin de control.
Interop en C# y C++/CLI. Dos puntos de vista de un mismo concepto 33-42
La interoperacin entre cdigo manejado y no manejado es una de las tareas que se presentan
frecuentemente a cualquier programador .NET. Aqu se describen detalladamente dos enfoques
diferentes: el primero, haciendo uso de los recursos que ofrecen para ello C# y .NET; el segundo,
utilizando C++/CLI, una extensin de C++ diseada con la interoperabilidad como uno de sus
objetivos centrales.
SQL Server Performance Studio.
Creacin de colectores de datos personalizados 44-47
En nuestra entrega anterior[1], hicimos una introduccin a las nuevas capacidades de SQL Server
2008 para monitorizar instancias de SQL Server; en el artculo de este mes, vamos a salirnos un
peln del "estndar" que ofrece la interfaz grfica para adaptar el producto a nuestras necesidades
concretas. Antes de seguir adelante, recomendara familiarizarse con los conceptos tratados en el
artculo del mes pasado.
Las 12 preguntas de Spolsky y Team System 48-52
Una de las primeras preguntas que se hacen al empezar a implantar Team System es y por dnde
empiezo? qu hago? Son tantas las prcticas, herramientas, decisiones, que se hace difcil arrancar.
Sin embargo, Joel Spolsky propuso hace tiempo 12 sencillas preguntas para evaluar nuestra
situacin. Pues bien, vamos a darle una vuelta a esas preguntas, para usarlas como punto de
comienzo.
dnm.todotnet.qa
WCF y Silverlight juntos 54-56
Este mes exploramos aspectos internos de los enlaces (bindings) de WCF y cmo se relacionan con
Silverlight. En particular, veremos las razones por las que en Silverlight no hay wsHttpBinding y
solo se soporta el esquema ms simple de basicHttpBinding. Tambin hablaremos sobre el modo de
compatibilidad WCF/ASP.NET y la instalacin de Silverlight en empresas de gran tamao.
dnm.desvan 58
d
o
t
N
e
t
M
a
n

a
<
<
6
noticias
Lanzamiento de Office Communications Server 2007 Release 2
A principios de febrero, Mike Nash,
vicepresidente de Windows Product
Management en Microsoft, present
Windows 7 and Windows Server
2008 R2 Ecosystem Readiness Pro-
gram, un programa diseado espe-
cialmente para ayudar a los fabri-
cantes y vendedores de hardware y
software, as como a ISV y desarro-
lladores en general, a alcanzar la
compatibilidad e innovacin con
Windows 7. Todos esos partners son
elementos claves para el xito en la
labor de llevar nuevas posibilidades
al escritorio de los clientes. El pro-
grama Readiness ofrece a los partners
acceso a las versiones beta de Win-
dows 7 y Windows Server 2008 R2,
kits de desarrollo y pruebas, docu-
mentos tcnicos y laboratorios para
pruebas de aplicaciones a travs de
Microsoft Connect. Los partners de
software pueden unirse al programa
visitando http://www.msdn.com/windows.
Segn Nash, "Estamos centrados
en la tarea de asegurar que los part-
ners tengan una grata experiencia con
Windows 7 y puedan transformar en
oportunidades de negocio las nuevas
caractersticas que hemos creado para
el producto. Por ejemplo, en la medi-
da en que las cmaras digitales, tel-
fonos inteligentes y otros dispositi-
vos electrnicos se hacen ms y ms
comunes, se abre ante nosotros la
posibilidad de ayudar a los clientes a
obtener ms de esos dispositivos.
Device Stage es una caracterstica
de Windows 7 que permitir a los
partners crear nuevas experiencias
para los clientes, a la vez que satisfa-
cer mejor sus necesidades y encon-
trar aplicaciones y servicios a travs
de una interfaz visual. La caracters-
tica multi-touch incorporada a Win-
dows 7, por otra parte, ofrece tam-
bin excelentes oportunidades para
los desarrolladores de software. La
plataforma habilitar el acceso a la
informacin de multi-touch, y ofre-
cer diversas API para la rotacin,
movimiento y zoom de objetos. Los
desarrolladores podrn apoyarse en
estas API para hacer posible una inte-
raccin ms natural e intuitiva con el
PC".
Por otra parte, Windows Server
2008 R2 habilita nuevos escenarios
y posibilidades, a la vez que ofrece
una excelente plataforma para las
aplicaciones directamente sobre el
sistema operativo, gracias a .NET
Framework y a las aplicaciones y ser-
vicios Web que se ejecutan sobre
Internet Information Services (IIS).
Windows Server 2008 R2 ofrece
mejoras significativas sobre Windows
Server 2008 en reas claves para el
incremento en las prestaciones de las
aplicaciones, tanto nuevas como ya
existentes, tales como LiveMigration
con Hyper-V, Windows PowerShell
2.0, el soporte para mltiples ncle-
os y arquitecturas NUMA, y .NET
y ASP.NET en Server Core.
Microsoft lanza Readiness Program para
Windows 7 y Windows Server 2008 R2
Mike Nash, vicepresidente de Windows
Product Management
A principios de febrero, Microsoft
anunci la disponibilidad de Offi-
ce Communications Server 2007
Release 2 (R2), que ofrece audio y
videoconferencia enriquecidos,
nuevas herramientas para desarro-
lladores, as como capacidades de
voz mejoradas. La salida de esta
nueva versin sienta una nueva base
para potenciar el actual momento
de crecimiento de Office Commu-
nications Server, que durante el
ltimo ao ha contribuido a cam-
biar la faz de las comunicaciones
empresariales integrando audio y
videoconferencia, la Web, la men-
sajera instantnea y el correo
electrnico en una plataforma inte-
grada de colaboracin configurada
alrededor de la forma en que la
gente trabaja. En la economa
actual, empresas de todo el mundo
eligen Office Communications Ser-
ver para mejorar su productividad,
reducir costes y ofrecer a sus
empleados las ventajas de las comu-
nicaciones unificadas.
Para conocer todas las noveda-
des que incorpora Office Commu-
nications Server 2007 R2, consulte
el documento http://www.micro-
soft.com/presspass/presskits/uc/docs
/OCS2007R2FS.doc.
d
o
t
N
e
t
M
a
n

a
<
<
7
dnm.directo.noticias
<<
El pasado da 3, Microsoft anunci sus
planes en relacin con las futuras edi-
ciones de Windows 7, expresando que
las necesidades de mayor parte de los
clientes estarn bien cubiertas a travs
de las dos ediciones principales:
Windows 7 Home Premium, la
opcin recomendada para los consu-
midores finales, que obtendrn una
experiencia de utilizacin total del PC
y un entorno visual muy rico, que
englobar desde el entretenimiento
hasta la manera de conectarse a los dis-
positivos.
Windows 7 Professional, la opcin
recomendada para los pequeos nego-
cios y para quienes trabajan desde casa
pero operan bajo entornos de empre-
sa en los que la seguridad y la pro-
ductividad son claves. Para quienes uti-
lizan hoy en da Windows Vista Busi-
ness, el cambio natural sera a Win-
dows 7 Professional.
El primer cambio en la composicin
de las diferentes ediciones ha estado orien-
tado a garantizar que todas las ediciones
de Windows 7 sern subconjuntos unas
de las otras. O sea, que al pasar de una edi-
cin a la superior, los usuarios seguirn
disponiendo de todas las caractersticas de
la anterior. Esto no ocurri con Windows
Vista, donde por ejemplo al pasar de la
edicin Home Premium a la Business se
pierde la funcionalidad relacionada con
Media Center.
El segundo cambio consiste en que
Windows 7 ha sido diseado de modo que
las diferentes ediciones del sistema pue-
dan ejecutarse sobre una gama muy amplia
de hardware, que va desde los pequeos
netbooks hasta los escritorios ms poten-
tes. De esta manera, los clientes podrn
habilitar los escenarios deseados a lo lar-
go de todas las posibilidades de hardware
a su alcance.
Por ltimo, el tercer cambio radica en
la manera de comunicar estas ediciones al
mercado, de manera que las diferentes
opciones queden lo ms claro y simple
posible a clientes y partners.
No obstante a creer que las dos edi-
ciones antes mencionadas satisfarn las
necesidades de la mayora de los clien-
tes, Microsoft comprende que numero-
sos usuarios (de entre los ms de 1.000
millones actualmente estimados) pue-
den tener necesidades especiales, por lo
cual ha concebido otras cuatro edicio-
nes de Windows 7 situadas en los
polos del espectro:
Solo para los mercados emergentes,
seguir existiendo una edicin Home
Basic, que permitir disfrutar de una
experiencia bsica de uso de Windows
incluso en sistemas muy modestos.
Tambin continuar existiendo, aho-
ra a nivel mundial, la edicin Win-
dows Starter, que solo se ofrecer pre
instalada por los OEM y limitada a
tipos especficos de hardware.
En la parte superior del espectro, para
los clientes corporativos ms grandes
se continuar ofreciendo la edicin
Enterprise, que ofrecer proteccin
de datos avanzada y herramientas para
facilitar la gestin del PC y ayudar a
ahorrar costes, permitiendo al mismo
tiempo el acceso universal a la infor-
macin a los usuarios de negocio.
Por ltimo, para quienes quieren dis-
poner de todo lo que Windows 7
tendr para ofrecer, seguir existien-
do la edicin Ultimate.
Los precios de venta de cada una de
estas ediciones no han sido anunciados
hasta el momento.
Anunciadas futuras ediciones de Windows 7
A principios de febrero, el equipo de
Evangelismo de Azure Services puso a
disposicin del pblico una actualiza-
cin de Azure Services Training Kit.
Este kit de entrenamiento se prepar
originalmente para los hands-on labs de
la PDC'08, y es una herramienta de gran
utilidad para familiarizarse con la pla-
taforma de servicios de Azure.
La nueva actualizacin agrega a los
ya disponibles anteriormente los
siguientes contenidos sobre Windows
Azure, .NET Services, SQL Services y
Live Services:
13 hands-on labs, incluyendo 3 sobre
Live Framework & Services.
19 scripts de demostracin,
diseados para presentar deta-
lladamente diversas caracters-
ticas.
10 presentaciones utilizadas por
los miembros del equipo en diver-
sos workshops, y que incluyen notas
detalladas de los ponentes.
Ms informacin en: http://go.micro-
soft.com/fwlink/?LinkID=130354.
Actualizacin de febrero de Azure Services
Training Kit
d
o
t
N
e
t
M
a
n

a
<
<
8
dnm.directo.noticias
<<
Hace solo unos das, se ha puesto a dis-
posicin de los desarrolladores el SDK
de Microsoft Semblio, una herramien-
ta orientada al mercado educativo y que
permitir crear experiencias de apren-
dizaje ricas, con un alto nivel de inte-
ractividad y que promuevan la explora-
cin y la colaboracin. Semblio ofrece
un enfoque de nivel de plataforma a la
creacin de contenidos, y se apoya en
las facilidades de .NET Framework y
en concreto de WPF para satisfacer la
creciente demanda de soluciones apren-
dizaje ms personalizables, permitien-
do a la vez un alto nivel de control sobre
la adaptacin de los materiales.
Semblio no es solamente una
herramienta para desarrolladores;
Microsoft ha confirmado que la pr-
xima edicin de Office incluir una
herramienta de composicin (con la
interfaz de usuario familiar de las apli-
caciones de Office) que permitir
combinar mltiples tipos de conteni-
dos en una nica presentacin multi-
media, as como un reproductor que
los educadores y estudiantes podrn
utilizar para ver e interactuar con las
presentaciones.
Para ms informacin y descar-
gas, visite http://www.microsoft.com/
learningspace/semblio.
Microsoft Semblio SDK
El prximo 3 de marzo se celebrar el
evento online de actualizacin tecnol-
gica Windows Day. Tecnologa para
derribar paredes, organizado por
Microsoft Ibrica y Microsoft Latino-
amrica, y dirigido a desarrolladores y
profesionales de TI.
Durante este evento se podr asis-
tir a charlas con demostraciones tcni-
cas que abordarn temas como la imple-
mentacin de Windows Vista, la vir-
tualizacin del desktop, las novedades en
Windows 7, nuevas caractersticas de
seguridad o las interfaces de usuario uti-
lizando tecnologas como Silverlight y
.NET. Adems, se compartir un an-
lisis de los desafos que surgen de la
visin Software + Servicios propuesta
por la compaa, entre muchos otros.
Los asistentes tendrn la ocasin de
participar en encuentros va chat con los
oradores y otros especialistas, e incluso
adelantar sus consultas a travs del blog
del evento en: WindowsDayBlog.net.
Las conferencias para desarrollado-
res sern:
Dando el salto hacia el presente con
Windows Presentation Foundation.
El futuro de la plataforma de desa-
rrollo Web hoy.
Programando para videoclubs con
Silverlight 2.
Con .NET es ms fcil: aplicaciones
efectivas con Windows Forms.
Mapa de ruta en el acceso a datos con
el .NET Framework 3.5.
S, se puede trabajar con diseadores!
Ms informacin e inscripciones en:
http://www.microsoft.com/latam/windowsday.
Tecnologa sin barreras
Windows Day
El pasado 11 de febrero, Miguel de
Icaza, vicepresidente de Novell
para la plataforma de desarrollo y
fundador de Mono, anunci la dis-
ponibilidad de Moonlight 1.0, una
implementacin open source de Sil-
verlight 1.0 para Linux y otros sis-
temas operativos de la familia
Unix/X11, que hace posible la eje-
cucin de aplicaciones Silverlight
en esos sistemas, adems de ofrecer
un SDK para el desarrollo de apli-
caciones Silverlight.
Moonlight 1.0 se ofrece en forma
de plugin para FireFox 2.0 3.0, y ha
sido probado en diferentes distribucio-
nes de Linux (incluyendo SUSE Enter-
prise Desktop y openSUSE) corriendo
sobre procesadores tanto x86 como x64.
Para obtener ms informacin o
descargar Moonlight, visite http://go-
mono.com/moonlight.
Moonlight 1.0
A finales de enero, das despus de la
salida a imprenta de nuestro ejem-
plar anterior, Microsoft puso a dis-
posicin del pblico la CTP de ene-
ro de 2009 del SDK de Oslo. Oslo es
el nombre en clave de la plataforma
de desarrollo de prxima generacin
de Microsoft, cuyo objetivo es garan-
tizar la multiplicacin por 10 de la
productividad a lo largo del ciclo de
vida de las aplicaciones (diseo, desa-
rrollo y gestin). Para cumplir este
objetivo, Oslo se apoya en modelos,
lenguajes y herramientas para domi-
nios especficos. Esta nueva CTP del
SDK contiene documentacin,
ejemplos, copias de modelos de Oslo
escritos en el nuevo lenguaje M y
herramientas que ayudan a la crea-
cin de modelos por parte del desa-
rrollador, incluyendo la que actual-
mente se conoce como Intellipad.
La CTP puede descargarse desde
http://www.microsoft.com/downloads/de
tails.aspx?FamilyID=f2f4544c-626c-
44a3-8866-b2a9fe078956.
CTP de enero de 2009 de SDK de Oslo
Disponibles
entrevista
y
entrevista a
Brian Harry
Stephanie Saad
Durante el Tech-Ed 2008, celebrado en Barcelona el pasado noviembre, dotNetMana
tuvo la oportunidad de conversar con Brian Harry y Stephanie Saad, destacados miem-
bros del equipo que desarrolla Team Foundation Server en Microsoft.
Antes que nada, habladnos un poco de sobre
vosotros, vuestro trabajo en Microsoft y a qu
dedicis vuestro da a da.
Brian Harry: Mi nombre es Brian Harry y
soy Product Manager de Team Foundation Ser-
ver (TFS). He trabajado en Microsoft como desa-
rrollador desde 1992, ao en el que comenc a
trabajar en el ncleo de Visual SourceSafe. Lo
ms importante en lo que he trabajado, sin dudas,
han sido el runtime del CLR y las libreras de
.NET Framework, pero en 2002 me cambi al
equipo de Team System y al proyecto de TFS.
Stephanie Saad: Yo soy Stephanie Saad, y l
es mi jefe (se re, sealando a Brian). Soy General
Program Manager para TFS, y trabajo en Micro-
soft desde hace 7 aos. Antes de eso, estuve en
una Internet startup, de la que vine a Microsoft
porque nuestro equipo de desarrollo estaba muy
Magda Teruel
es Team Leader de
Raona. Magda es
MCPD Windows
Developer.
http://www.magda.es.
Luis Fraile es MVP de
Team System y cola-
bora activamente en
MAD.NUG (Grupo
de usuarios de .NET
de Madrid). Actual-
mente es director
tcnico en Multido-
mo Networks. Pue-
de con sul tar su
blog en
www.lfraile.net.
Magda Teruel y
Luis Fraile
entrevista
desorganizado, y pens Debe haber
una forma mejor que la nuestra de
hacer todo esto.
Y la haba?
Stephanie: S, la haba, pero no tan
organizada como yo pensaba. Ha sido
muy divertido, s. He trabajado con
Visual Studio y sus herramientas casi
todo el tiempo, empezando como
Operations Manager, y en los ltimos
5 aos trabajando en el ncleo de
Visual Studio Team System. Ahora tra-
bajo en el proyecto de TFS.
Vosotros empezasteis con Source-
Safe, y habis trabajado con las ver-
siones anteriores de Visual Studio.
Cmo veis la evolucin de estas
herramientas hasta lo que tenemos
hoy en da?
Stephanie: Pienso que esas prime-
ras versiones eran buenas herramien-
tas para los desarrolladores, realmen-
te. Pero lo que tenemos hoy en da,
con la repercusin de Team System y
el enfoque hacia la gestin del ciclo de
vida de aplicaciones (Application
Lifecycle Management, ALM) es espe-
cial, porque se trata de un conjunto de
herramientas para equipos enteros de
desarrolladores.
Y son las mejores herramientas?
Stephanie: Probablemente podras
encontrar mejores herramientas indi-
viduales para cada una de las funcio-
nalidades; pero lo que es realmente
muy costoso es conectar todas esas
herramientas.
Incluso en el caso de herramientas
Open Source?
Stephanie: Es muy costoso, en dine-
ro y tiempo. Lo que se ve de la evolu-
cin de nuestra suite es que hemos ido
construyendo buenas herramientas para
directores de proyectos. Y ahora con las
nuevas versiones incorporamos herra-
mientas para testers y grandes mejoras
en las herramientas para arquitectos.
Vais a ver que continuamos extendien-
do esa lnea a lo largo del tiempo: empe-
zamos con la primera versin, luego
progresamos con la 2008 y de pleno con
la versin 2010, y continuaremos
ampliando en futuras versiones.
Ha habido bastantes cambios desde
SourceSafe.
Brian: S, es que la gente se dio
cuenta de las cosas que le faltaban a
SourceSafe tan pronto empez a cam-
biar el contexto. SourceSafe se dise
en 1992, y si miras a esa poca, no
exista Internet como lo conocemos hoy
en da: no haba navegadores Web!
Parece imposible de creer!
Brian: S, pero es cierto. Las redes
locales eran algo relativamente difcil
de encontrar. La pregunta Tienes una
red? era muy significativa. SourceSa-
fe se cre en esa poca, y el desarrollo
de software en ese periodo no era ni
mucho menos tan sofisticado como lo
conocemos ahora. Casi siempre eran
grupos pequeos, compuestos prcti-
camente solo por desarrolladores, el tes-
teo era muy informal, no exista el con-
cepto de prueba unitaria, y los reque-
rimientos eran documentos muy arcai-
cos y estticos. Era un mundo comple-
tamente diferente, y por ello se hizo
necesario desarrollar TFS, cuando nos
dimos cuenta de que el proceso de cre-
acin de software se haba convertido
en algo mucho ms sofisticado.
Y haca falta algo para cubrir ese
cambio.
Brian: Exactamente, necesitbamos
un conjunto de herramientas que
cubriesen el amplio abanico de activi-
dades del proceso de desarrollo de soft-
ware. Mientras que SourceSafe y los
repositorios de cdigo son una buena
e importante herramienta para equi-
pos pequeos, no son suficientes para
cubrir todas las necesidades de los
complejos procesos de desarrollo de
software de hoy en da.
Contadnos algo de la recin publi-
cada versin de las Power Tools. Es
fantstica!
Brian: Personalmente, estoy muy
contento con las Power Tools, porque
nos dan la oportunidad de entregar
valor a los clientes con relativa fre-
cuencia. Microsoft es una gran empre-
sa, y hacemos grandes entregas, pero
puede pasar mucho tiempo entre ellas.
Eso hacen dos o tres aos en los que
entre medio no ofreces nada nuevo.
Las Power Tools nos permiten entre-
gar a los usuarios algo que les hace la
vida ms fcil cada tres meses. Con
estas entregas no pretendemos cam-
biar el modo de desarrollar, solo dina-
mizarlo aadiendo pequeas cosas que
nos hacen ser ms eficientes. La lti-
ma versin publicada, en octubre, es
probablemente la mayor entrega que
hemos hecho, hay cosas muy buenas
incorporadas.
Algo que destacaras en ellas?
Brian: Por ejemplo, las extensio-
nes para Windows Explorer. Ahora
puedes controlar versiones desde el
Explorador de Windows. Puedes pro-
teger cdigo, desproteger, obtener la
ltima versin, comparar los fiche-
ros locales con lo que hay en el ser-
vidor. Se puede hacer todo lo bsico,
y era una de las peticiones ms popu-
lares que hemos tenido en mucho
tiempo. Otra cosa que me gusta es la
funcionalidad de Team Members,
ya que es dar un paso ms para incor-
porar a la gente a la experiencia del
equipo.
Conectando a la gente?
Brian: Siempre hemos intentado
conectar, pero ahora estamos real-
mente conectndolos en cuanto a las
tareas, los ficheros, los elementos de
trabajo, los informes, los datos que hay
por detrs, llevando toda esa informa-
cin a todo el mundo. Dando visibili-
dad, en definitiva. Hemos incorpora-
do muchas funcionalidades, como las
consultas sobre work items, y poder
hacer preguntas como Ensame qu
cambios ha realizado esta persona en
la ltima semana y obtener una res-
puesta rpidamente.
d
o
t
N
e
t
M
a
n

a
<
<
11
dnm.directo.entrevista
<<
d
o
t
N
e
t
M
a
n

a
<
<
12
dnm.directo.entrevista
<<
Habis dicho que solo hay versiones cada dos
aos, pero una de las cosas que ms protestan
los usuarios es que continuamente salen nuevas
versiones de VSTS, de .NET Framework, etc. y
hay que adaptarse a los cambios. Para la versin
2010 hay un montn de cosas nuevas, lo tenis
en cuenta?
Stephanie: Eso es interesante, ya que recibimos
feedback en los dos sentidos. Algunos usuarios se que-
jan, pero otros ven que aportamos valor en cada ver-
sin y lo agradecen. Es importante focalizarse en
actualizaciones. La pregunta no es tanto si tenemos
que aportar valor regularmente, como si podemos
ayudar a los usuarios a incorporar ese valor a su da
a da, a entenderlo y utilizarlo.
Brian: Es cierto, coexisten las dos versiones, tan-
to la de que en Microsoft se hacen las cosas lentas,
como la de que publicamos versiones demasiado a
menudo.
Cmo interpretas eso?
Brian: Hay dos tipos de cambios. Por ejemplo,
la evolucin de Windows Forms a Windows Pre-
sentation Foundation es un gran cambio, y si hici-
ramos cambios como se cada 6 meses o cada ao la
gente nos ajusticiara. Los grandes cambios, esos que
cambian la forma en que haces las cosas y cmo cons-
truyes las aplicaciones, tienen que suceder no tan
frecuentemente, ya que son costosos de adoptar. Por
otra parte, recibimos muchas peticiones de usuarios
solicitando pequeas adiciones o cambios de fun-
cionalidad. Son cosas que realmente no cambian la
forma en que desarrollamos, pero que hacen nues-
tra vida mejor y son fciles de adoptar. Hacer regu-
larmente entregas de este tipo es indudablemente
positivo.
La nueva versin de VS2010 ya est aqu, qu es
lo que os parece mejor? No vale decir Todo el
producto
Stephanie: Me resultara difcil escoger una o dos
caractersticas (risas). Tenis que entender que Brian
y yo estamos realmente entusiasmados, porque nues-
tra implicacin es desde el principio. El primer mee-
ting sobre la versin 2010 fue hace ya dos aos y
medio; esta entrega es realmente buena.
Qu hay de las mejoras en Project Management?
Stephanie: Lo principal ha sido para ayudar al
equipo de negocio a construir lo que necesitan. Aho-
ra pueden trazar absolutamente todo, crear infor-
mes, integrarse con Excel, hacer seguimiento con
Project. Por fin las empresas pueden planificar de
una forma efectiva sus soluciones, se les da todo lo
que necesitan en forma de drag & drop entre herra-
mientas.
Y en cuanto al testing?
Stephanie: Es otro de nuestros grandes pilares.
Tenemos un fantstico entorno para desarrollado-
res, y ahora una variante especialmente pensada para
testers. Por destacar algo, la ejecucin de tests inte-
grada en el entorno de desarrollo es genial. Puedes
ejecutar, capturar informacin y enviarla: encuen-
tras un bug e inmediatamente lo reportas. Est bien
diseado, pensado para ser simple y atractivo, y ha
supuesto una innovacin desde el ncleo. Tenamos
el compromiso de hacer la herramienta mejor, y en
esta versin estn las cosas que los usuarios real-
mente necesitan.
Brian: S, a m tambin me gustan mucho las
mejoras en testing. A los desarrolladores les va a
encantar todo lo relacionado con la depuracin de
pruebas. Van a ser mucho ms productivos, hasta el
punto de que no van a saber cmo han podido vivir
sin ello.
Y otros perfiles en los que hayis pensado?
Stephanie: Tambin hemos pensado en los equi-
pos de TI, y en los arquitectos. Ahora podemos
mover proyectos fcilmente, y esa es una cosa que
los usuarios llevan pidiendo mucho tiempo. Hemos
A los desarrolladores les va a
encantar todo lo relacionado con la
depuracin de pruebas, que les har
mucho ms productivos
d
o
t
N
e
t
M
a
n

a
<
<
13
dnm.directo.entrevista
<<
hecho una gran inversin en esto, y me gusta mucho
cmo ha quedado.
Brian: Estoy de acuerdo con todo lo que ha dicho
Stephanie. Respecto a las mejoras en relacin con la
arquitectura, hay cosas magnficas: la capa de dia-
gramas, la gestin de constraints o de las polticas de
check-in. Por ltimo, mencionara branch visualiza-
tion, una novedad que permitir a los equipos enten-
der cmo progresa el desarrollo, cmo y cundo cam-
bian las cosas, ese tipo de cosas.
Cmo est adoptando Microsoft internamente
VSTS? Es difcil para vosotros poner todos los
grupos de trabajo dentro de TFS?
Stephanie: Es un proceso lento para noso-
tros. Lo estamos adoptando incrementalmente;
empezamos con nuestro equipo, y luego el equi-
po de Visual Studio. Despus lo ha adoptado el
grupo de TI, y en otros grupos pequeos alre-
dedor de la compaa la adopcin est empe-
zando a crecer lentamente.
Qu reaccin habis visto en los usuarios?
Stephanie: A la gente le gusta! Tenemos casi la
mitad de la compaa usndolo. Algo que hemos
aprendido es que hay que empezar identificando el
problema que tiene el equipo, porque si el equipo est
contento con el control de cdigo, o con el sistema
de seguimiento de bugs, no tendrs mucho xito
hacindoles adoptar una nueva herramienta; tienes
que averiguar cules son sus problemas. Para algunos
es el servidor de control de cdigo, para otros la ges-
tin de proyectos, para otros la visibilidad sobre lo
que est pasando.
Se hace una implantacin total?
Stephanie: No, no! Una vez identificado el pro-
blema, ah empieza la historia. Tenemos un montn
de grupos que solo usan una parte de TFS. Por
ejemplo, el grupo de Office solo usa la parte de ges-
tin de proyectos; el de SQL solo usa la parte de
work items; el de desarrollo lo utiliza todo excepto
el sistema de builds automticos (lo migraremos ms
adelante).
Entonces cul es el truco?
Stephanie: Si identificas lo que preocupa tendrs
ms oportunidades de mejorar el proceso. Para adop-
tar TFS, tienes que empezar pensando en cul es tu
propio proceso de desarrollo y qu problemas te pue-
de ayudar a resolver esa herramienta. Solo partiendo
de esa base te puede ayudar a ser ms eficiente.
Y habis publicado vuestra experiencia?
Stephanie: S, Microsoft ha dado un gran paso al
publicar la plantilla de la gua de proceso de Micro-
soft, basada en nuestra experiencia propia, nuestras
best practices y en cmo hacemos las cosas. Estar dis-
ponible prximamente.
Tal y como os ha pasado a vosotros, en las empre-
sas no se est adoptando todo Team System.
Qu opinis de ALM, estamos avanzando rpi-
damente? Se integra realmente con VSTS, o
estamos solo usando el servidor de control de
cdigo fuente?
Stephanie: Lo que yo estoy viendo en nuestros
clientes es una adopcin incremental, pieza a pie-
za. Por ejemplo, en el Banco de Montreal han
empezado adoptndolo en un equipo pequeo, uti-
lizando TFS como servidor de control de cdigo,
algo que era algo muy localizado dentro de la com-
paa. Pero el cliente se da cuenta rpidamente de
otros beneficios que obtendr al extenderlo a otras
reas de la compaa. En equipos grandes, lleva
tiempo darse cuenta de toda la potencia que TFS
puede ofrecer. La forma inteligente es hacerlo paso
a paso, como hemos comprobado interna y exter-
namente.
Brian: Cada tres meses tenemos una reunin de
todo el equipo, y llevamos a un cliente cada vez, para
hablar de su adopcin del producto y qu significa
esa adopcin para l. Es muy interesante or la his-
toria especfica de cada cliente, cmo TFS ha cam-
biado su empresa y de qu manera concreta. Y son
empresas que decidieron usar no solo el servidor de
control de cdigo, si no que se han parado a pensar
en cmo es su proceso, cmo coordinarse, manejar
los proyectos, las entregas, etc. Es una tecnologa de
transformacin. He visto a mucha gente empezar
dando pasos pequeitos, y luego convencerse de la
utilidad de adoptar otras partes del producto.
Algn adelanto para las prximas versiones?
Brian: Con miras a las prximas versiones, esta-
mos haciendo encuestas a los usuarios para saber qu
es lo que quieren. La idea general es focalizarse en
la parte de trabajo en equipo, con un poco para cada
rol involucrado en el proyecto. Pero hay mucha gen-
te nueva involucrada en ALM, como los analistas de
negocio, los gestores de TI, los controladores de
calidad, etc. Ms gente, ms procesos, en continua
expansin, y nosotros por nuestra parte tambin
vamos a continuar expandiendo el alcance de nues-
tras releases a nuevas reas.
Describiremos las posibilidades que ofrece Entity
SQL utilizando un enfoque prctico y basado en
ejemplos. Una referencia completa del lenguaje se
ofrece en el Apndice B de nuestro libro [2], as
como en MSDN [5]. Como ya es habitual, utiliza-
remos para los ejemplos un modelo conceptual cre-
ado a partir de la base de datos FUTBOL2006, apare-
cida inicialmente en [3] y que luego hemos venido
utilizando en nuestra anterior serie sobre los fun-
damentos del Marco de entidades [4] y en el art-
culo anterior de sta [1]. Como "cajn de arena"
para la realizacin de pruebas, le recomendamos
que utilice la herramienta eSqlBlast, cuyos princi-
pios bsicos de funcionamiento se describen en el
recuadro que aparece en la pgina 16. Un buen ejer-
cicio para familiarizarse con Entity SQL consiste
en intentar "adivinar" de antemano qu hace una
consulta dada y qu estructura tendr su conjunto
de resultados. Para ayudarlo en ese objetivo, a lo
largo de esta serie no describiremos verbalmente
qu resultados producen las consultas. Otro buen
ejercicio, ya algo ms avanzado, puede ser el anli-
sis de las consultas nativas (de T-SQL, siempre que
utilicemos un modelo basado en SQL Server) en
las que el Marco de entidades transforma las con-
sultas Entity SQL, para intentar comprender los
principios generales que guan ese proceso. En cual-
quier caso, puede jugar con la herramienta con la
total seguridad de que no estropear nada, dado que
el lenguaje (al menos en su versin actual) sola-
mente ofrece posibilidades para la consulta de
modelos.
Generalidades
Entity SQL (tambin conocido como eSQL, abre-
viatura que utilizaremos en lo adelante) ha sido
diseado especialmente como vehculo para dar
soporte a las consultas sobre modelos de datos de
entidades, y permite explotar toda la potencia de
expresin que incorporan dichos modelos, inclu-
yendo por supuesto caractersticas como la heren-
cia, las relaciones o los tipos complejos. Entre los
requisitos fundamentales sobre los que se apoy el
diseo del lenguaje, podemos mencionar los
siguientes:
Estar basado en SQL, el estndar indiscu-
tible en lo que a gestin de datos se refiere,
para facilitar su rpida adopcin por los desa-
rrolladores. No obstante, incluso en la sinta-
Consulta de modelos conceptuales
con Entity SQL (II)
En nuestra entrega anterior [1], presentamos los conceptos fundamen-
tales relacionados con Entity SQL, el lenguaje de consulta de modelos
conceptuales incorporado al Marco de entidades de ADO.NET (ADO.NET
Entity Framework), y mostramos el papel que este lenguaje juega dentro
de ese novedoso marco de trabajo y las posibilidades que ofrece. A par-
tir de este mes, nos centraremos en describir su sintaxis y semntica, y
en mostrar cmo hacer uso de stas para resolver situaciones similares
a las que encontraremos frecuentemente al consultar nuestros modelos.
Unai Zorrilla,
Octavio Hernndez
Unai Zorrilla es
Development Team
Leader de Plain Concepts.
MVP desde 2004,
colabora activamente con
Microsoft en eventos de
arquitectura y
desarrollo, as como en
giras de productos. Autor
de los libros Modelando
procesos de negocio con
Workflow Foundation y
ADO.NET Entity
Framework: Aplicaciones y
servicios centrados en
datos.
Octavio Hernndez es
MVP de C# desde 2004,
MCSD y MCT. Autor de
los libros C# 3.0 y
LINQ" y "ADO.NET
Entity Framework:
Aplicaciones y servicios
centrados en datos" (con
Unai Zorrilla y Eduardo
Quints).
plataforma.net
d
o
t
N
e
t
M
a
n

a
<
<
15
dnm.plataforma.net
<<
xis existen algunas diferencias necesarias entre
SQL y eSQL, que iremos mencionando a lo lar-
go de ste y los siguientes artculos.
Soportar todos los tipos de datos y cons-
trucciones de EDM, obviamente.
Independencia de cualquier dialecto de SQL
o proveedor de ADO.NET concreto, para que
las consultas y las aplicaciones que las utilicen
sean virtualmente independientes del proveedor
de ADO.NET y la base de datos subyacentes.
Este es un aspecto de gran importancia a la hora
de desarrollar y mantener aplicaciones capaces
de trabajar contra diferentes motores de bases
de datos relacionales.
Ortogonalidad y soporte para la composicin.
A diferencia de la mayora de las implementacio-
nes de SQL, en eSQL las expresiones se tratan de
una manera ortogonal, de manera que se puede
colocar virtualmente cualquier expresin en cual-
quier posicin de una expresin SELECT. Por ejem-
plo, en T-SQL una subconsulta en la clusula
SELECT debe evaluarse a un valor escalar, y en la
clusula FROM a una coleccin; estas inconsisten-
cias no existen en eSQL. Como ejemplo, consi-
dere la sentencia del listado 1, que incluye una
subconsulta no escalar en la clusula SELECT. En la
tabla 1 se puede ver un fragmento del conjunto
de resultados que esta consulta produce; recuer-
de de nuestro artculo anterior que los conjuntos
de resultados que produce la ejecucin de una sen-
tencia eSQL pueden ser mucho ms complejos
que los que devuelve un proveedor tradicional de
ADO.NET que ejecute una sentencia SQL.
Soporte para las colecciones como ciudadanos de
primera clase. Los conjuntos de entidades con que
trabaja el Marco son tratados como colecciones de
objetos de los tipos correspondientes. Del mismo
modo, eSQL ofrece mecanismos para construir colec-
ciones ad hoc de elementos de diversa naturaleza, y
las colecciones se pueden crear, anidar y proyectar
como cualquier otro tipo soportado por EDM. Por
ejemplo, en la consulta del listado 2 se construye y uti-
liza como filtro una coleccin de cadenas de caracte-
res. Como se puede observar, la sintaxis para construir
colecciones se usan llaves, al estilo de C#
1
. Del mismo
modo, la consulta del listado 3 utiliza una coleccin,
en este caso de entidades del tipo Pais del modelo.
Tabla 1. Fragmento del resultado de la consulta del listado 1.
SELECT P.Nombre,
(SELECT F.Nombre, F.Club
FROM FUTBOL2006Entities.Futbolista A S F
WHERE F.Pais.Codigo = P.Codigo
ORDER BY F.Nombre) A S Futbolistas
FROM FUTBOL2006Entities.Pais A S P
ORDER BY P.Nombre
Listado 1. Consulta eSQL con subconsulta en clusula SELECT
SELECT F.Club.Nombre, COUNT(F.Id)
FROM FUTBOL2006Entities.Futbolista A S F
WHERE F.Posicion IN { P, D }
GROUP BY F.Club.Nombre
HA VING F.Club.Nombre LIKE %MA D%
SELECT P.Nombre
FROM (FUTBOL2006Entities.Pais UNION
{ FUTBOL2006Model.Pais(CU, CUBA ),
FUTBOL2006Model.Pais(US, ESTA DOS UNIDOS) })
A S P
ORDER BY P.NOMBRE
Listado 2. Consulta eSQL con coleccin creada ad hoc.
Listado 3. Otra consulta eSQL con coleccin creada ad hoc.
1
eSQL tambin ofrece el operador MULTISET (por ejemplo, MULTISET('P', 'D')) con el mismo objetivo.
d
o
t
N
e
t
M
a
n

a
<
<
16
dnm.plataforma.net
<<
eSqlBlast es una utilidad que permite ejecutar directamente
consultas eSQL contra modelos de entidades, creada a fina-
les de 2007 por Zlatko Michailov, entonces miembro del
equipo de desarrollo de Entity Framework. Microsoft ofrece
el cdigo fuente (escrito en C#) de esta herramienta, que pue-
de descargarse desde http://code.msdn.microsoft.com/esql
para luego compilarlo con cualquier versin de Visual Studio
2008, incluyendo, en principio, Visual C# Express. Decimos
"en principio" porque el cdigo est estructurado en forma
de un ncleo (librera de clases comunes) sobre el que luego
se apoyan diferentes proyectos que proporcionan interfaces
de usuario de consola, Windows y Web. Si est usando Visual
C# Express, no podr abrir ni compilar el proyecto de inter-
faz Web, que podr eliminar de la solucin. Aqu describire-
mos la versin con interfaz de usuario Windows; el nombre
del ejecutable que se obtiene es Microsoft.Samples.Data.eSql-
Blast.WinShell.exe.
Si se ejecuta el proyecto una vez compilado, se obtie-
ne la interfaz de usuario que se muestra en la figura 1. Bsi-
camente, eSqlBlast ofrece cinco pestaas:
Connection, en la cual debemos introducir la infor-
macin que eSqlBlast necesita para poder ejecutar las
consultas eSQL contra un modelo.
Model, en la que podemos obtener un conjunto de
pginas con hiperenlaces que muestran, de una mane-
ra clara e intuitiva, informacin del modelo.
Query, en la que podemos introducir una sentencia
eSQL que queramos ejecutar. El editor que se ofre-
ce aqu brinda ciertas facilidades rudimentarias, como
el coloreado basado en la sintaxis. Al pulsar el botn
de ejecucin, automticamente se salta a la siguiente
pestaa.
Results, en la que se muestran de forma tabular los
resultados de la ejecucin de las consultas, o los men-
sajes de error que se puedan producir durante la eje-
cucin. Una informacin adicional relevante que se
muestra es el comando del almacn (store command),
o sea, la traduccin de la sentencia eSQL al dialecto
de SQL del motor de bases de datos subyacente (en
nuestro caso, T-SQL).
About, que muestra los crditos de la aplicacin.
Como puede verse en la figura 1, para poder ejecutar
consultas con eSqlBlast es necesario suministrar:
El nombre del proveedor ADO.NET con el que se acce-
de a la base de datos subyacente; en nuestro caso, Sys-
tem.Data.SqlClient, dado que utilizamos SQL Server.
La cadena de conexin del proveedor utilizada para
conectarse a la base de datos subyacente. Puede obte-
nerse fcilmente, pues forma parte de la cadena
de conexin del modelo (el valor de la propiedad
Connection String del modelo, ver figura 2).
La ruta fsica a los ficheros SSDL, MSL y
CSDL que componen el modelo. En este lti-
mo caso, recuerde que, por defecto, cuando
se crea un modelo de entidades en un pro-
yecto de Visual Studio 2008, esos ficheros se
embeben como recursos dentro del ejecuta-
ble. Se puede obtener estos ficheros de mane-
ra independiente cambiando el valor de la pro-
piedad Metadata Artifact Processing (Tra-
tamiento de artefactos de metadatos) del
modelo de su valor predeterminado (Embed
in Output Assembly, Embeber en ensam-
blado resultante) al valor Copy to Output
Directory (Copiar a directorio de salida),
como se muestra en la figura 2, y regeneran-
do el proyecto.
La herramienta eSqlBlast
Figura 1. Interfaz Windows de eSqlBlast
Figura 2. Generando los ficheros del modelo para eSqlBlast.
d
o
t
N
e
t
M
a
n

a
<
<
17
dnm.plataforma.net
<<
Elementos sintcticos
Como ya hemos mencionado anteriormente, eSQL es
un lenguaje para definir consultas sobre modelos de
entidades, y en l prcticamente todo es una expresin.
Las consultas se pueden definir de dos maneras:
Utilizando directamente una expresin vlida
del lenguaje. Por ejemplo, en el listado 4 se mues-
tran varias maneras equivalentes de definir una
misma consulta, la primera utilizando una sim-
ple expresin.
Utilizando una expresin de consulta SELECT.
Observe en el listado 4 que el alias para la expre-
sin de la clusula FROM es opcional (aunque su uso
es siempre recomendado). A la clusula VA LUE le
dedicaremos un epgrafe especial ms adelante.
Expresiones bsicas
En la construccin de expresiones, los nombres de enti-
dades, propiedades, etc. del modelo se pueden combi-
nar con otros recursos tpicos de cualquier lenguaje [2]:
Literales, para representar valores constantes de
los tipos soportados por EDM.
Variables y parmetros, que utilizan convenios
sintcticos similares a los de T-SQL. En parti-
cular, los nombres de parmetros deben comen-
zar con el carcter @.
Operadores. Adems de los ms tradicionales
(aritmticos, lgicos, relacionales), se ofrece todo
un conjunto de operadores especiales relaciona-
dos con la herencia, navegacin de relaciones y
otros, algunos de los cuales iremos presentando
en prximas entregas.
Funciones. Aqu Microsoft ha definido un con-
junto de funciones cannicas que debern ser
implementadas por todos los proveedores para
el Marco de entidades. Por otra parte, los fabri-
cantes de cada proveedor concreto para el Mar-
co de entidades son libres de suministrar sus pro-
pias "funciones extendidas", que sern vlidas solo
para ese proveedor. Como ejemplo, considere la
consulta que se muestra en el listado 5. En ella
se utiliza una funcin cannica, CURRENTDA TETIME,
y otra especfica del proveedor de SQL Server,
SqlServer.DA TEDIFF.
Expresiones de consulta SELECT
Las expresiones de consulta SELECT de eSQL (no con-
fundir con las expresiones de consulta de C# o VB) siguen
la sintaxis SFWGHO (SELECT-FROM-WHERE-GROUPBY-
HA VING-ORDERBY) tradicional de SQL, con ligeras dife-
rencias. Puede encontrar un listado completo de estas
diferencias en MSDN [5]. Adems de las que ya hemos
mencionado al principio de este artculo (ortogonalidad
en uso de expresiones, soporte para colecciones), desta-
caremos ahora las siguientes:
Lo primero a destacar es el hecho de que eSQL
no soporta SELECT *; se requiere indicar explci-
tamente las expresiones a recuperar.
En segundo lugar, todas las referencias a pro-
piedades de las entidades del modelo deben ser
cualificadas con el nombre de la entidad o un
alias de sta, como puede observarse en los lis-
tados 1, 2 y 3.
Por ltimo, en eSQL aparece la clusula VA LUE,
a la que dedicaremos la siguiente seccin.
Entidades vs. tuplas
Como ya hemos mostrado a lo largo de estos dos art-
culos, las posibilidades de recuperacin de datos que
ofrece eSQL van mucho ms all de la estructura tabu-
lar convencional del SQL tradicional. Al ejecutar una
expresin de consulta de eSQL como la que se mues-
tra en el listado 6, se obtiene como resultado una colec-
cin de entidades como la que aparece en la tabla 2.
No obstante, en muchas ocasiones puede ser ms
conveniente recuperar una coleccin de tuplas (filas), que
sera algo mucho ms parecido a lo que obtendramos al
ejecutar una sentencia SQL tradicional. Por esa razn,
entre otras, eSQL soporta tipos de tuplas; de hecho, el
consulta bsica
OJO: devuelve una coleccin de TUPLA S
FUTBOL2006Entities.Club
equivalente con SELECT
SELECT VA LUE Club FROM FUTBOL2006Entities.Club
otro equivalente
SELECT VA LUE C FROM FUTBOL2006Entities.Club A S C
Listado 4. Varias maneras de expresar una misma consulta
SELECT F.Nombre,
SqlServer.DA TEDIFF(year, F.FechaNacimiento,
CURRENTDA TETIME())
FROM FUTBOL2006Entities.Futbolista A S F
WHERE F.Club.Codigo = RMA
Listado 5. Consulta eSQL con una funcin cannica y otra
del proveedor.
d
o
t
N
e
t
M
a
n

a
<
<
18
dnm.plataforma.net
<<
lenguaje ofrece un operador especializado, ROW, para la
construccin de tuplas (ver ejemplo en el listado 7).
La clusula VA LUE permite precisamente "aplanar"
las entidades a filas. Si agregamos la clusula VA LUE a la
expresin de consulta del listado 6 (obteniendo la
segunda de las consultas que se muestran en el listado
4) y la ejecutamos, eSqlBlast nos mostrar algo simi-
lar a lo que se ve en la tabla 3. Este aplanamiento se
produce implcitamente cuando utilizamos para la con-
sulta una expresin bsica en lugar de una expresin
de consulta SELECT.
Observe que siempre que se ejecute una expresin
de consulta con varias expresiones en la clusula SELECT
(como en los listados 1, 2 y 5), eSQL envuelve impl-
citamente esos "campos" en tuplas. ste es el compor-
tamiento implcito tambin en el caso en que en la clu-
sula SELECT contenga una nica expresin que no sea
del tipo de ninguna de las entidades del modelo, como
en el listado 3, donde la expresin es una cadena de
caracteres. Pero en este caso, el hecho de encapsular en
una tupla un nico dato no aporta gran cosa; podra-
mos preferir haber obtenido directamente una colec-
cin de cadenas. Aqu tambin la clusula VA LUE viene
a nuestro rescate: tal encapsulamiento no se producir
si la utilizamos, algo cuya comprobacin dejamos pro- puesta al lector (Nota: aqu tal vez la salida de eSqlBlast
no sea muy informativa; le recomendamos que utilice
nuestro programa de ejemplo, que puede descargar del
sitio Web de dotNetMana).
Conclusin
En este artculo hemos comenzado la presentacin
prctica de las principales caractersticas de eSQL como
lenguaje de consulta de modelos conceptuales. Aqu
nos hemos centrado en los aspectos fundamentales del
lenguaje; en la prxima entrega, veremos los recursos
que dan soporte a la utilizacin de las caractersticas
ms avanzadas de los modelos, como la herencia y las
propiedades de navegacin. Hasta entonces!
devuelve coleccin de entidades
SELECT Club FROM FUTBOL2006Entities.Club
Listado 6. Consulta eSQL que devuelve una coleccin de
entidades
SELECT ROW(Club.Codigo, Club.Nombre, Club.Ciudad)
A S Club
FROM FUTBOL2006Entities.Club
Listado 7. Otra consulta eSQL equivalente a la del listado 4.
Tabla 2. Resultado de la consulta del listado 6.
Tabla 3. Resultado de la consulta del listado 4.
Bibliografa
Zorrilla, U., Hernndez, O., Consulta de modelos conceptuales con Entity SQL (I), en dotNetMana n
56, enero de 2009.
Zorrilla, U., Hernndez, O., Quints E., ADO.NET Entity Framework. Aplicaciones y servicios centrados en
datos, Krasis Press, 2008. En particular, el Apndice B ofrece una referencia de Entity SQL.
Hernndez, O., C# 3.0 y LINQ, Krasis Press, 2007.
Zorrilla, U., Hernndez, O., El Marco de Entidades de ADO.NET 3.5 (I-VII), en dotNetMana n 44-50,
enero-julio de 2008.
Documentacin de Entity SQL en MSDN, en http://msdn.microsoft.com/en-us/library/bb399560.aspx.
Michailov, Z., post en el blog: http://blogs.msdn.com/esql/archive/2007/10/24/EntitySQL.aspx.
[1]
[2]
[3]
[4]
[5]
[6]
Cada vez los usuarios son ms y ms exigentes, y
por ello demandan cada vez ms aplicaciones y ms
complejas. Los desarrolladores debemos afrontar
este doble reto, siendo capaces de proporcionar
aplicaciones mejores y ms complejas en cada vez
menos tiempo. Evidentemente, ste es un proce-
so global, que afecta a todo el ciclo de vida de una
solucin de software. Por ello, las herramientas
ALM estn cobrando un papel cada vez ms impor-
tante (ver el especial de dotNetMana de octubre
de 2008 dedicado al tema). Pero no voy a hablar
de ALM aqu, sino que me gustara centrarme en
los retos concretos que esta situacin implica cuan-
do hablamos de interfaces de usuario. No en vano,
la interfaz de usuario es el punto de conexin entre
el usuario y la aplicacin. Es un elemento crtico,
y de su implementacin depende en buena medi-
da el xito final de toda la aplicacin.
Interfaces complejas
Las aplicaciones actuales demandan interfaces de
usuario complejas a nivel tcnico, pero que a la
vez sean sencillas de utilizar y de mantener. Que
se adapten a cualquier tipo de usuario, y que tan-
to usuarios expertos como inexpertos se sientan
a gusto utilizndola. En resumen, que la expe-
riencia del usuario al utilizar la interfaz sea plena
y que nuestra aplicacin sea usable por cualquier
usuario.
El trmino interfaz compleja no quiere refe-
rirse al aspecto visual o a la usabilidad, sino al hecho
de que cada vez resulta ms complejo y difcil rea-
lizar interfaces que permitan conjugar las crecien-
tes posibilidades de una aplicacin con la sencillez
de uso y la usabilidad. ste es el reto que debemos
solucionar.
Un poco de historia
El mecanismo habitual de desarrollar interfaces de
usuario en .NET viene influenciado de los viejos
tiempos de Visual Basic. Es un patrn que consis-
te en una clase contenedora (llamada comnmen-
te formulario) que contiene a los controles y toda
la lgica asociada a dichos controles. Por norma
general, el formulario se suscribe a los eventos de
los controles que l contiene y realiza la lgica apro-
piada en los mtodos gestores de dichos eventos.
La ventaja de este modelo de programacin es que
es sencillo, intuitivo y fcil de aprender. La des-
ventaja es que al tener unidas la lgica y la pre-
sentacin, se vuelve ms complejo el manteni-
miento, tendiendo a colapsar en grandes proyectos,
y se dificulta la separacin del desarrollo entre
varios equipos.
La sencillez de una
interfaz compleja
plataforma.net
Eduard Toms
tiene ms de10 aos
de experiencia en an-
lisis y desarrollo de
aplicaciones.
Actualmente trabaja
como director de pro-
yectos y arquitecto de
software en raona.
Es MCSD.NET,
MCPD en
aplicaciones Windows
y distribuidas,
adems de certificado
en UML y SCWCD
en Java
En este artculo se hace una introduccin a PRISM, el marco de trabajo para
el desarrollo de aplicaciones visuales WPF propuesto por Microsoft Patterns
& Practices para hacer posible la creacin de aplicaciones ms mantenibles y
extensibles. Tambin se presentan diversos patrones relacionados con PRISM,
como Presentacin separada e Inversin de control.
Eduard Toms
dnm.plataforma.net
<<
Es conocido ya desde hace algunos
aos que una de las claves para desarro-
llar interfaces complejas y que resulten
mantenibles sin morir en el intento con-
siste en desacoplar la presentacin de la
lgica asociada a dicha presentacin. La
gente que viene de Visual C++6 ya lo
vena haciendo desde los tiempos de las
MFC. Lamentablemente, Microsoft no
incorpor ningn framework parecido a
MFC en .NET. Posteriormente, duran-
te los aos que siguieron al lanzamiento
de .NET, la gente de Patterns & Prac-
tices de Microsoft s trabaj en este sen-
tido, y naci CAB (Composite UI Applica-
tion Block), que consista en un montn
de consejos y buenas prcticas sobre
cmo desarrollar aplicaciones usando
Windows Forms, as como una librera
que implementaba dichas buenas prcti-
cas. Al cabo de un tiempo, vio la luz
SCSF (Smart Client Software Factory), que
complementaba a CAB con varias mejo-
ras y aadidos a Visual Studio, conso-
lidndose como una herramienta impres-
cindible para el desarrollo de aplicacio-
nes Windows Forms complejas.
Con la aparicin de .NET Framework
3.0 y WPF, volvemos a vivir una situacin
parecida a la que tenamos cuando sali
.NET Framework: somos conscientes de
la necesidad de herramientas que nos ayu-
den en la creacin de nuestras interfaces
complejas, pero Microsoft no nos pro-
porciona ninguna, ya que CAB y SCSF
no sirven para WPF
1
. Y como la historia
tiende a repetirse, de nuevo nos llega la
solucin de la mano de la gente de Pat-
terns & Practices. CAL (Composite Appli-
cation Layer) o PRISM, que vendra a ser
su nombre "en clave", es la visin de
Microsoft sobre cmo debemos desarro-
llar aplicaciones complejas usando WPF,
as como una librera que implementa
dicha visin. PRISM no es CAB para
WPF: aunque muchos de los conceptos
y patrones que existen bajo PRISM son
los mismos de CAB (puesto que la pro-
blemtica a solucionar es la misma),
PRISM est especialmente diseado para
WPF, adems de que se aprovecha de todo
el feedback que se ha ido generando sobre
CAB durante los aos en que esta tecno-
loga ha estado en servicio.
A describir un poco dichas buenas
prcticas es a lo que vamos a dedicar el
artculo que tiene usted ahora entre
manos.
Ventajas de una aplicacin
compuesta
Llamamos aplicacin compuesta (com-
posite application) a aquella que est com-
puesta por distintos mdulos indepen-
dientes y que colaboran entre s. Lo de
independientes implica que pueden estar
desarrollados por equipos diferentes. Cada
uno de los mdulos puede modificar su
parte de la interfaz de usuario, aunque
debe garantizarse que el aspecto general
de la aplicacin sea consistente.
Las principales ventajas de una apli-
cacin compuesta son:
1. Podemos separar fcilmente el desa-
rrollo entre equipos distintos, y
adems cada equipo puede concen-
trarse en sus propias tareas.
2. Son aplicaciones extensibles: siempre
es posible aadir nuevos mdulos
para las nuevas funcionalidades.
En lo sucesivo, veremos cmo
PRISM hace posible la creacin de apli-
caciones compuestas y qu patrones
intervienen en ello.
Introduccin a PRISM
Una aplicacin PRISM se compone de
tres elementos principales:
1. El bootstrapper (o inicializador). Es
el encargado de poner en marcha la
aplicacin. El bootstrapper carga los
mdulos iniciales e inicializa el shell.
Tambin lanza ciertos servicios adi-
cionales, como por ejemplo el servi-
cio de logging.
2. El shell. Es el contenedor (ventana)
principal de la aplicacin. Contiene
aquellos elementos de la interfaz de
usuario que estn visibles en todo
momento. Por ejemplo, una barra de
men o un ribbon son candidatos a
estar en el shell, ya que son elemen-
tos que siempre estn visibles en la
interfaz.
3. Uno o ms mdulos independientes
que implementan las distintas fun-
cionalidades de la aplicacin.
Mi reino por una vista
Hemos comentado que una aplicacin
PRISM se compone de varios mdulos
independientes, y que cada mdulo pue-
de modificar la interfaz de usuario.
d
o
t
N
e
t
M
a
n

a
<
<
21
1
Aunque con la salida de WPF la comunidad no se qued quieta. Ante la necesidad de tener un CAB para WPF, naci el proyecto WPF Layer
for CAB (http://www.codeplex.com/wpfcab) para adaptar CAB a WPF. Posteriormente este proyecto qued obsoleto y fue reemplazado por SCSF
Contrib (http://www.codeplex.com/scsfcontrib), que entre otras novedades incorpora una versin de CAB preparada para WPF.
PRISM est especialmente
diseado para WPF, y se
aprovecha de todo el
feedback que se ha ido
generando sobre CAB
dnm.plataforma.net
<<
d
o
t
N
e
t
M
a
n

a
<
<
22
Cmo se consigue esto en PRISM?
Para ello, debemos explicar el primero
de los patrones de diseo que imple-
menta PRISM: el patrn Presentacin
separada (Separated Presentation).
Presentacin separada
Este patrn de diseo se puede resu-
mir con la frase: asegurarse de que todo el
cdigo que manipula presentacin manipu-
le solamente presentacin, colocando toda la
lgica de negocio y acceso a datos en reas
separadas del programa [1].
Tener la lgica y la presentacin jun-
tas en una misma clase (el clsico for-
mulario), hace que esta clase sea ms
compleja, difcil de mantener y tambin
(y eso es importante) difcil de testear.
Adems, se complica la reutilizacin de
cdigo entre formularios que requie-
ren el mismo comportamiento. El patrn
Presentacin separada ataca estos pro-
blemas haciendo que todo el cdigo de
presentacin est aislado en una clase que
se conoce como vista (view). La vista es
la encargada de mostrar los datos, pero
no tiene ninguna responsabilidad de lgi-
ca de negocio. Es por as decirlo, com-
pletamente tonta. Y qu datos son los
que muestra la vista? Pues los datos de
nuestro modelo (model). As que tene-
mos un modelo, que contiene unos datos,
y una vista que muestra dichos datos.
En base a la relacin entre la vista y
el modelo y de donde est el cdigo que
maneja la lgica de negocio se determi-
na qu variante del patrn Presentacin
separada estamos usando. Hay varias,
pero me gustara comentar dos que son
ms usadas.
Model-View-Presenter (MVP)
En este patrn aparece el concepto
de presentador (presenter). El presen-
tador es la clase que contiene la lgica
de negocio (recordad que no estaba en
la vista) y quien comunica la vista con
el modelo.
Existen, a su vez, dos variantes del
patrn MVP: MVP with Supervising
Controller y MVP Passive View. En
la primera variante (figura 1), la vista se
comunica con el modelo a travs de data
binding simple. Este enlace a datos pue-
de ser bidireccional, por lo que la vista
puede modificar el modelo. El presen-
tador por su lado incorpora toda la lgi-
ca de negocio, y permite modificar el
modelo y actualizar la vista en aquellos
casos que van ms all de un simple data
binding.
En la variante MVP Passive View, no
hay comunicacin entre la vista y el mode-
lo. En este caso, toda la comunicacin
entre la vista y el modelo debe realizarse
a travs del presentador (figura 2).
Model-View-ViewModel (MVVM)
En este patrn aparece el concepto
de ViewModel, una clase que acta de
fachada del modelo para la vista. El
ViewModel (figura 3) monitoriza y se
comunica con el modelo y lo encapsu-
la en una interfaz ms sencilla, a travs
de la cual se comunica la vista (general-
mente mediante data binding).
Aqu el ViewModel se encarga de rea-
lizar todas aquellas transformaciones
necesarias en el modelo para que pueda
ser entendido por la vista y viceversa:
cuando la vista actualiza un dato del View-
Model, ste actualiza todos los datos rea-
les del modelo. Generalmente, la vista y
el ViewModel suelen estar comunicados
mediante data binding.
Regiones de PRISM
En PRISM, el shell (que implemen-
ta la ventana principal) define una o
varias regiones. Una regin de PRISM
es una zona de la ventana principal don-
de se pueden incrustar vistas. Los dis-
tintos mdulos proporcionan distintas
vistas (utilizando cualquiera de los patro-
nes Presentacin separada que hemos
descrito), e incrustan las vistas en las dis-
tintas zonas del shell. De esta manera,
las vistas se integran todas juntas, dan-
do al usuario una sensacin de una inter-
faz de usuario coherente.
Las regiones se definen en el XAML
del shell utilizando la propiedad asocia-
da RegionManager.RegionName.
Hola, PRISM!
Para empezar a ver cmo funciona
PRISM e introducir algunos conceptos
Figura 1. MVP with Supervising
Controller
Figura 2. MVP Passive View
Figura 3. Model-View-ViewModel
d
o
t
N
e
t
M
a
n

a
<
<
23
nuevos, vamos a desarrollar una pequea
aplicacin PRISM. Y para no defraudar
a nadie, vamos a ver cmo sera el clsi-
co Hello, world utilizando PRISM.
Estructura del proyecto
Lo primero necesario para desarro-
llar una aplicacin PRISM es la propia
librera. Esta se puede descargar en [2].
Los ensamblados que componen
PRISM son:
Microsoft.Practices.Composite.dll
Microsoft.Practices.
Composite.Wpf.dll
Microsoft.Practices.
Composite.UnityExtensions.dll
Microsoft.Practices.Unity.dll
Microsoft.Practices.
ObjectBuilder2.dll
Estrictamente hablando, los dos lti-
mos ensamblados de la lista no forman
parte de PRISM, sino de Unity (ms
adelante hablamos de l). PRISM y
Unity van juntos muchas veces, aunque
no es obligatorio que sea as.
Usando Visual Studio, creamos una
nueva aplicacin WPF y le agregamos
las referencias a los ensamblados de
PRISM. Estamos listos para empezar!
Creacin del shell
El primer paso es definir el shell de
nuestra aplicacin. Recordad que el shell
es la ventana principal de la aplicacin,
que contendr aquellos elementos de
interfaz comunes y la definicin de las
regiones donde los mdulos incrustarn
las vistas que creen. Dado que Visual Stu-
dio ya nos crea una ventana Window1,
vamos a utilizar esta misma para definir
nuestro shell (ver listado 1).
El cdigo es muy simple: crea una
rejilla con dos filas. En la primera fila
incrusta una etiqueta con el texto PRISM
Demo, y en la segunda fila un cuadro de
lista (llamado lstData). La clave est en
las dos lneas resaltadas: en la primera sim-
plemente declaramos el espacio de nom-
bres cal para contener los elementos
XAML que define PRISM. En la segun-
da, declaramos una regin de PRISM lla-
mada List. En este caso, estamos defi-
niendo una regin de PRISM dentro de
una lista. Las vistas que agreguemos a esta
regin se aadirn dentro de la lista.
Creacin del bootstrapper
Una vez creado el shell, necesitamos
el bootstrapper, que servir de lanzador
de nuestra aplicacin. El bootstrapper ini-
cializa diversos componentes de
PRISM, para terminar creando una ins-
tancia del shell y pasndole el control.
Aadiremos al proyecto una nueva
clase llamada HelloPrismBootstrapper,
cuyo cdigo se muestra en el listado 2.
Si le sorprende el uso de Contai-
ner.Resolve para crear el objeto Window1,
tranquilo: eso es porque usamos el con-
tenedor de Inversin de control Unity.
Dentro de poco comentaremos lo ms
esencial de Unity, as que no se preocu-
pe por ahora.
Finalmente, eliminamos el atributo
StartupUri de A pp.xaml (porque el boots-
trapper es quien crear el shell), y ya
podemos ejecutar la aplicacin. De
acuerdo, el resultado es un poco decep-
cionante: simplemente nos muestra la
dnm.plataforma.net
<<
<Window x:Class=HelloPrism.Window1
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
xmlns:cal=http://www.codeplex.com/CompositeWPF
Title=Window1 Height=300 Width=300>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height=* />
<RowDefinition Height=10* />
</Grid.RowDefinitions>
<Label Grid.Row=0>PRISM Demo</Label>
<ListBox Grid.Row=1
cal:RegionManager.RegionName=List x:Name=lstData>
</ListBox>
</Grid>
</Window>
Listado 1. Cdigo XAML de la ventana principal (shell)
namespace HelloPrism
{
public class HelloPrismBootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
Window1 shell = Container.Resolve<Window1>();
shell.Show();
return shell;
}
}
}
Listado 2. Clase que implementa el lanzador
dnm.plataforma.net
<<
d
o
t
N
e
t
M
a
n

a
<
<
24
ventana principal y luego revienta con
una excepcin (IModuleEnumerator
cannot be null).
Creacin de un mdulo
Tenemos el shell y tenemos el boots-
trapper que nos lanza la aplicacin. El
ltimo paso para tener una aplicacin
totalmente funcional es crear un mdu-
lo que nos incruste alguna vista en la
regin que hemos definido en nuestro
shell.
Un mdulo de PRISM es una cla-
se que implementa la interfaz IModu-
le (que contiene un solo mtodo lla-
mado Initialize). Dado que un
mdulo es una clase, un mismo
ensamblado puede contener varios
mdulos de PRISM. Los mdulos son
quienes crean las vistas (y los objetos
adicionales, tales como presentado-
res) y las colocan en las regiones del
shell. Y quin carga los mdulos?
Pues el bootstrapper. Para ello debe
redefinirse el mtodo GetModuleEnu-
merator, y desde este mtodo devol-
ver una instancia de IModuleEnumera-
tor, que es la interfaz que usa PRISM
para cargar los mdulos. Para ello,
aadiremos al bootstrapper el mtodo
que se muestra en el listado 3.
La clase StaticModuleEnumerator
implementa IModuleEnumerator, y su
mtodo A ddModule nos permite cargar un
mdulo. Existen varios IModuleEnumera-
tor ya listos para utilizar en PRISM (por
ejemplo, para aadir todos los mdulos
que estn en los ensamblados de un direc-
torio o usar un fichero de configuracin),
y tambin podemos crear nuestras pro-
pias implementaciones.
El siguiente paso consiste en crear
el mdulo. Para ello, aadimos una cla-
se llamada HelloModule en nuestro pro-
yecto, con el cdigo que se muestra en
el listado 4.
Observe que el mdulo implementa
IModule y en el mtodo Initialize acce-
de al RegionManager de PRISM para
incrustar en la regin List dos vistas idn-
ticas del tipo HelloView.
Por ltimo, solo nos queda imple-
mentar la vista HelloView. En este caso
es una vista extremadamente simple,
que contiene solamente una etiqueta
(listado 5).
Si ahora ejecutamos la aplicacin,
veremos la ventana del shell, y dentro
del cuadro de lista dos elementos Hello-
View. Ya hemos creado nuestra prime-
ra aplicacin PRISM!
protected override IModuleEnumerator GetModuleEnumerator()
{
return new StaticModuleEnumerator().A ddModule(typeof(HelloModule));
}
Listado 3. Mtodo GetModuleEnumerator del bootstrapper
namespace HelloPrism
{
class HelloModule : IModule
{
private IUnityContainer container;
private IRegionManager regionManager;
public HelloModule(IUnityContainer container,
IRegionManager regionManager)
{
this.container = container;
this.regionManager = regionManager;
}
public void Initialize()
{
this.regionManager.Regions[List].
A dd(this.container.Resolve<HelloView>());
this.regionManager.Regions[List].
A dd(this.container.Resolve<HelloView>());
}
}
}
Listado 4. Nuestro mdulo de ejemplo
Los mdulos son los
encargados de crear las
vistas y colocarlas en las
regiones del shell
dnm.plataforma.net
<<
d
o
t
N
e
t
M
a
n

a
<
<
25
El contenedor IoC
Inversin de control (Inversion of Con-
trol, IoC) es una tcnica destinada a eli-
minar las dependencias entre clases y
por lo tanto conseguir una arquitectu-
ra ms dbilmente acoplada. Existen dos
patrones principales dentro de IoC,
Localizador de servicio e Inyeccin de
dependencias, y dado que ambos se usan
ampliamente en PRISM, vamos a echar-
les un vistazo.
Para poder usar ambos patrones, es
necesario disponer de lo que se conoce
como un contenedor IoC. PRISM pue-
de funcionar con cualquier contenedor
IoC existente
2
, pero de serie viene pre-
parado para usar Unity, que es el con-
tenedor IoC de cdigo abierto de
Microsoft.
Localizador de servicio
Imagine una situacin en que una
clase (CA ) utiliza un servicio, implemen-
tado en la clase S1. En este caso, la cla-
se CA tiene una dependencia directa de
S1. Para cambiar dicha dependencia
(por ejemplo, ha salido una versin dis-
tinta de S1 implementada en la clase S1b),
tenemos que cambiar nuestro cdigo
fuente.
El uso de interfaces no soluciona esta
dependencia, puesto que terminaremos
teniendo un cdigo parecido al del lis-
tado 6. En este caso, aunque la clase use
la interfaz I1, sigue habiendo una depen-
dencia directa entre CA y la clase S1, debi-
do al new. Y hacer que el constructor
reciba un parmetro de tipo I1 en lugar
de crear el objeto, no nos soluciona el
problema: simplemente mueve la
dependencia a otra clase (aquella que
crea objetos CA ).
El patrn Localizador de servicio
(Service Locator) soluciona este proble-
ma mediante el uso de un objeto inter-
medio (el localizador de servicio), que
es quien obtiene las instancias de los ser-
vicios. Como se muestra en la figura 4,
la clase pide un servicio que imple-
mente la interfaz I1 al localizador de
servicio, y ste es el encargado de devol-
ver una instancia del tipo adecuado. La
resolucin se realiza en tiempo de eje-
cucin mediante las reglas que pueda
tener configuradas el localizador (lo que
implica que cambiando dichas reglas
pueden obtenerse objetos de distintas
clases). Con ello eliminamos todas las
dependencias de nuestra clase de los ser-
vicios, sustituyndolas por una sola
dependencia del localizador de servicio
(y de la interfaz I1, pero no hay depen-
dencias entre la clase CA y las clases de
servicio S1 y S1b).
Inyeccin de dependencias
El patrn Inyeccin de depen-
dencias (Dependency Injection) se basa en
trasladar todas las dependencias al con-
tenedor de IoC, para que sea ste quien
cree los objetos de los tipos necesarios.
Se puede ver como una extensin del
<UserControl x:Class=HelloPrism.HelloView
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml>
<Grid>
<Label>Hello Prism</Label>
</Grid>
</UserControl>
Listado 5. La vista HelloView
class CA
{
private I1 _s1;
public CA ()
{
this._s1 = new S1();
}
}
Listado 6. La clase CA
2
Como por ejemplo, Spring.NET (http://www.springframework.net) o Castle (http://www.castleproject.org).
Figura 4. Funcionamiento del patrn Localizador de servicio.
dnm.plataforma.net
<<
d
o
t
N
e
t
M
a
n

a
<
<
26
patrn Localizador de servicio, donde
el contenedor de IoC rellena todos los
parmetros necesarios para crear un
objeto determinado.
Por ejemplo, dada la clase del lista-
do 7, cuando creemos un objeto de la
clase CA , el contenedor IoC es el encar-
gado de dar valor al parmetro s1 del
constructor, obteniendo una instancia
de la clase correspondiente.
El contenedor Unity
Unity es el contenedor IoC de
Microsoft, y por lo tanto ofrece sopor-
te completo para Localizador de servi-
cio e Inyeccin de dependencias. La cla-
se UnityBootstrapper (de la cual deriva
nuestro bootstrapper) es la encargada de
crear el contenedor de Unity en la pro-
piedad Container.
Las operaciones bsicas de Unity son:
Registrar un mapeo entre una inter-
faz I1 y un objeto de una clase S1 que
implemente I1 (mtodo RegisterTy-
pe<Interfaz, Clase>). Con ello, cuan-
do el contenedor IoC requiera un
objeto que implemente I1, devolver
una instancia de la clase S1.
Pedir una instancia de un objeto que
implemente I1. Unity nos devolver
un objeto de la clase que tenga el
mapeo correspondiente (mtodo
Resolve<Interfaz>).
Pedir una instancia de un objeto de
un tipo determinado. Unity crear un
objeto de dicho tipo, resolviendo
todos los parmetros necesarios del
constructor (mtodo Resolve<Clase>).
Recuerda la llamada a Contai-
ner.Resolve<Window1>() que usbamos
en el bootstrapper para crear un nuevo
shell? Con esa llamada le estamos indi-
cando a Unity que nos cree una nueva
instancia de la clase Window1 y que sumi-
nistre al constructor todos los objetos
necesarios (si los hubiese).
O por ejemplo, si revisa el cdigo de
la clase HelloModule, ver que el cons-
tructor tiene dos parmetros (IUnity-
Container y IRegionManager). Quien ins-
tancia los mdulos es la clase StaticMo-
duleEnumerator. Para crear un objeto del
tipo HelloModule, se utiliza el cdigo del
listado 8. Como puede observar, se lla-
ma al mtodo Resolve pasndole un obje-
to Type con la informacin del tipo a cre-
ar (en nuestro caso, el parmetro type es
typeof(HelloModule))
3
.
MVP con Unity
Vamos a ver un ejemplo de cmo
usar el patrn MVP (Model-View-Pre-
senter) explicado anteriormente usando
PRISM y Unity. Para ello, partiremos
del ejemplo HelloPrism anterior.
Primero, creamos la interfaz que
debe soportar el presentador y nuestra
clase de presentador (listado 9).
Ahora vamos a configurar Unity,
para que, cuando se le pida un objeto
del tipo IHelloPresenter, devuelva un
objeto de la clase HelloPresenter. Un
buen lugar para hacer esto es cuando se
carga el mdulo HelloModule. Para ello,
programaremos el mtodo Initialize
segn se muestra en el listado 10.
class CA
{
private I1 _s1;
// El parmetro s1 lo incrusta el
// contenedor IoC
public CA (I1 s1)
{
this._s1 = s1;
}
}
Listado 7
protected virtual IModule
CreateModule(Type type)
{
return (IModule)containerFacade.
Resolve(type);
}
Listado 8. Creacin de un objeto
HelloModule
public void Initialize()
{
this.container.RegisterType<
IHelloPresenter,
HelloPresenter>();
}
Listado 10. Configuracin de Unity
public interface IHelloPresenter
{
HelloView View { get; set; }
string GetText();
}
class HelloPresenter:IHelloPresenter
{
HelloView View { get; set; }
public string GetText()
{
return string.Format(
Hello Prism {0},
DateTime.Now.ToString(
hh:mm:ss));
}
}
Listado 9. Interfaz y clase de presentador
3
PRISM no utiliza Unity directamente, ya que soporta cualquier contenedor IoC. Para ello, define una interfaz llamada IContainerFacade, y es el
bootstrapper quien se encarga de crear una clase que implemente IContainerFacade y que use un contenedor IoC concreto. La clase
UnityBootstrapper (incluida en PRISM) hace este trabajo por nosotros si queremos usar Unity.
dnm.plataforma.net
<<
d
o
t
N
e
t
M
a
n

a
<
<
28
Ahora solo nos queda pasarle el pre-
sentador a la vista, y para ello confiare-
mos en el patrn Inyeccin de depen-
dencias. Aadimos al constructor de la
vista un parmetro de tipo IHelloPre-
senter, como muestra el listado 11.
Cuando el mdulo HelloModule cree
un objeto HelloView (usando el mtodo
Resolve), Unity automticamente cre-
ar un objeto HelloPresenter y lo usar
como el parmetro para el constructor
de la vista.
Como podis ver, Unity no nos fuer-
za a ningn patrn especfico de pre-
sentacin separada, y s nos da todas las
herramientas para que implementemos
lo que deseamos de forma fcil.
Eventos y comandos
Hemos visto lo ms bsico de PRISM:
cmo crear vistas usando el patrn MVP
y cmo incrustarlas en las zonas que defi-
ne el shell. Vamos a ver ahora el ltimo
punto necesario para poder construir una
aplicacin: cmo se comunican entre ellas
las distintas vistas.
El sistema de eventos
Dado que las vistas pueden estar cre-
adas por mdulos que son indepen-
dientes entre s, es necesario el uso de
un sistema de comunicacin tambin
desacoplado, en el que una vista (o pre-
sentador) pueda notificar a cualquier
otra vista de que ha sucedido alguna
accin en concreto, y tambin recibir
notificaciones emitidas por cualquier
otra clase de la aplicacin. Para dar una
solucin a este problema, PRISM utili-
za un sistema de eventos basado en el
patrn PublicadorSuscriptor (Publis-
her-Subscriber).
El patrn PublicadorSuscriptor
Este patrn (figura 5) se basa en la
idea de que cuando una clase quiere
comunicar que ha sucedido un evento lo
publica, y quien est interesado en reci-
bir un evento se suscribe a l. El publi-
cador no sabe quines son sus suscripto-
res, y un suscriptor tampoco conoce
quin ha publicado un determinado
evento. Vendra a ser algo parecido a una
lista de correo, en la que enviar un men-
saje implica que lo recibirn todos aque-
llos que estn suscritos a la lista, aunque
quien enva el mensaje no tiene porque
conocer quines lo van a recibir.
Desarrollando con el sistema de
eventos de PRISM
El sistema de eventos de PRISM
est implementado en una clase que
implementa la interfaz IEventA ggrega-
tor. El bootstrapper registra un singleton
de esta clase en el contenedor IoC, por
lo que siempre que pidamos al conte-
nedor un objeto que implemente IEvent
A ggregator recibiremos el mismo,
durante todo el ciclo de ejecucin de
aplicacin.
Lo primero que hay que hacer es cre-
ar una clase que defina el tipo de even-
to que queremos publicar o al que nos
queremos suscribir. Para ello, hay que
derivar de la clase CompositeWpfEvent
<TPayload>. El parmetro genrico TPay-
load indica el tipo de datos que contie-
ne nuestro evento. En terminologa
PRISM, los datos de un evento se cono-
cen como carga adicional (payload).
Podemos tener varios eventos con el
mismo tipo de carga adicional.
Por ejemplo, para definir el evento
de tipo HelloEvent y cuyos datos sern
una cadena, definimos la clase HelloE-
vent del listado 12.
Para poder publicar o suscribirnos
a un evento de este tipo, tenemos que
obtener una referencia al agregador de
eventos de PRISM (IEventA ggregator),
a travs del contenedor IoC. Por ejem-
plo, si queremos que el presentador ten-
ga acceso al agregador de eventos,
public IHelloPresenter Presenter
{
get; private set;
}
public HelloView(IHelloPresenter
presenter)
{
InitializeComponent();
this.Presenter = presenter;
this.Presenter.View = this;
this.lblBody.Content =
this.Presenter.GetText();
}
Listado 11. Pasando el presentador a la vista
public class HelloEvent :
CompositeWpfEvent<string> { }
Listado 12. Clase HelloEvent
Figura 5. El patrn Publicador-Suscriptor
dnm.plataforma.net
<<
d
o
t
N
e
t
M
a
n

a
<
<
29
podemos aadir un parmetro IEven-
tA ggregator al constructor del presen-
tador, y de este modo nos lo rellenar
el contenedor IoC (listado 13).
Para suscribirnos a un tipo de even-
to, invocamos el mtodo GetEvent<T>,
donde T es el tipo de evento al que nos
queremos suscribir, e invocamos Subs-
cribe sobre el objeto que se nos devuel-
ve (listado 14).
El mtodo Subscribe espera un
delegado con el cdigo a ejecutar cuan-
do se reciba un evento del tipo indica-
do. El delegado debe tener un par-
metro cuyo tipo sea el tipo de la carga
adicional del evento (en nuestro caso,
el tipo de la carga de HelloEvent es
string). El mtodo Subscribe devuelve
un token de suscripcin que nos sirve
para poder cancelar la suscripcin en
cualquier momento (usando el mto-
do Unsubscribe).
Para publicar un evento, basta con
llamar al mtodo Publish en lugar de
Subscribe (listado 15), pasndole un
parmetro que ser la carga adicional
del evento (en el caso de HelloEvent, el
mtodo esperar una cadena).
Comandos
Un comando es parecido a un even-
to, en el sentido de que es una notifica-
cin de que ha ocurrido algn hecho. Se
diferencia de un evento en que un even-
to est ligado a uno o ms elementos de
la interfaz de usuario que lo invocan; el
comando, por su parte, puede estar acti-
vado o desactivado, lo que activa o desac-
tiva todos los elementos de la interfaz de
usuario ligados a l.
El uso de comandos permite rea-
provechar lgica que se invoca desde
varios elementos de la interfaz de usua-
rio; elementos que pueden a su vez ser
proporcionados por mdulos comple-
tamente independientes entre s.
PRISM soporta comandos locales,
que se usan para comunicar una vista
con su presentador (o su ViewModel
asociado), y comandos globales, acce-
sibles en toda la aplicacin.
Vamos a ver rpidamente cmo fun-
cionan los comandos, empezando por
los comandos locales y continuando con
los globales. Para declarar un comando
local, lo ms habitual es declarar un obje-
to de la clase DelegateCommand<T>, don-
de T es el tipo de datos que maneja ese
comando. Por ejemplo, vamos a aadir
una vista (y un presentador) adicionales.
El cdigo XAML de la vista (HelloView2,
listado 16) es trivial.
Simplemente declaramos tres con-
troles (una etiqueta, un cuadro de tex-
to para introducir datos y un botn).
El cdigo C# asociado a la vista (lista-
do 17) se limita a invocar el comando
que su presentador le expone a travs
de la propiedad Hello2Command. Recuer-
de que un buen sitio para que la vista
reciba su presentador es en el cons-
tructor; as Unity crear el presenta-
dor de forma automtica.
Luego declaramos la interfaz y la
clase de nuestro nuevo presentador (lis-
tado 18). El presentador crea un Dele-
public HelloPresenter(
IEventA ggregator evtA g)
{
// Nos guardamos el agregador
// de eventos
this.evtA g = evtA g;
}
Listado 13. Constructor de HelloPresenter
this.st =
this.evtA g.GetEvent<
HelloEvent>().Subscribe(
x => this.View.
lblBody.Content = x);
Listado 14. Suscripcin a un evento
this.presenter.Hello2Command.
Execute(txtData.Text);
Listado 17: Invocando el comando expuesto
por el presentador
this.evtA g.GetEvent<HelloEvent>().Publish(Evento lanzado a las: +
DateTime.Now.ToString(dd/mm/ss));
Listado 15. Publicacin de un evento
<UserControl x:Class=HelloPrism.HelloView2
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml>
<Grid>
<Border BorderBrush=Black BorderThickness=3>
<StackPanel Orientation=Vertical>
<Label>Lanzador de comandos</Label>
<TextBox x:Name=txtData></TextBox>
<Button Click=Button_Click>Lanzar!</Button>
</StackPanel>
</Border>
</Grid>
</UserControl>
Listado 16. Cdigo XAML de HelloView2
dnm.plataforma.net
<<
d
o
t
N
e
t
M
a
n

a
<
<
30
gateCommand<string>, pasndole como
parmetro un delegado con la accin a
realizar cuando se invoque el comando.
Dicho delegado acepta un parmetro,
cuyo tipo depende del tipo genrico. En
este caso, dado que tenemos un Delega-
teCommand<string>, el delegado espera
una cadena.
Para que todo nos funcione, ya solo
nos quedan dos detalles: en el mdulo
(HelloModule) aadir el mapeo de IHe-
lloPresenter2 a Unity, y crear una o
varias vistas de tipo HelloView2 y aa-
dirlas a la regin PRISM. Con esto, aca-
bamos de crear un comando local, que
nos permite una comunicacin entre la
vista (HelloView2) y su presentador de
una forma totalmente desacoplada.
Veamos ahora cmo podramos cre-
ar un comando global, que fuese invo-
cado por varias vistas distintas. Habi-
tualmente, los comandos globales se
exponen como miembros estticos, de
una clase generalmente esttica (listado
19). Suelen ser de tipo CompositeCommand,
que como su nombre indica es un coman-
do compuesto de otros comandos.
Observe que al comando global no
le pasamos ningn delegado, como en
el caso de DelegateCommand<T>. En su
lugar, rellenaremos este comando con
otros comandos. Por ejemplo, vamos a
hacer que desde la vista original que
tenamos (HelloView) podamos invocar
al comando Hello2Command que defina
el presentador HelloPresenter2.
Para ello, simplemente en el cons-
tructor de HelloPresenter2 tenemos
que aadir al comando compuesto
MyGlobalCommand el propio comando
Hello2Command, mediante el mtodo
RegisterCommand (listado 20). Y enton-
ces ya podramos, por ejemplo, aadir
un botn a la vista HelloView original
y asociarle un mtodo para gestionar
los clics sobre ese botn que tenga el
cdigo del listado 21.
Ms simple imposible! Cuando se
pulse el nuevo botn de HelloView, se
ejecutar el comando global. Fjese que,
dado que cada HelloPresenter2 aade su
propio comando Hello2Command al
comando global, si se aaden varias
HelloView2 a la regin PRISM, como
cada una tiene su propio presentador, al
invocar el comando global se ver ms
de un cuadro de mensaje.
Por ltimo, recuerde que los coman-
dos PRISM implementan la interfaz
ICommand. Esto significa que se pueden
asignar directamente desde XAML! Si
tomamos de nuevo la vista HelloView y
eliminamos el evento Click del nuevo
botn que hemos creado, y en su lugar
aadimos el atributo Command al cdigo
XAML del botn para que quede como
se muestra en el listado 22, el efecto ser
exactamente el mismo que antes.
Y ahora qu?
Con esto se termina este artculo, en el
que hemos explorado un poco los patro-
nes utilizados para crear aplicaciones com-
puestas y cmo implementarlos en WPF
utilizando PRISM. Si le interesa el tema
y quiere profundizar en l, la mejor mane-
ra es descargar el cdigo fuente, la docu-
mentacin y los ejemplos de PRISM, des-
de su sitio oficial [2]. El paquete incluye
una implementacin completa de una
aplicacin de ejemplo, as como varios
ejemplos detallados de cada uno de los
patrones que aqu hemos enumerado.
Referencias
Fowler, Martin.
Separated Presentation. En
http://martinfowler.com/eaaDev/Sepa-
ratedPresentation.html, junio de 2006.
Composite Application Guide for WPF
and Silverlight. En http://www.code-
plex.com/CompositeWPF.
[1]
[2]
public interface IHelloPresenter2
{
DelegateCommand<string>
Hello2Command { get; }
}
public class HelloPresenter2 :
IHelloPresenter2
{
public DelegateCommand<string>
Hello2Command
{
get; private set;
}
public HelloPresenter2()
{
Hello2Command =
new DelegateCommand<string> (
x => MessageBox.
Show(x+!));
}
}
Listado 18. Interfaz y clase del presentador
public static class HelloCommands
{
public static CompositeCommand
MyGlobalCommand =
new CompositeCommand();
}
Listado 19. Declaracin de un comando
global
HelloCommands.MyGlobalCommand.
RegisterCommand(this.Hello2Command);
Listado 20. Agregando comando al comando
global
<Button Grid.Row=3
Command={x:Static
local:HelloCommands.MyGlobalCommand}>
Lanzar comando global
</Button>
Listado 22. Usando el atributo Command
HelloCommands.MyGlobalCommand.
Execute(Comando global);
Listado 21. Ejecutando el comando global
d
o
t
N
e
t
M
a
n

a
<
<
33
En este artculo vamos a explicar un escenario no
demasiado tpico, pero que viene repitindose cada
poco tiempo en los foros pblicos, y con el que el
autor se ha encontrado, tambin frecuentemente,
a ambos lados de la situacin: tanto creando el
escenario como usndolo.
A casi cualquier programador le habrn sumi-
nistrado una DLL, realizada generalmente en C
o C++, para ser utilizada desde un lenguaje .NET.
El ejemplo tpico es el de aquellas funciones de
Win32/Win64 que no tienen contrapartida den-
tro de la biblioteca .NET; pero tambin puede
ocurrir que nos suministren bibliotecas de terce-
ros en formato DLL, y en este ltimo caso la situa-
cin se presenta algo ms difcil ya que, si bien
sabemos fehacientemente que las funciones Win32
deben funcionar, no podemos estar tan seguros de
lo que nos han dado.
Vamos, pues, a presentar una DLL realizada
en C++ con una interfaz pblica en C, que suele
ser lo habitual. Aunque se suministra el cdigo
fuente de la misma, no vamos a entrar en ningn
detalle sobre su implementacin; la trataremos
como una caja negra, y solo hablaremos de su par-
te pblica, ya que ser lo que vamos a enlazar. El
siguiente paso consistir en crear un ensamblado
en C# que har de interfaz entre la DLL nativa y
los programas que se vayan a realizar con ella, de
lo que presentaremos un ejemplo. De este modo,
solo tendremos que hacer lo difcil una vez, y
podremos usar el conjunto de ambas DLL cuan-
do queramos. Y luego construiremos otro ensam-
blado, esta vez en C++/CLI, para mostrar cmo
envolver de forma avanzada una biblioteca exis-
tente mediante un ensamblado en modo mixto,
demostrando as una de las principales utilidades
de C++/CLI dentro del universo .NET. Asimis-
mo, veremos algunos otros temas relacionados con
la interoperabilidad que no estn correctamente
documentados o cuya documentacin es insufi-
ciente.
Para poder aprovechar el ejemplo, el lector
debe tener instalada al menos la versin Estndar
de Visual Studio 2008 con soporte para C++, para
as poder compilar y meterse dentro del cdigo en
C++ a travs del depurador de Visual Studio. No
obstante, no es imprescindible hacerlo, aunque s
recomendable.
La DLL nativa
No vamos a complicarnos mucho la vida con este
programa, que ser un ejemplo totalmente artificial,
Interop en C# y C++/CLI
Dos puntos de vista de un mismo concepto
plataforma.net
Rafael Ontivero tiene
ms de 20 aos de expe-
riencia como programa-
dor en mltiples lengua-
jes y entornos y como
responsable de equipos
de desarrollo. Actualmen-
te es director tcnico
para Espaa de la multi-
nacional Suzo STC.
La interoperacin entre cdigo manejado y no manejado es una de las
tareas que se presentan frecuentemente a cualquier programador .NET.
Aqu se describen detalladamente dos enfoques diferentes: el primero,
haciendo uso de los recursos que ofrecen para ello C# y .NET; el segun-
do, utilizando C++/CLI, una extensin de C++ diseada con la intero-
perabilidad como uno de sus objetivos centrales.
Rafael Ontivero
d
o
t
N
e
t
M
a
n

a
<
<
34
dnm.plataforma.net
<<
pero que sin embargo contemplar las
acciones ms comunes dentro de la inte-
roperabilidad entre cdigo nativo y
manejado.
Ya que los tipos bsicos se traducen
directamente, es decir, existe una
correspondencia directa entre, por
poner un ejemplo, un bool nativo y un
bool manejado, y lo mismo ocurre con
los enteros y otros, nuestra biblioteca
no va a utilizar directamente ninguno
de ellos. En su lugar, vamos a emplear
una estructura que contendr dos valo-
res numricos para representar un
nmero complejo y una cadena termi-
nada en cero, algo muy tpico de Win32
y C; tambin emplearemos una enu-
meracin y dos funciones de respuesta
(callbacks). La tarea de la DLL nativa
ser la de realizar un clculo sobre dicho
nmero complejo y avisarnos de su fina-
lizacin mediante uno de los callbacks,
que nos devolver el clculo en forma-
to numrico y en cadena de texto
mediante la estructura citada. El segun-
do callback se utilizar para avisarnos si
se produce una condicin de error, y la
enumeracin contendr el cdigo del
error ocurrido. El ejemplo es suma-
mente artificial, pero resulta fcil de
implementar y cubre todas las carac-
tersticas que queremos demostrar.
El listado 1 expone la API pblica
de la DLL. El cdigo representa un
ejemplo tpico de cmo se implemen-
ta una DLL nativa y se expone su inter-
faz a otros lenguajes o aplicaciones.
Dada la similitud con C#, no vamos a
explicar nada sobre la misma, ya que los
comentarios son suficientes.
Antes de comenzar a explicar cmo
realizar el cdigo, debemos centrarnos
en algunos detalles previos que no se
encuentran debidamente documentados.
El tema de las arquitecturas
Un ensamblado .NET puede estar
compilado bajo tres arquitecturas dife-
rentes: x86, x64 y AnyCPU
1
. Si com-
pilamos un ensamblado con la arqui-
tectura x86, se ejecutar en cualquier
Windows de 32 bits, y tambin en los
de 64 bits, pero siempre como cdigo
de 32 bits. Si lo hacemos con x64, dicho
ensamblado slo podr ejecutarse bajo
Windows de 64 bits, generando una
excepcin en los de 32. Por otra parte,
la arquitectura AnyCPU es ms poten-
te: permite ejecutar un ensamblado en
su arquitectura nativa, es decir, como
cdigo de 32 bits en un Windows de 32
bits, y como cdigo de 64 bits en un
/***
* Estamos definiendo una estructura que representa a un nmero complejo
*/
typedef struct
{
double real; // Parte real
double imag; // Parte imaginaria
TCHA R *szFormateado; // Puntero a una cadena terminada en cero
} tagComplejo;
/****
* A qu definimos los posibles errores que se pueden producir al trabajar
* con nmeros complejos.
*/
typedef enum
{
ComplejoErrorNoError = 0, // No es un error
ComplejoErrorDivCero, // Se produjo una divisin por cero
ComplejoErrorOtro=-1, // Otro error
} enuError;
/****
* Estas dos definiciones nos ayudan a mantener el cdigo claro. Definen
* dos punteros a funcin y simplifican el prototipado de otras funciones.
*/
// Puntero a funcin que recibe una estructura del tipo tagComplejo
typedef void (__stdcall* fncComplejoCalculado)(tagComplejo);
// Puntero a funcin que recibe una estructura y una enumeracin.
// Si se retorna false, la DLL forzar el cierre de la aplicacin
typedef bool (* fncComplejoError)(tagComplejo,enuError);
// Instala los callbacks en la DLL para luego poder llamar
extern C DLLNA TIVA _A PI void ComplejoInstalaCallbacks(
fncComplejoCalculado pfncCalculado,fncComplejoError pfncError);
// Calcula el inverso de dos complejos
extern C DLLNA TIVA _A PI void ComplejoInverso(
tagComplejo c1,tagComplejo c2);
// Devuelve una cadena con el complejo en forma polar
extern C DLLNA TIVA _A PI int ComplejoPolar(tagComplejo,TCHA R *szPolar);
Listado 1. El fichero de cabecera de la DLL nativa
1
Realmente existe una arquitectura ms, Itanium, pero no vamos a hablar de ella aqu por el poco uso que tiene. Sin embargo, todo lo visto aqu
es perfectamente vlido tambin para ella.
d
o
t
N
e
t
M
a
n

a
<
<
35
dnm.plataforma.net
<<
Windows de 64 bits. De todas formas,
estas consideraciones son tericas, ya
que por desgracia una misma aplicacin
funciona diferente segn en qu arqui-
tectura se haya compilado, llegando
hasta el punto de funcionar mal aunque
el cdigo sea el mismo y est correcto.
Cuando nuestra aplicacin es .NET
pura no hay problemas, pero cuando tie-
ne ensamblados mixtos, es necesario ser
extremadamente cauteloso con las arqui-
tecturas. Imaginemos que tenemos una
DLL nativa de 32 bits (nuestro caso), y
que nuestra aplicacin .NET que la uti-
liza ha sido compilada bajo x64: la ejecu-
temos donde la ejecutemos, generar una
excepcin en tiempo de ejecucin, ya que
espera una DLL nativa de 64 bits. Aho-
ra compilemos nuestro programa .NET
bajo AnyCPU. En este caso, la aplicacin
funcionar cuando la ejecutemos en un
Windows de 32 bits, pero fallar estrepi-
tosamente cuando lo hagamos sobre uno
de 64 bits. El motivo es muy sencillo: el
ensamblado .NET se ejecutar en un
entorno de 64 bits y llamar a una DLL
nativa que espera que sea tambin de 64
bits. Como sta es de 32, lanzar una
excepcin. Finalmente, bajo un Windows
de 32 bits, la aplicacin se ejecutar como
una aplicacin de 32 bits y cargar de for-
ma satisfactoria la DLL.
El lector puede preguntarse qu
ocurre cuando un ensamblado carga
mediante Interop una DLL de Win-
dows en segn qu arquitectura. Si la
aplicacin est compilada mediante
AnyCPU, cargar las DLL correspon-
dientes y correctas de cada sistema y con
la anchura de bits correspondiente (32
64 bits), ya que el sistema tiene ambas
versiones y sabe qu hacer en el caso de
sus propias DLL. Pero si dicha aplica-
cin est compilada mediante x86 y se
ejecuta en un Windows de 64 bits, car-
gar entonces las DLL de 32 bits y se
ejecutar como una aplicacin de 32 bits
bajo la capa de SysWow64.
Debemos, pues, tener en cuenta estas
consideraciones a la hora de hacer un
ensamblado mixto que use DLL nativas.
Es decir, si estamos importando una DLL
de 32 bits, nuestro programa deber estar
compilado bajo x86, y si estamos impor-
tando una DLL de 64 bits, deberemos
hacerlo bajo x64. El modo AnyCPU slo
debe utilizarse cuando dispongamos de
un instalador que nos coloque la DLL
nativa correcta segn cul sea el sistema
operativo en el que estemos ejecutando
2
.
Evidentemente, en este caso perdemos la
posibilidad de ejecutar nuestra aplicacin
como aplicacin de 32 bits dentro de un
sistema de 64.
Las rutas de los proyectos y el
cdigo mixto
Otro elemento a tener en cuenta a la
hora de crear un proyecto mixto son las
rutas de los ficheros intermedios que
Visual Studio asigna por defecto. Cuan-
do uno crea un proyecto nativo en una
solucin, Visual Studio coloca los eje-
cutables en una subcarpeta dentro de la
misma carpeta que el proyecto; pero
cuando se aade uno ms (nativo), el
entorno mueve la carpeta de los fiche-
ros finales a una ruta que cuelga direc-
tamente de la carpeta en donde est la
solucin, uniendo todos los ficheros
finales en un mismo lugar, ya que se
sobreentiende que una solucin multi-
proyecto ha de disponer todos los eje-
cutables y DLL en un mismo lugar.
Desafortunadamente, el IDE se
comporta de forma diferente cuando se
trata de proyectos manejados: cada uno
de ellos tiene su carpeta final dentro de
la del proyecto, y la solucin adoptada
es que cuando se aade una referencia
a un proyecto desde otro, el IDE copia
la dependencia entre carpetas, llenan-
do de ficheros repetidos toda la solu-
cin (y si encima estos ficheros son
grandes, se aade ms sobrecarga al
proceso de generacin de binarios).
Por ello tambin es necesario, o
mejor dicho, recomendable, cambiar la
ruta final de los ensamblados .NET a la
misma carpeta que los nativos. Para ello
nos vamos a las opciones de nuestro pro-
yecto .NET, y en la pestaa Build, cam-
biamos la ruta de Output Path por la
deseada, como se muestra en la figura 1.
Otro aspecto interesante es la posi-
bilidad de bucear dentro del cdigo
fuente nativo (si lo tenemos) desde un
programa .NET, para ver cmo fun-
ciona nuestra aplicacin y observar
potenciales problemas con Interop. En
un proyecto C#, debemos marcar la
casilla Enable unmanaged code debug-
ging dentro de la pestaa Debug
(figura 2).
2
Y no debemos olvidarnos de ejecutar pruebas en todos los escenarios posibles, ya que como hemos dicho ms arriba, las compilaciones AnyCPU
no siempre funcionan como esperamos que lo hagan.
Figura 1. Estableciendo el directorio
de salida
Figura 2. Activando la depuracin de
cdigo no manejado
d
o
t
N
e
t
M
a
n

a
<
<
36
dnm.plataforma.net
<<
El lector puede comprobar cmo el
autor ha configurado todo esto en los
lugares citados de la solucin de ejem-
plo
3
. Adems, podr observar que la
solucin tiene nada ms y nada menos
que cinco proyectos. DLLnativa es la pro-
pia DLL nativa del ejemplo, la base de
todo lo que estamos viendo. Luego
tenemos el proyecto test_nativa, que
es un ejecutable nativo de consola que
verifica el funcionamiento de la DLL.
WrapDLL_CS es el ensamblado que envuel-
ve a la DLL nativa, desarrollado en C#
mediante Interop por atributos, mien-
tras que UseDLL_CS es el programa rea-
lizado en C# que utiliza el ensamblado
WrapDLL_CS. WrapDLL_CPP es el ensambla-
do en modo mixto realizado en
C++/CLI que envuelve, de nuevo, a
DLLnativa, y que nos servir para deta-
llar las diferencias entre ste y el envol-
torio realizado en C#. Finalmente,
UseDLL_CPP, en contra de lo que su nom-
bre indica, es el mismo proyecto que
UseDLL_CS (escrito en C#), pero que en
este caso usa el ensamblado realizado
en C++/CLI.
Opciones comunes para la
importacin de DLL
Antes de entrar en los ejemplos, debe-
mos dar una serie de indicaciones gene-
rales sobre el concepto de interopera-
cin con cdigo nativo desde C#.
Una firma de importacin tpica es
la que se detalla a continuacin:
La lnea entre corchetes indica que
estamos especificando algn tipo de
atributo para el elemento que se defi-
ne en la siguiente lnea. En nuestro
caso, le estamos diciendo al compila-
dor que el mtodo de abajo procede de
una importacin desde una DLL lla-
mada DLLnativa.DLL. Este atributo posee
ms parmetros, como se ver ms ade-
lante (y no los explicaremos todos).
Luego viene la firma de la funcin
propiamente dicha, que debe ser decla-
rada externa y esttica. El declararla
pblica solo depender de si queremos
que sea visible desde fuera de nuestro
ensamblado (en general, se aplican las
reglas de visibilidad normales de C#).
A partir de este momento, ya pode-
mos usar dicha funcin como si se tra-
tara de una escrita en C#, con la salve-
dad, claro est, de que se trata de una
llamada a algo externo a nuestro cdi-
go y debemos seguir ciertas reglas.
Tampoco debemos esperar un rendi-
miento extraordinario en la llamada al
mtodo, sobre todo si pasamos datos
de gran tamao, ya que el motor de
tiempo de ejecucin tendr que copiar
varias veces dichos datos entre la parte
nativa y manejada. Si el lector quiere
maximizar el rendimiento, no le queda
otra opcin que utilizar C++/CLI en
modo mixto y ser cuidadoso en cmo
realiza las llamadas.
Estructuras y enumeraciones
Equiparar estructuras nativas y maneja-
das es relativamente fcil mientras no
intervengan algunos aspectos oscuros,
como punteros a void, cadenas termina-
das en cero y cosas as. En nuestro caso,
la estructura tagComplejo contiene dos
valores en coma flotante y un puntero a
cadena terminada en cero. De momen-
to, no vamos a entrar en este ltimo valor
y lo vamos a definir como un IntPtr, es
decir, como un tipo destinado a repre-
sentar un puntero o un handle.
La primera duda que nos surge es
si las estructuras de C# son equivalen-
tes directamente a las de C/C++. Aun-
que en principio es as, debemos tener
en cuenta que es necesario mapear los
tipos .NET con los nativos, de mane-
ra que la disposicin binaria de ambas
estructuras sea la misma.
Las enumeraciones (que en .NET
son tipos completos, mientras que en
C/C++ son constantes sustituidas por
su valor numrico) tambin son muy
fciles de convertir, ya que tan solo ten-
dremos que copiar sus valores a nues-
tro cdigo envolvente. Lo nico que
tenemos que tener en cuenta es que
debemos conservar los valores num-
ricos adecuados, lo que en general no
suele ser difcil. En nuestro caso, la con-
versin es trivial:
Punteros a cadenas
terminadas en cero
Vamos a comenzar con la parte ms sen-
cilla de todas, y tambin bastante tpi-
ca dentro del mundo Win32/Win64.
La funcin nativa ComplejoPolar recibe
dos parmetros: un nmero complejo
segn la estructura anteriormente cita-
da y una cadena terminada en cero, que
la funcin deber rellenar con el nme-
ro equivalente expresado en notacin
de coordenadas polares. El valor devuel-
to es el nmero de bytes asignados en
la cadena.
3
No obstante, dependiendo de la configuracin del lector, quizs estos parmetros hayan desaparecido y tengan que ser introducidos de nuevo a
mano. Recurdese, pues, que si su proyecto le da una excepcin de fichero no encontrado, lo ms probable es que las rutas hayan vuelto a sus
valores por defecto.
[DllImport(DLLnativa.dll)]
public static extern int ComplejoPolar(NumeroComplejo c, IntPtr cadena);
public enum ComplejoError
{
// No es un error.
ComplejoErrorNoError = 0,
// Se produjo una divisin
// por cero
ComplejoErrorDivCero,
// Otro error
ComplejoErrorOtro = -1,
}
d
o
t
N
e
t
M
a
n

a
<
<
37
dnm.plataforma.net
<<
En Win32 es habitual la existencia
de funciones que han de devolver o
rellenar cadenas terminadas en cero de
longitud variable y desconocida hasta
el momento de su ejecucin. El segun-
do parmetro de nuestra funcin Com-
plejoPolar funciona de esta forma. Es
decir, primero debemos hacer una lla-
mada pasando un valor nulo, para que
la funcin evale su funcionamiento y
nos devuelva el tamao de la cadena
asignada y, una vez conozcamos cun-
tos bytes son necesarios, volvemos a
realizar la llamada, pasndole esta vez
una cadena del tamao adecuado.
El primer paso consiste en impor-
tar el mtodo dentro del ensamblado
de envoltorio que va a hacer de puen-
te entre nuestra DLL nativa y el resto
de cdigo en C#. El prototipo median-
te interoperacin por atributos es:
Podemos observar dos parmetros
interesantes que acompaan la defini-
cin del atributo. Con la parte CharSet
= CharSet.Unicode, le estamos indican-
do al compilador que la DLL nativa ha
sido compilada mediante Unicode, por
lo que nuestras cadenas van a ser de ese
tipo, en oposicin a CharSet.A nsi, que
indicara que el tipo de la cadena sera
char en lugar de wchar_t. El efecto ms
comn si nos equivocamos de codifica-
cin sera recibir un resultado incohe-
rente o que se dispare una excepcin
por desbordamiento de bfer.
El siguiente parmetro representa
el convenio de llamada, no menos
importante que lo anterior. Cuando lla-
mamos a un mtodo o a una funcin,
el compilador ha de saber qu hacer con
los parmetros pasados y devueltos; esto
tiene lugar en la pila local del progra-
ma, y dependiendo del convenio de lla-
mada, ser tarea del mtodo llamante
o del llamado recuperar los parmetros
pasados y el valor devuelto, de tal for-
ma que, ante un error al especificar
correctamente dicho convenio, termi-
naramos con una cada total del pro-
grama.
Estos dos detalles son muy impor-
tantes a la hora de envolver una DLL:
en qu formato estn las cadenas de
texto y el convenio de llamada. Es algo
que quien haya creado la citada DLL
debe indicarnos, o no seremos capa-
ces de envolverla adecuadamente (o
tendremos que hacer complicadas
pruebas).
Una vez realizada la importacin
del mtodo nativo, creamos un mto-
do esttico en la DLL envolvente para
hacer la llamada:
Podemos observar aqu cmo lla-
mamos en primer lugar a ComplejoPolar
pasndole un valor nulo al parmetro
de cadena para que la funcin calcule el
tamao de la cadena, que asignamos a
size. Y luego creamos un objeto del tipo
StringBuilder y reservamos el tamao
adecuado, para que la siguiente llama-
da a ComplejoPolar nos almacene en
dicho objeto la cadena nativa.
Aqu la magia est en la clase String-
Builder y la interoperabilidad median-
te atributos. Lo destacable en nuestro
caso es que hemos forzado a que la cla-
se tenga ya pre-asignado un tamao
para el bfer en el que se va a guardar
la cadena. Lo dems corre por cuenta
del motor de tiempo de ejecucin de
.NET Framework.
No obstante, conviene detenernos
un momento en la asignacin del
[DllImport(DLLnativa.dll,
CharSet = CharSet.Unicode,
CallingConvention =
CallingConvention.StdCall)]
public static extern int
ComplejoPolar(NumeroComplejo c,
StringBuilder cadena);
public static string Complejo2Polar(NumeroComplejo c)
{
int size = ComplejoPolar(c,null);
StringBuilder cadena = new StringBuilder(size * sizeof(char));
ComplejoPolar(c,cadena);
return cadena.ToString();
}
Convenio Explicacin
StdCall El mtodo llamado limpia la pila al finalizar. Es el convenio
estndar y debe estar disponible para todos los compiladores de
cualquier lenguaje (.NET o no .NET)
FastCall Algunos parmetros se pasan en registros del procesador. Este con-
venio no est soportado por .NET Framework. Si nuestra DLL usa
esta forma, no podremos usarla directamente desde .NET y C#.
Cdecl El llamante limpia la pila. Es el convenio estndar de C.
ThisCall El primer parmetro es this, que se guarda en el registro ECX del
procesador, y los dems se colocan en la pila. Para importar clases
dentro de DLL compatibles (las de C++ no lo son).
Winapi No es un convenio de llamada propiamente dicho, pero se utiliza
cuando se van a llamar funciones de Win32 multiplataforma (es
decir, es el compilador de C# el que decide el convenio en base a
si se est en Windows, Windows CE, etc.).
Tabla 1. Convenios de llamada.
d
o
t
N
e
t
M
a
n

a
<
<
38
dnm.plataforma.net
<<
tamao: por qu size * sizeof(char)
y no simplemente size? Bien, la fun-
cin nativa devuelve el nmero de
caracteres, pero tambin necesitamos
cuntos bytes ocupa cada uno de esos
caracteres. En .NET, que utiliza Uni-
code, cada carcter nos ocupar 2
bytes. Si nuestro mtodo nativo
devolviera la cadena formateada en
ANSI, el motor de .NET se encar-
gara de hacer la conversin a Uni-
code. Como nuestra funcin escrita
en C devuelve una cadena Unicode
(una cadena del tipo wchar_t), .NET
sabe qu hacer; pero en cualquier caso
tenemos que reservar correctamente
el espacio de memoria.
Observe el lector cmo hemos trans-
formado la recepcin de un puntero en
los parmetros de una llamada a funcin
a un retorno de cadena en .NET.
El ltimo paso consiste en hacer una
llamada desde nuestra aplicacin al
ensamblado envolvente:
Callbacks y delegados
Otro de los puntos calientes de la inte-
roperabilidad son las funciones callback,
cuya evolucin natural en .NET son los
delegados. Windows utiliza las tambin
llamadas funciones de respuesta o de
retro-llamada ampliamente; de hecho,
la vida de cualquier aplicacin (incluso
aquellas que son .NET puras), depen-
de ntimamente de ello, ya que el bucle
principal de mensajes no es otra cosa
que un callback que es llamado por Win-
dows cada vez que se produce un men-
saje destinado a la citada aplicacin.
En general los callbacks se utilizan
en el mismo contexto que los delega-
dos: una vez instalada nuestra funcin,
Windows (en este caso el cdigo de
nuestra DLL nativa) la ejecutar cada
vez que sea necesario para informarnos
o esperar alguna accin por parte de
dicha funcin.
Existe una correspondencia directa
entre los delegados y los callbacks nativos,
de modo que en C# no es necesario indi-
car nada especial. Sin embargo, siempre
hay que tener en cuenta el convenio de
llamada y el paso de argumentos.
Otro detalle muy importante tiene
que ver con el recolector de basura de
.NET, que nada quiere saber del mun-
do nativo; por lo que si pasamos un dele-
gado como callback y luego salimos de
mbito o dejamos de usarlo, puede que
sea eliminado y cuando el cdigo nati-
vo haga la llamada, intentar ejecutar
algo que ya no est ah. El problema no
ser que se nos lance una excepcin; el
problema radicar en que habremos
machacado algo importante y nuestra
aplicacin debera terminar inmediata-
mente. Para evitar esto all donde pue-
da producirse, una sentencia como la
siguiente nos evitar el problema:
En principio, mapear un delegado
sobre un callback es tan trivial como
definir el delegado con la firma ade-
cuada. En nuestro caso, la funcin que
actuar de retro-llamada para infor-
marnos de que se ha calculado un
nmero complejo recibe una estructu-
ra de nmero complejo como nico
parmetro:
Por tanto, nuestro delegado es tan
sencillo como:
Si nos fijamos, el desarrollador de C,
sabiendo que su DLL iba a ser utilizada
por otros lenguajes de programacin, se
ha preocupado de que el protocolo de lla-
mada sea __stdcall, por lo que no es
necesario hacer nada ms. Sin embargo,
en el callback que se ejecutar cuando se
produzca una condicin de error no ha
sido tan cuidadoso, y ha dejado el proto-
colo estndar de C, __cdecl, al omitirlo
en la declaracin:
Aqu tenemos, pues, que indicar un
atributo especial a la hora de definir en
C# el delegado que har la equivalencia:
Adems, debido a ciertos problemas
de compatibilidad hacia atrs con el tipo
lgico en C y en Win32, tambin tene-
mos que cambiar el atributo de retorno
para que se mapee con el tipo correcto,
ya que por defecto un bool en .NET se
representa sobre 32 bits y en C, sobre 8.
Si no indicramos esto, el mtodo recep-
tor siempre recibira true como valor de
retorno.
string polar =
Complejo.Complejo2Polar(c);
GC.KeepA live(<delegado>);
typedef bool (* fncComplejoError)
(tagComplejo,enuError);
[UnmanagedFunctionPointer(
CallingConvention.Cdecl)]
[return:
MarshalA s(UnmanagedType.I1)]
public delegate bool
ComplejoErrorDelegate(
NumeroComplejo c, ComplejoError e);
typedef void (__stdcall*
fncComplejoCalculado)(tagComplejo);
public delegate void
ComplejoCalculadoDelegate(
NumeroComplejo c);
Otro de los puntos
calientes de la
interoperabilidad son las
funciones callback, cuya
evolucin natural en .NET
son los delegados
d
o
t
N
e
t
M
a
n

a
<
<
39
dnm.plataforma.net
<<
Una vez que tenemos las firmas de
los delegados que actuarn como call-
backs, tan solo nos queda mapear los
mtodos que van a envolver a la fun-
cin nativa que va a instalarlos, as como
a la que nos va a calcular el inverso de
dos nmeros complejos utilizando
dichos callbacks:
Esto es todo, en lo que respecta a
la parte del ensamblado que envuelve
a la DLL nativa. En el ejemplo de uso
con C#, primero declaramos una clase
que llamaremos Test y que implemen-
ta dos juegos de delegados: uno estti-
co y otro de instancia. Si el lector quie-
re ver cmo la DLL termina la ejecu-
cin, tan slo debe cambiar el valor de
retorno en cualquier delegado de error.
Finalmente, en Main primero hacemos
una llamada con los delegados estti-
cos y luego con los de instancia.
El listado 2 nos muestra el ejemplo
completo visto hasta aqu. Lo ideal es
que el lector descargue el cdigo fuente
de la Web de la revista, ponga puntos de
interrupcin y vea cmo acta todo en
secuencia. Si quiere navegar dentro del
cdigo nativo, no debe olvidar activar la
casilla Enable unmanaged code debug-
ging en la pestaa Debug de las opcio-
nes de los dos proyectos escritos en C#.
Y ahora, en C++/CLI
Vamos ahora a cambiar un poco el
chip y ver lo mismo, pero desde el
[DllImport(DLLnativa.dll,
CharSet = CharSet.Unicode,
CallingConvention=CallingConvention.
Cdecl)]
public static extern void
ComplejoInstalaCallbacks(
ComplejoCalculadoDelegate
callbackCalculado,
ComplejoErrorDelegate
callbackError);
[DllImport(DLLnativa.dll)]
public static extern void
ComplejoInverso(NumeroComplejo c1,
NumeroComplejo c2);
class Test
{
public static void ComplejoCalculadoStatic(NumeroComplejo c)
{
Console.WriteLine(En ComplejoCalculadoStatic: {0} {1},
c.Real, c.Imag);
}
public static bool ComplejoErrorStatic(NumeroComplejo c,
ComplejoError e)
{
Console.WriteLine(En ComplejoErrorStatic Error {0} en {1} {2},
e.ToString(), c.Real, c.Imag);
return true;
}
public void ComplejoCalculado(NumeroComplejo c)
{
Console.WriteLine(En ComplejoCalculadoStatic: {0} {1},
c.Real, c.Imag);
}
public bool ComplejoError(NumeroComplejo c,ComplejoError e)
{
Console.WriteLine(En ComplejoErrorStatic Error {0} en {1} {2},
e.ToString(), c.Real, c.Imag);
return true;
}
}
class Program
{
static void Main(string[] args)
{
// Definimos un nmero complejo arbitrario
NumeroComplejo c;
c.Real = 3;
c.Imag = 3;
// Un nmero complejo que nos dar error al calcular su inverso
NumeroComplejo cError;
cError.Real = 0;
cError.Imag = 0;
// Pasamos un nmero complejo en forma paramtrica a forma polar
string polar = Complejo.Complejo2Polar(c);
Console.WriteLine(polar);
// Mostramos aqu cmo asignar un delegado esttico
Complejo.ComplejoErrorDelegate errorDlg = Test.ComplejoErrorStatic;
// GC.KeepA live(errorDlg); // Esto no suele ser necesario.
// A qu hacemos la llamada para instalar los delegados
// procedentes de mtodos estticos.
// El primer parmetro se pasa directamente, y dejamos a C#
// y a .NET que hagan todo el trabajo.
// El segundo adopta una forma ms convencional
Complejo.ComplejoInstalaCallbacks(Test.ComplejoCalculadoStatic, errorDlg);
d
o
t
N
e
t
M
a
n

a
<
<
40
dnm.plataforma.net
<<
punto de vista de C++/CLI como len-
guaje destinado a la interoperabilidad
entre cdigo nativo y manejado. El
proyecto que prueba el nuevo ensam-
blado mixto realizado en C++/CLI se
llama UseDLL_CPP y, pese a su nombre,
es exactamente el mismo cdigo fuen-
te que el anterior, UseDLL_CS. nica-
mente hemos cambiado el nombre
para que sean diferentes, ya que aho-
ra estamos enlazando con el ensam-
blado WrapDLL_CPP en lugar de
WrapDLL_CS.
Lo que s es completamente dife-
rente es el cdigo dentro de WrapDLL_CPP,
que est escrito en cdigo mixto
C++/CLI y C++. Como concesin al
lector (y al propio Visual Studio),
hemos construido todo el cdigo fuen-
te dentro del fichero de cabecera en la
declaracin de la clase, en lugar de par-
tir la declaracin en dos, las declara-
ciones por un lado (en el .h) y el cdi-
go por el otro (en el .cpp), lo que sera
lo ms lgico dentro del paradigma de
C/C++.
El primer detalle a resaltar es la for-
ma de declarar la estructura NumeroCom-
plejo mediante la palabra reservada
doble value struct. Con esto estamos
dicindole al compilador que nuestra
estructura es una estructura normal de
.NET
4
. Por lo dems, todo queda igual,
ya que necesitamos ser compatibles con
C#. Si no fuera as, podramos utilizar
la estructura nativa sin problema algu-
no dentro del cdigo .NET escrito en
C++/CLI. La enumeracin tampoco
tiene secreto alguno.
Luego declaramos una ref class (que
en general es 100% equivalente a una cla-
se .NET normal) que va a tener todos sus
miembros estticos para ser, de nuevo,
compatibles con la versin anterior del
ensamblado y tambin para simular que
estamos llamando a mtodos estticos
dentro de una DLL nativa.
En primer lugar, veamos el con-
vertidor a notacin polar. En aparien-
cia, el mtodo es algo ms complejo que
el del envoltorio de C#, ya que
C++/CLI no convierte directamente
estructuras manejadas en estructuras
nativas (al revs s), por lo que tenemos
que realizar una asignacin manual
(tambin podramos haber utilizado
Interop por atributos, pero queremos
mostrar aqu otras cosas):
Si en lugar de pasar la estructura por
valor lo hubiramos hecho por puntero
(o referencia, algo que C++ tambin
admite), podramos haber obtenido un
puntero nativo a un elemento maneja-
do pasado por referencia mediante el
mtodo Marshall::ToPointer. O tambin
podramos haber bloqueado el puntero
manejado mediante pin_ptr y haber
pasado la direccin de ese puntero blo-
queado al mtodo. Otra forma sera
mezclando ambos conceptos: obtener
un puntero a la estructura pasada, blo-
quearlo y luego de-referenciar dicho
puntero en el mtodo nativo
5
.
// Hacemos la llamada para calcular el inverso de dos nmeros
// complejos. El segundo disparar el delegado de error.
Complejo.ComplejoInverso(c, cError);
// Creamos un objeto de la clase Test para obtener
// mtodos no estticos
Test miTest = new Test();
// A signamos el mtodo no esttico de error.
errorDlg = miTest.ComplejoError;
// A qu hacemos la llamada a instalar los delegados
// procedentes de mtodos normales (no estticos).
// El primer parmetro se pasa directamente y dejamos a C#
// y a .NET que hagan todo el trabajo.
// El segundo adopta una forma ms convencional
Complejo.ComplejoInstalaCallbacks(miTest.ComplejoCalculado, errorDlg);
// Hacemos la llamada para calcular el inverso de dos nmeros
// complejos. El segundo disparar el delegado de error.
Complejo.ComplejoInverso(c, cError);
}
}
Listado 2. El ejemplo completo.
3
En oposicin a ref struct, que correspondera a una estructura que ira por defecto alojada en la pila, salindonos del estndar. Si tenemos en
cuenta que en .NET una estructura es un tipo completo con semntica de pila y que una clase tiene semntica de montculo, en C++/CLI, podemos
diferenciar entre semntica de pila o montculo y estructura o clase. Es decir, si declaramos una value class, a efectos de .NET estaremos declarando
una estructura con sus miembros privados por defecto, mientras que si declaramos una ref class, lo que hacemos es declarar una clase normal
(completamente equivalente a una clase de C#). Sin embargo, si declaramos una value struct, estaremos declarando la tpica estructura de C#, a la
vez que si utilizamos ref struct estaramos hacindonos con una clase de C# cuyos mtodos por defecto son todos pblicos.
5
Ciertamente, en C++/CLI las posibilidades para pasar del mundo manejado al nativo y viceversa son prcticamente infinitas.
tagComplejo cc = {c.Imag, c.Real};
d
o
t
N
e
t
M
a
n

a
<
<
41
dnm.plataforma.net
<<
Lo interesante aqu son las lneas:
Una vez que hemos obtenido el
tamao que vamos a necesitar (no se
muestra en las lneas de arriba), asig-
namos memoria nativa (recordando que
estamos dentro de un mtodo maneja-
do), volvemos a llamar al mtodo nati-
vo como si estuviramos en C++ en
lugar de en C++/CLI, y con el punte-
ro obtenido creamos una variable de
tipo String y la inicializamos a travs de
un puntero nativo (que copiar el bfer
nativo a uno manejado). Luego libera-
mos la memoria nativa y finalizamos.
Con este ejemplo, estamos viendo
cmo es posible mezclar de forma indis-
tinta cdigo manejado y nativo casi
como si no existiera diferencia entre
.NET y C++. No obstante, en C# tam-
bin podemos realizar casi la misma
construccin, pero ello nos forzara a
que todo nuestro cdigo estuviera mar-
cado como no seguro y no verificable.
Los delegados en C++/CLI se
declaran de la misma forma que en C#,
pero con la sintaxis del lenguaje. Obser-
ve cmo indicamos al compilador que
el delegado que se disparar en caso de
error usa el protocolo de llamada de C
en lugar del estndar (exactamente
igual que con C#. No se ha menciona-
do antes, pero con C++/CLI podemos
mezclar ambas formas de interopera-
cin: la IJW propia del lenguaje y la de
atributos estndar de .NET):
La funcin que instala las funcio-
nes de callback es bastante ms com-
pleja que en C#. Aunque podramos
haber utilizado la forma de C#, nos
interesa aqu hacerlo de esta otra
manera para poder explicar lo que
sigue. El cuerpo del mtodo est reco-
gido en el listado 3.
La parte comentada del mismo tie-
ne su explicacin. Fijar los delegados real-
mente no es necesario, ya que lo nico
de lo que debemos asegurarnos es que el
recolector no los libere de forma acci-
dental. Una forma es pinnear el delega-
do, como se muestra en la parte comen-
tada, algo que en este caso concreto no
sera til ya que, al estar en un mtodo
esttico, el bloqueo se liberar al termi-
nar la funcin. Ese bloque de cdigo
vendra bien si nuestra clase fuera una
clase normal y dichas lneas estuvieran
dentro de un mtodo de inicializacin,
por lo que el bloqueo permanecera
durante toda la vida de dicho objeto. Aqu
se pone simplemente como muestra.
La siguiente lnea s que es necesa-
ria, ya que asigna a un puntero nativo
llamado pCalculado la direccin del dele-
gado. El moldeo a fncComplejoCalcula-
do es obligatorio, ya que la llamada al
mtodo ToPointer de IntPtr devuelve
un puntero a void. Es uno de los casos
en que C++ necesita asegurarse de que
sabemos qu estamos haciendo. Quizs
el lector piense que, ya que el mtodo
GetFunctionPointerForDelegate tambin
est presente desde C#, esta construc-
cin podra haberse hecho desde dicho
lenguaje; pero esto no es del todo cier-
to, ya que desde C# no podemos obte-
ner directamente un puntero a funcin
nativa. Para hacerlo, sera necesario uti-
lizar un mtodo adaptador escrito en
C++/CLI (que, al final, es lo que esta-
mos haciendo).
La forma para el delegado de error
es idntica, pero se realiza en dos pasos
en lugar de uno.
TCHA R *pBuffer = new TCHA R[size];
::ComplejoPolar(cc, pBuffer);
String ^returnVal = gcnew
String(pBuffer);
delete[] pBuffer;
/*
* Esta funcin instala los callbacks que se ejecutarn cuando se est
* calculando el inverso de un nmero complejo
*/
static void ComplejoInstalaCallbacks(
ComplejoCalculadoDelegate ^callbackCalculado,
ComplejoErrorDelegate ^callbackError)
{
// No es necesario pinnear el delegado, pero podra ser til
// en alguna circunstancia.
// pin_ptr<ComplejoCalculadoDelegate ^>pinCalculado=&callbackCalculado;
// pin_ptr<ComplejoErrorDelegate ^>pinError=&callbackError;
// Esta forma obtiene el puntero a la funcin directamente
fncComplejoCalculado pCalculado = (fncComplejoCalculado)
Marshal::GetFunctionPointerForDelegate(callbackCalculado).ToPointer();
// Esta otra lo hace mediante un paso intermedio. A mbas son
// completamente equivalentes
IntPtr pError=Marshal::GetFunctionPointerForDelegate(callbackError);
// Hacemos la llamada a la funcin nativa de la DLL
::ComplejoInstalaCallbacks(pCalculado,
(fncComplejoError)pError.ToPointer());
}
[UnmanagedFunctionPointer(
CallingConvention::Cdecl)]
delegate bool ComplejoErrorDelegate(
NumeroComplejo c, ComplejoError e);
Listado 3. Instalando los callbacks
d
o
t
N
e
t
M
a
n

a
<
<
42
dnm.plataforma.net
<<
Es cierto que esta forma es bas-
tante ms compleja e indirecta que a
travs del Interop de atributos de C#,
pero lo interesante de este modo de
realizar las cosas es justamente el con-
trario: llamar a un mtodo callback
nativo desde cdigo manejado. O
dicho de otra forma: poder ejecutar
cdigo relativamente arbitrario den-
tro de .NET, incluso cdigo ensam-
blador, tal y como aparece en la pgi-
na 177 del libro de Nishant Sivaku-
mar [1]. El truco est en llamar a la
funcin inversa de GetFunctionPoin-
terForDelegate, GetDelegateForFunc-
tionPointer, que devuelve un delega-
do de .NET a partir de un puntero a
una funcin nativa:
Con el mtodo de arriba estamos
obteniendo un delegado que es un pun-
tero al mtodo nativo ComplejoInverso
y luego llamando a dicho delegado. El
ejemplo completo est en el cdigo
suministrado.
Ya slo nos queda comentar el
mtodo ComplejoInverso de nuestra
DLL, y como en este caso tenemos que
hacer dos conversiones de estructuras
manuales, lo dejamos igual al de C#; es
decir, usamos el clsico Interop por atri-
butos, ya que nada nos impide usarlo
tambin en C++/CLI.
Ms sobre Interop
Posiblemente el Interop ms comn y
quizs tambin ms complicado para el
desarrollador no acostumbrado a l sea
la conversin entre las cadenas .NET
y las tpicas terminadas en nulo de C.
Ms arriba hemos visto cmo conver-
tir un puntero a cadena de C a una
cadena de .NET a travs de un String-
Builder. Tambin lo hemos hecho con
C++/CLI aprovechando su propio sis-
tema de interoperacin. No obstante,
todava queda una forma de hacerlo
directamente desde C# que puede
resultar bastante til, aunque quizs sea
la ms lenta de todas.
La clase Marshal del espacio de nom-
bres System.Runtime.InteropServices ofre-
ce una gran cantidad de mtodos para
interoperar entre cdigo nativo y mane-
jado. Con ella se puede realizar casi cual-
quier tipo de conversin; si bien no de for-
ma automtica, s de forma manual. Por
ejemplo, los mtodos ReadInt32 y Wri-
teInt32 permiten extraer y escribir un
entero de 32 bits de un bfer nativo acce-
dido mediante un IntPtr. Otro ejemplo:
si necesitamos reservar memoria nativa
para pasarla a un mtodo nativo, pode-
mos utilizar el mtodo A llocHGlobal, que
nos devolver, de nuevo, un IntPtr capaz
de ser pasado como puntero de C lla-
mando al mtodo ToPointer del mismo.
Volviendo al tema de las cadenas, con
los mtodos PtrToStringA nsi y PtrToS-
tringUni podemos obtener una cadena
.NET a partir de un IntPtr que apunte
a una cadena nativa terminada en cero.
Tambin tenemos las funciones inver-
sas, StringToHGlobalA nsi y StringToH-
GlobalUni, que toman una cadena .NET
y devuelven un IntPtr que puede ser
pasado a una funcin nativa como pun-
tero a cadena terminado en cero. En este
ltimo caso, no debemos olvidarnos de
liberar la memoria asignada al llamar a
dichos mtodos con FreeHGlobal, pasan-
do el puntero obtenido con las funcio-
nes anteriores una vez que dichas cade-
nas nativas no sean necesarias.
Tampoco podan faltar mtodos
para trabajar con componentes COM
nativos, de los que se cuenta con una
buena cantidad, tanto para asignar
memoria y recursos para el componente
como para comunicarse con l.
El nico inconveniente de todas
estas funciones es el rendimiento. Si
nuestra aplicacin manejada las usa con
profusin, deberamos estructurarla de
forma que se minimice su utilizacin y
los saltos entre cdigo manejado y nati-
vo. Y si eso no pudiera ser as, quizs
una opcin perfectamente vlida sera
hacer la parte de la aplicacin que acce-
da al mundo nativo en C++/CLI, apro-
vechando el modo mixto que este len-
guaje ofrece, tal y como se ha dejado
entrever en este artculo.
static void EjecutaA TravesDeDelegadoNativo(
NumeroComplejo c1,NumeroComplejo c2)
{
ComplejoInversoDelegado ^delegado =(ComplejoInversoDelegado ^)
Marshal::GetDelegateForFunctionPointer(
(IntPtr)(::ComplejoInverso),ComplejoInversoDelegado::typeid);
delegado(c1,c2);
}
Bibliografa
Sivakumar, Nishant. C++/CLI in Action. Manning Publications, 2007.
Sutter, H. A Design Rationale for C++/CLI, en http://www.gotw.ca/publications/C++CLIRationale.pdf. Traduccin
al castellano, por Ontivero, R. y Hernndez O., en http://rfog.cmact.com/a_design_rationale_es.zip.
Nez, H. Implementando wrappers en C++/CLI. Reproduccin de sonido en .NET. En dotNetMana n 55,
enero de 2009.
[1]
[2]
[3]
Como la vida misma
Usted conoce los riesgos que tiene que su sistema
no funcione lo ms eficientemente posible quin
no lo ha sufrido alguna vez!, y una de sus labores
como administrador de bases de datos, entre otras
muchas, debera ser conocer la capacidad de su sis-
tema, y en la medida de lo posible anticiparse a situa-
ciones inesperadas. Adems, si de alguna forma es
usted capaz de almacenar en algn sitio la activi-
dad de sus instancias de SQL Server, esta informa-
cin tambin podr servirle a posteriori como herra-
mienta de diagnstico. Usted conoce bien la serie-
dad con que hay que tratar estas cosas, porque al
final es dinero que le cuesta a su empresa; si su sis-
tema gestiona 15.000 operaciones de negocio en un
da, y si dicha capacidad se reduce en tan solo un 3%,
simplificando mucho la problemtica, la teora dira
que el sistema estara dejando de gestionar 450 ope-
raciones en todo el da. Es eso mucho? Es asumi-
ble? Qu supone para su empresa? Qu pasa con
la sensacin del usuario? Y la imagen de la empre-
sa? Imagine que su empresa est presente en la Web
y gestiona apuestas, reservas de vuelos, tren, hote-
les, o incluso venta de productos de software; ima-
gine que su empresa es un broker de transacciones
bancarias Al final, su sistema de bases de datos es
crtico en el da a da de la empresa entre muchas
variables, y su postura debe ser la de por lo menos
garantizar que las variables que de usted dependen
estn lo ms sanas posible.
Qu tipo de informacin nos gustara
recolectar
En definitiva, la capacidad transaccional de su siste-
ma ir de la mano de la capacidad que tenga su ser-
vidor de bases de datos para resolver/procesar peti-
ciones de consultas T-SQL; esta informacin se pue-
de obtener del contador Batch Requests/sec del
objeto MSSQL$<nombre_instancia>:SQL Statis-
tics del Monitor de rendimiento (System Monitor).
Adems, sera importante capturar contadores de la
actividad fsica del sistema de almacenamiento
(Bytes/sec, Disk Reads/sec y Disk Writes/sec);
en este ejemplo vamos a monitorizar la cantidad de
operaciones realizadas contra el sistema de almace-
namiento y la cantidad de bytes transferidos (tanto
ledos como escritos). Por otra parte, me gustara
recomendarle que incluyera contadores personaliza-
dos de rendimiento en vuestras capas intermedias:
como introduccin al concepto, dira que usted pue-
de programar sus aplicaciones para que expongan
hacia fuera que podr consultar con el Monitor
de rendimiento las veces que la ejecucin de su com-
ponente pasa por reas concretas de su cdigo Para
ms informacin, consulte la referencia [2].
Definicin del colector de datos perso-
nalizado
Asumimos que el mes pasado se han puesto en mar-
cha los colectores estndar de Performance Studio.
SQL Server Performance Studio
Creacin de colectores de datos personalizados
SQL Server
En nuestra entrega anterior[1], hicimos una introduccin a las nuevas capa-
cidades de SQL Server 2008 para monitorizar instancias de SQL Server; en
el artculo de este mes, vamos a salirnos un peln del estndar que ofre-
ce la interfaz grfica para adaptar el producto a nuestras necesidades con-
cretas. Antes de seguir adelante, recomendara familiarizarse con los con-
ceptos tratados en el artculo del mes pasado.
Eladio Rincn
Eladio Rincn es MCT y
MVP en SQL Server. Ela-
dio es Director de Tecno-
logas de Bases de Datos
para Solid Quality en
Espaa y Portugal, y man-
tiene con sus compaeros
de departamento El
Rincn del DBA
(http://blogs.solidq.com
/ES/ElRinconDelDBA ), don-
de comparten sus expe-
riencias en escalabilidad,
seguridad, rendimiento y
diseo eficiente de siste-
mas de bases de datos.
Puedes contactar con
Eladio en
erincon@solidq.com.
d
o
t
N
e
t
M
a
n

a
<
<
45
dnm.servidores.sql
<<
Recuerde que hay tres grandes grupos,
Disk Usage, Query Statistics y Ser-
ver Statistics; en nuestro caso, los conta-
dores que acabamos de comentar los aa-
diremos al grupo Server Statistics (tipos
de colectores relacionado con el Monitor
de rendimiento). En primer lugar, com-
probaremos que el proceso de captura de
datos est en funcionamiento con la
siguiente consulta:
use msdb
go
select *
from [msdb].[dbo].
[syscollector_config_store]
Donde la columna CollectorEnabled
con un valor de 1 indicar que est habi-
litado (figura 1).
Para habilitar/deshabilitar los traba-
jos desde TSQL, usaremos las siguien-
tes sentencias:
use msdb
go
habilitar colectores de datos
exec [msdb].dbo.sp_syscollector_
enable_collector
deshabilitar collectores de datos
exec [msdb].dbo.sp_syscollector_
disable_collector
Una vez que hemos comprobado el
estado, nos tocar definir el colector per-
sonalizado que queremos crear; el pro-
ceso de creacin constar de las siguien-
tes tres fases:
1. Crear el objeto contenedor de la infor-
macin, al que llamaremos Data
Collector DNM.
2. Aadiremos a ese objeto la informa-
cin que queremos capturar; en
nuestro caso:
Actividad de servidor de SQL Ser-
ver (contadores de rendimiento).
Traza de SQL Profiler.
3. Para finalizar, habilitaremos el
colector.
1. Crear el colector de datos
Para crear el colector de datos, usaremos
el procedimiento almacenado sp_sysco-
llector_create_collection_set de la base
de datos msdb; en nuestro caso, usaremos
las sentencias T-SQL que se presentan
en el listado 1, que nos devolvern como
resultado el identificador del colector
recin creado gurdelo, porque lo nece-
sitar en los siguientes pasos (en mi caso,
el ID obtenido fue 6).
Como informacin relevante del
procedimiento almacenado tendremos:
@name: nombre del colector de datos
@collection_mode: si se desea que la
carga sea cacheada o se haga directa-
mente en base de datos.
@days_until_expiration: caducidad de
los datos capturados.
@schedume_name: frecuencia con que la
informacin se sube a la base de datos
de repositorio.
Tras crear el colector, podr com-
probar desde SQL Server Management
Studio que ste se ha aadido a la lista de
colectores dentro del desplegable <Ins-
tancia SQL Server> | Management
| Data Collection, como se puede ver
en la figura 2.
2. Aadir al colector la
informacin que deseamos
capturar
Para aadir al colector la informacin
a capturar, usaremos el procedimien-
to almacenado sp_syscollector_crea-
te_collection_item de la base de datos
msdb; adems, como hemos decidido
capturar informacin de actividad de
servidor del Monitor de rendimiento,
necesitamos conocer el UID de este tipo
de colectores con la siguiente consulta:
use msdb
go
Figura 1
Figura 2
use msdb
go
declare @id int
declare @uid uniqueidentifier
EXEC [dbo].[sp_syscollector_create_collection_set]
@name=NData Collector DNM,
@collection_mode=0, modo cacheado
@description=NCaptura de actividad fsica de discos,
@days_until_expiration=5, 5 das de histrico
@schedule_name=NCollectorSchedule_Every_5min,
@collection_set_id=@id OUTPUT,
@collection_set_uid=@uid OUTPUT
Select @id, @uid
Listado 1. Creacin del colector de datos
d
o
t
N
e
t
M
a
n

a
<
<
46
dnm.servidores.sql
<<
Select *
From
[dbo].[syscollector_collector_types]
where name = NPerformance Counters
Collector Type
En mi caso, la columna collec-
tor_type_uid tiene el valor 294605DD-
21DE-40B2-B20F-F3E170EA1EC3; adems,
recuerde que necesitar el identifica-
dor del colector obtenido anterior-
mente.
Para finalizar, necesitamos definir qu
contadores queremos capturar; esto se
indicar mediante etiquetas XML que
debern ajustarse al esquema del listado
2 cada tipo de colector de datos se ajus-
ta a su propio esquema.
En nuestro caso, el XML ser el que
se muestra en el listado 3, quedando la
sentencia T-SQL a ejecutar como en el
listado 4 (observe que hemos indicado,
mediante el argumento @frequency, que
la frecuencia de captura ser de 15
segundos).
Si volvemos ahora a SQL Server
Management Studio, y comprobamos las
propiedades del colector, veremos lo que
se muestra en la figura 3.
3. Habilitar la captura de datos por el
colector
Para finalizar, habilitaremos el colector
para que empiece a capturar datos
mediante la siguiente sentencia T-SQL:
use msdb
go
exec sp_syscollector_start_collection_set
@collection_set_id = 6
Leyendo la informacin
capturada
Tras poner en marcha la captura, lle-
ga la hora de consultar la informacin
recogida. Como comentamos en el art-
culo del mes pasado, la informacin se
almacena en una base de datos (datawa-
rehouse) que se configura al inicio del pro-
ceso; como se puede y es habitualalma-
cenar informacin de diferentes sesiones
en la base de datos, Microsoft ha disea-
do las tablas segn el esquema de la figu-
ra 4, donde las tablas representan las
siguientes relaciones:
snapshots.performance_counter_values:
cada contador de rendimiento monito-
rizado.
core.source_info_internal: cada uno
de los colectores de usuario y sistema.
<?xml version=1.0 encoding=utf-8?>
<xs:schema attributeFormDefault=unqualified elementFormDefault=qualified
xmlns:xs=http://www.w3.org/2001/XMLSchema>
<xs:element name=PerformanceCountersCollector>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs=0 maxOccurs=unbounded
name=PerformanceCounters>
<xs:complexType>
<xs:attribute name=Objects type=xs:string use=optional />
<xs:attribute name=Counters type=xs:string use=optional />
<xs:attribute name=Instances type=xs:string use=optional />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Listado 2. Esquema de los colectores de datos.
<ns:PerformanceCountersCollector xmlns:ns=DataCollectorType>
<PerformanceCounters Objects=LogicalDisk Counters=Disk Reads/sec/>
<PerformanceCounters Objects=LogicalDisk Counters=Disk Bytes/sec/>
<PerformanceCounters Objects=LogicalDisk Counters=Disk Writes/sec/>
<PerformanceCounters Objects=$(INSTA NCE):SQL Statistics
Counters=Batch Requests/sec />
</ns:PerformanceCountersCollector>
Listado 3. Esquema especfico para nuestro colector de datos.
use msdb
go
Declare @uid int
EXEC [dbo].[sp_syscollector_create_collection_item]
@name=NContadores de actividad de discos y peticiones por segundo,
@parameters=N<ns:PerformanceCountersCollector xmlns:ns=DataCollectorType>
<PerformanceCounters Objects=LogicalDisk Counters=Disk Reads/sec/>
<PerformanceCounters Objects=LogicalDisk Counters=Disk Bytes/sec/>
<PerformanceCounters Objects=LogicalDisk Counters=Disk Writes/sec/>
<PerformanceCounters Objects=$(INSTA NCE):SQL Statistics
Counters=Batch Requests/sec />
</ns:PerformanceCountersCollector>,
@collection_item_id=@uid OUTPUT,
@frequency=15,
@collection_set_id=6,
@collector_type_uid=294605DD-21DE-40B2-B20F-F3E170EA 1EC3
Listado 4. Sentencia T-SQL para aadir la informacin a capturar al colector.
d
o
t
N
e
t
M
a
n

a
<
<
47
dnm.servidores.sql
<<
core.snapshots_internal: cada subida de cada
colector.
snapshots.performance_counter_instances: el
valor de cada contador de rendimiento para cada
subida.
Tras familiarizarnos con las tablas relacionadas, nos
quedara consultar la informacin almacenada en ellas;
para ello hay multitud de posibles soluciones, y solo
enumerar unas cuantas:
Conjuntos de procedimientos almacenados que pue-
de crear para sus necesidades concretas.
Conjunto de sentencias T-SQL creadas ad-hoc para
cada ocasin.
Conjunto de informes creados con SQL Server
Reporting Services.
Documento Excel vinculando las tablas anteriores.
En mi opinin personal, la opcin que considero
ms flexible y atractiva para el trabajo que solemos hacer
es vincular las tablas snapshots.performance_coun-
ter_values y core.source_info_internal desde Excel
y crear grficos impactantes para mostrar nuestras con-
clusiones de forma grfica; como ejemplo, en la figura
5 se presenta un grfico obtenido desde Excel para unas
pruebas de rendimiento que tuvimos que hacer hace
relativamente poco tiempo.
Conclusiones
Complementando el artculo del mes pasado, hemos vis-
to un ejemplo prctico de cmo crear y capturar infor-
macin de monitorizacin mediante colectores de datos
personalizados; como se habr dado cuenta, ms all de
SQL Server Management Studio se puede llegar a un
nivel de personalizacin extraordinario para dar soporte
a las necesidades concretas de nuestras instalaciones. Como
ejercicio posterior, quedara consolidar en un nico
almacn de datos informacin de monitorizacin prove-
niente de distintos servidores Happy monitoring!
Figura 3
Figura 4
Figura 5
Referencias
Rincn, E. SQL Server Performance Studio. Nueva herramienta de monitorizacin en SQL Server 2008. En
dotNetMana n 56, febrero de 2009, pgs. 38-40.
Jones, D. E. Using custom attributes to add performance counters to your application, en
http://www.codeproject.com/KB/vb/PerformanceCounterUtils.aspx.
[1]
[2]
El primer paso, por supuesto, y para los que no las
conozcis, es explicar qu es esto de las 12 pre-
guntas de Joel Spolsky, que podis encontrar aqu:
http://tinyurl.com/12spolsky. Resumiendo, se tra-
ta de 12 preguntas que deberamos hacernos para
evaluar nuestro entorno de trabajo, ver nuestros
puntos dbiles y empezar a trabajar para solucio-
narlos. Las preguntas van desde el plano tcnico
hasta el plano ms de gestin y de equipo.
Las preguntas son:
1. Usas control de cdigo fuente?
2. Puedes construir el producto en un nico
paso?
3. Haces compilaciones completas diarias?
4. Tienes una base de datos con los defectos
(bugs)?
5. Arreglas los defectos antes de escribir cdi-
go nuevo?
6. Tienes una planificacin actualizada?
7. Tienes especificaciones?
8. Tienen los desarrolladores condiciones
tranquilas de entorno?
9. Usas las mejores herramientas que puedes
comprar?
10. Dispones de testers?
11. Haces escribir cdigo en las entrevistas?
12. Realizas pruebas de usabilidad de pasillo?
Ahora es el momento de evaluaros, y ver qu
puntuacin sacis Ya est? Bueno, no os asustis
con los resultados, vamos a ver cmo Visual Studio
Team System nos puede ayudar a dar respuesta a
algunas de estas preguntas y mejorar nuestro entor-
no. Por supuesto, Team System no va a dar respuesta
a todas las preguntas, y mucho menos por s solo;
debemos ser nosotros los que saquemos el mayor
partido de esta herramienta. Vamos a por ello.
Antes de continuar, una pequea aclaracin: en
este artculo no se pretende profundizar en ningu-
no de estos temas; lo que pretendo es daros una gua
de cul puede ser un buen punto de partida de un
despliegue de Team System, y un posible orden de
implementacin de las distintas prcticas y de las
herramientas, valindome de los puntos propuestos
por Joel Spolsky, si bien no todos ellos se pueden res-
ponder con Team System. Concretamente, nos cen-
traremos en los puntos 1, 2, 3, 4, 6, 7 y 10.
Usas control de cdigo fuente?
Esto parece bsico, pero a veces nos olvidamos de
las cosas ms bsicas y no las sabemos aprovechar
o no nos acordamos de que estn ah. Sin embar-
go, es algo de lo que podemos sacar partido inme-
Las 12 preguntas de
Spolsky y Team System
ALMana
Luis Fraile
es MVP de Team Sys-
tem y colabora activa-
mente en MAD.NUG
(grupo de usuarios de
.NET de Madrid).
Actualmente es direc-
tor tcnico en Multido-
mo Networks, donde
desarrollan un produc-
to de software para la
gestin de dispositivos
domticos y cmaras
de vigilancia a travs de
Internet mediante inter-
faces Web, telfonos
mviles, Media Center,
etc. Puede consultar su
blog en www.lfraile.net.
Una de las primeras preguntas que se hacen al empezar a implantar
Team System es y por dnde empiezo? qu hago? Son tantas las prc-
ticas, herramientas, decisiones, que se hace difcil arrancar. Sin embar-
go, Joel Spolsky propuso hace tiempo 12 sencillas preguntas para eva-
luar nuestra situacin. Pues bien, vamos a darle una vuelta a esas pre-
guntas, para usarlas como punto de comienzo.
Luis Fraile
dnm.ALMana
<<
diatamente, y algo
imprescindible antes de
plantearnos cualquier
otra accin.
El objetivo del control
de cdigo fuente es el de
permitirnos, de un modo
sencillo, integrar el cdi-
go de los desarrolladores
que hay en el proyecto.
En relacin con esto, los
problemas suelen venir a
la hora de modificar un
mismo proyecto o fiche-
ro por varios desarrolla-
dores a la vez, algo que en
la prctica totalidad de
proyectos es inevitable.
Adems, el control de
cdigo fuente nos va a
permitir tener un histrico de todas las modificaciones
de los ficheros del proyecto y de quienes las hicieron.
Aqu Team Foundation Server nos proporciona la
herramienta Version Control (figura 1), que nos faci-
lita, mediante las acciones bsicas de desproteger un
fichero para editarlo, protegerlo cuando hayamos ter-
minado de editarlo para que est a disposicin del res-
to del equipo y crear shelves de conjuntos de cambios, la
labor de compartir el cdigo.
Version Control tambin nos permite gestionar el
ciclo de vida del cdigo a lo largo de las versiones de un
producto, aunque ste es un proceso bastante comple-
jo y yo os recomendara dejarlo para cuando ya estemos
muy acostumbrados al trabajo con el control de versio-
nes y hayamos comprendido su flujo de trabajo.
Esta funcionalidad es la de los branches, que nos
permiten crear ramas paralelas con una copia de
nuestro cdigo, sobre la que trabajar en paralelo,
para posteriormente unirlas a la principal. Esto es
explicndolo muy bsicamente, ya que este proceso
tiene muchas implicaciones de esto, y hay que tener
mucho cuidado con cmo se realiza la gestin de
estas ramas. En este sentido, la mejor fuente de infor-
macin es la documentacin que podemos ver en
http://www.codeplex.com/TFSBranchingGuideII, que
contiene ejemplos, guas y recomendaciones a la hora
de gestionar nuestro repositorio de cdigo, y parti-
cularmente la gestin de branches con Team Foun-
dation Server.
Puedes construir el producto en
un nico paso? Haces compilaciones
completas diarias?
Bien, una vez que el equipo lleve un tiempo traba-
jando con el control de cdigo fuente (no hace falta
llegar a los branches), lo siguiente que nos plantea-
mos es cmo construimos nuestro producto.
En proyectos sencillos, ser tan simple como esco-
ger la configuracin de Release y compilar la solucin;
pero la vida no siempre es sencilla, y la mayor parte de
las veces tendremos varias soluciones, libreras que pro-
vienen de otros equipos, proyectos de instalacin, etc.
que muchas veces nos har de la construccin un auten-
tico calvario a la hora de ponerlo todo en orden.
La primera premisa bsica es poder obtener la lti-
ma versin del cdigo fuente para compilar de un ni-
co punto, pero esto ya lo tenemos con el apartado
anterior verdad? Ahora viene el siguiente paso: com-
pilar todo junto y en un solo paso. Para esto nos vamos
a apoyar en Team Build. De Team Build y de la inte-
gracin continua hemos hablado en el nmero 50 de
dotNetMana.
El primer paso es configurar la compilacin del
proyecto mediante Team Build, lo que se hace siguien-
do los pasos de un sencillo asistente (figura 2), que
nos permite seleccionar la configuracin, proyectos,
soluciones y pruebas a ejecutar (recordad que nin-
guna compilacin est completa si no se ejecutan las
Figura 1
Para ms informacin acerca del uso de Version
Control, os recomiendo este enlace: http://tin-
yurl.com/TFSVC, donde estn los tutoriales de Micro-
soft acerca del uso de Version Control, adems de
futuros artculos en esta revista.
[ ]
NOTA
d
o
t
N
e
t
M
a
n

a
<
<
49
d
o
t
N
e
t
M
a
n

a
<
<
50
dnm.ALMana
<<
pruebas!). La potencia de Team Build reside en esta
sencillez de configuracin, y sobre todo en la capa-
cidad de extenderla a posteriori con nuestros pro-
pios pasos de compilacin, algo que vimos en el
nmero 55 de esta misma revista.
Una vez que ya tenemos una compilacin que cons-
truye nuestro producto en un nico paso, lo siguiente
es ejecutarla al menos una vez al da, para prevenir los
errores de integracin que surgen en los equipos. Para
esto, Team Build nos permite especificar durante la eje-
cucin del asistente tanto un calendario de ejecucin
peridica de la compilacin, como opciones ms auto-
matizadas an, como la integracin continua, que eje-
cuta la compilacin cada vez que alguien sube cdigo
fuente nuevo al repositorio de cdigo.
Como podis ver, todo va muy unido: reposito-
rio de cdigo, compilaciones, etc. De ah que pri-
mero se empiece con el control de cdigo fuente,
que es la base de todo.
Tienes una base de datos con los defec-
tos (bugs)? Tienes especificaciones?
Volvemos a unir dos puntos, y aqu me salto un poco
el orden de las preguntas de Joel.
Si alguien nos pregunta cuntos bugs tenemos en
nuestro proyecto, y de qu severidad, sabramos dar-
le una respuesta concreta? Es muy importante que dis-
pongamos de este tipo de informacin, como los bugs
o las especificaciones de lo que queremos construir, si
bien la podemos llevar de muchos modos distintos,
como por ejemplo en una simple hoja de clculo Excel;
el ideal es que con esta informacin podamos obtener
ms datos acerca del estado del proyecto.
En Team Foundation Server, esto lo consegui-
remos mediante los Work Items (figura 3). Los work
items (WI) son unidades de trabajo que nos sirven
para representar tanto tareas como bugs, especifica-
ciones, etc. Estos WI contendrn la informacin
necesaria, dependiendo de lo que queramos almace-
nar; si los campos previstos de antemano no son sufi-
cientes, siempre podemos adjuntarle directamente
un documento, o un enlace a un documento exter-
no, situado por ejemplo en un servidor de Share-
Point. Esta informacin tambin depender de la
metodologa que estemos usando en el proyecto,
Figura 2
Figura 3
Para ms informacin acerca de Team Build, podis
consultar http://tinyurl.com/TeamBuildES, pgina de
MSDN con informacin y tutoriales sobre Team
Build, as como los nmeros 50 y 55 de dotNet-
Mana, en los que se habla acerca de la integracin
continua y de su extensibilidad con Team Build.
[
]
NOTA
La potencia de Team Build reside
en esta "sencillez" de configuracin,
y en la capacidad de extenderla
con nuestros propios pasos
de compilacin
d
o
t
N
e
t
M
a
n

a
<
<
51
dnm.ALMana
<<
especificada a travs de la plantilla de proyecto que
hayamos escogido al crear el proyecto de Team Foun-
dation Server.
La gran ventaja de gestionar con los WI todos los
elementos de trabajo consiste en que despus podremos
explotar gran parte de la potencia de los informes basa-
dos en estos WI que ofrece Team Foundation Server.
Estos elementos de trabajo tienen adems sus pro-
pios flujos de trabajo, para que podamos comprobar
los estados por los que pasan, y en el caso de los bugs
su severidad, para poder saber qu elementos tene-
mos abiertos, de qu tipo, con qu prioridad, y en qu
estado se encuentran, para poder responder la pre-
gunta que nos hacamos al principio.
Si esto lo unimos al control de cdigo fuente,
al que podemos tambin asociar estos elementos de
trabajo durante las operaciones de actualizar el cdi-
go en el repositorio, y a las compilaciones de Team
Build, que nos dan la informacin de los elemen-
tos de trabajo que han sido modificados (mediante
la asociacin antes mencionada) en esta compila-
cin, permitindonos saber qu conjunto de cam-
bios se hicieron en qu compilacin, podemos valo-
rar la potencia de tener almacenadas nuestras tare-
as como WI.
Realmente, este es un paso que podemos hacer
incluso antes que el control de cdigo fuente, pero
debido a la importancia inicial del control de cdi-
go fuente, y a la posibilidad de unir estos elementos
de trabajo al cdigo, yo os recomiendo que antes que
trabajar con esto empecis por el control de cdigo
fuente.
Tienes una planificacin actualizada?
Vale, lo admito, esto es algo que se debe hacer siem-
pre y antes que cualquier cosa, incluido el control de
cdigo. Pero aqu estoy hablando de gestionar esto
mediante la implementacin de Team System; por eso
va despus de los WI.
Por qu? Pues porque los WI es de lo que nos
vamos a valer para esto. Por ello, es muy importan-
te que, llegados a este punto, el equipo tenga el tra-
bajo con el control de cdigo fuente y los WI muy
asimilado.
Si bien se puede hacer por separado, lo ideal es
acostumbrar a los desarrolladores a modificar los WI
de sus tareas en el momento de hacer el check-in (subi-
da del cdigo) desde la propia interfaz que estn acos-
tumbrados a manejar: Visual Studio. Como podis
ver en la figura 4, en la ventana de check-in tenemos
una opcin Work Items, que nos permite, median-
te una de las consultas de WI disponibles en el pro-
yecto, seleccionar qu tareas estn enlazadas a este
cdigo. Tambin podemos actualizar la planificacin:
si hacemos doble clic, se nos abrir el WI que quere-
mos editar, pudiendo rellenar en ese momento el tra-
bajo completado y el trabajo que nos queda. De este
modo, los desarrolladores tienen el acceso, sin salir
de su herramienta, para poder actuar sobre la plani-
ficacin y mantenerla actualizada.
Todo esto, junto a los informes de proyecto de
Team System y a la integracin de ste con Microsoft
Excel y Project, nos da una visin del trabajo com-
pletado, del que queda y de las desviaciones. Si esto
os parece poco, apuntaros tambin que podis exten-
Para ms informacin, en este enlace de MSDN:
http://tinyurl.com/WORKITEMS tenis mucha infor-
macin acerca de los elementos de trabajo, as como
diversos tutoriales para que exploris sus capaci-
dades. Adems, os recomiendo estar atentos a dot-
NetMana, como siempre, donde hablaremos en
algn momento sobre este tema.
[ ]
NOTA
Figura 4
Para ms informacin sobre este tema, podis
consultar http://tinyurl.com/TFSReports.
[
]
NOTA
der el sistema con vuestros propios informes de
Reporting Services, o incluso conectaros a la fuen-
te de datos de informes desde Excel y sacar infor-
mes ad hoc.
Dispones de testers?
Ms que testers, aqu me refiero a: aparte de tes-
ters, dispones de herramientas para testing?
Haces pruebas? Haces pruebas unitarias? Esto
es muy importante; no nos cansaremos de repetir
que la calidad no es opcional y debemos asegurar-
nos de que los requerimientos se pueden probar,
y necesitamos herramientas que nos faciliten este
trabajo.
Con Visual Studio Team System (desde Visual
Studio Team System Developers Edition, con las
herramientas de pruebas unitarias, hasta Visual Stu-
dio Team System Testers Edition, con sus herra-
mientas de pruebas de carga, pruebas Web, etc.),
disponemos de varias herramientas que nos van a
facilitar esta tarea; pruebas que podremos auto-
matizar para repetirlas de un modo sencillo siem-
pre que podamos.
Realmente este es un camino que debemos
emprender lo antes posible, pero hay que tener muy
claros los pasos anteriores, ya que todo en Team
System est conectado, y una vez que tengamos cla-
ros procedimientos como los de Team Build, podre-
mos agregar a nuestras compilaciones las pruebas
automatizadas; especialmente importantes en este
paso son las pruebas unitarias.
Adems, todos los resultados de pruebas los
podremos incluir en el almacn de datos de Team
Foundation Server, integrndolos, cmo no, con
los informes, con lo que podremos obtener tam-
bin informes acerca de la calidad del proyecto, y
ponerlos en correspondencia con bugs, planifica-
cin, cdigo, compilaciones, etc.
Conclusiones
Es muy importante que a la hora de implementar stas
y otras, no comencis con una prctica hasta que no
hayis cogido soltura suficiente con la anterior. El obje-
tivo es que estas prcticas nos faciliten el trabajo, no que
nos creen impedimentos; si nos los crean, acabaremos
no usndolas y volviendo a un punto anterior, y con reti-
cencias a utilizar nuevas prcticas.
Aunque aqu no lo hemos mencionado, tambin es
muy importante que tengamos una metodologa que
nos gue a lo largo de todo este proceso, con buenas
prcticas de gestin, de desarrollo y de organizacin del
equipo; esto es la base de todo, y sin ello estaremos per-
didos. Adems, es importante que se trate de una meto-
dologa ya conocida, de la que tengamos suficientes refe-
rencias y que adoptemos sin fisuras.
Por ltimo, y para acabar, la pregunta 9: Usas las
mejores herramientas que puedes comprar? Bueno, yo
creo que para esta pregunta es obvia la respuesta que os
voy a dar, y aunque es cierto que no existen balas de pla-
ta tampoco en el rea de las herramientas, si seguimos
un procedimiento ordenado en su implementacin,
estando adems apoyados por gente que ya lo haya hecho
antes y comparta su experiencia con nosotros, Visual
Studio Team System es una herramienta que perfecta-
mente puede dar respuesta a esta pregunta.
d
o
t
N
e
t
M
a
n

a
<
<
52
dnm.ALMana
<<
Ejemplos e instrucciones para el uso de las herra-
mientas de testing las podis encontrar en MSDN
aqu: http://tinyurl.com/VSTSTesting. Adems, os reco-
miendo el blog de James Whitaker (en ingls):
http://tinyurl.com/JWTest, en el que, aunque no se
habla de testing con Team System, podis leer inte-
resantes artculos acerca del testing funcional y obte-
ner grandes ideas para vuestros proyectos.
[
]
NOTA
Es muy importante que a la hora de implementar stas y otras,
no comencis con una prctica hasta que no hayis cogido soltura
suficiente con la anterior
Me gusta tu planteamiento. Y me gustara utilizarlo
en mis clases para explicar las diferencias entre
AJAX y Silverlight. Una aplicacin Silverlight es
una aplicacin Web, pero con un modelo de pro-
gramacin y una interfaz de usuario que tienen
mucho ms en comn con las aplicaciones de escri-
torio. Dicho esto, hay que aadir que el runtime de
Silverlight es radicalmente diferente de un entor-
no de escritorio, que opera bajo confianza total (full
trust). Este es un punto importante a recordar.
De vuelta al problema, por qu no puede uti-
lizarse wsHttpBinding para llamar a un servicio
WCF desde Silverlight? La respuesta simple es
que es as por diseo. Pero vamos a analizarlo con
algo ms de profundidad.
Un servicio WCF que habilita clientes Sil-
verlight est forzado a utilizar el esquema
basicHttpBinding, lo que significa que debe exis-
tir un endpoint configurado para peticiones SOAP
1.1 en el servicio. El contenido del fichero Web.con-
fig de la aplicacin ASP.NET debe incluir lo
siguiente:
<system.serviceModel>
<! ... >
<services>
<service behaviorConfiguration=MyServiceBehavior
name=MyService>
<endpoint address=
binding=basicHttpBinding
contract=IMyService />
<endpoint address=mex
binding=mexHttpBinding
contract=IMetadataExchange />
</service>
</services>
</system.serviceModel>
Como puede verse en la figura 1, el esquema
basicHttpBinding no ofrece al cliente Silverlight
las mismas opciones de seguridad que tendra un
cliente con confianza total. Las opciones de segu-
ridad para los servicios WCF se limitan a HTTPS
y asumen ninguna seguridad por defecto.
Debera sorprendernos este modelo de segu-
ridad tan simple para escenarios AJAX y Silver-
light? Bueno, ambos son clientes Web con un
inters principal en los servicios: hacer peticiones
WCF y Silverlight juntos
Dino Esposito
Arquitecto en IDesign,
Dino Esposito es una de
las autoridades mundiales
reconocidas en tecnologas
Web y arquitectura de
software. Sus libros ms
recientes son "Program-
ming ASP.NET 3.5-Core
Reference" e "Introducing
Microsoft ASP.NET AJAX"
(Microsoft Press). Es
ponente regular en even-
tos de la industria de
mbito mundial, como
TechEd o DevConnec-
tions, y europeos, como
DevWeek y Basta.
Silverlight 2 es la variante de escritorio de la Web, no es as? Ahora bien, por qu razn
no soporta wsHttpBinding? Hay alguna razn no evidente por la que los chicos de Micro-
soft se hayan basado en SOAP para las comunicaciones Web y WCF?
todonet@qa
Este mes exploramos aspectos internos de los enlaces (bindings) de WCF y cmo se
relacionan con Silverlight. En particular, veremos las razones por las que en Silverlight
no hay wsHttpBinding y solo se soporta el esquema ms simple de basicHttpBinding.
Tambin hablaremos sobre el modo de compatibilidad WCF/ASP.NET y la instalacin
de Silverlight en empresas de gran tamao.
El modo de compatibilidad de WCF
hace posible el funcionamiento de los
clientes AJAX, y como puede imaginar
supone cierta limitacin para el servi-
cio WCF en s mismo. No se necesita
la compatibilidad para servicios que no
sern llamados por clientes AJAX. La
necesidad del modo de compatibilidad
se deriva de la necesidad de compartir
el mismo entorno de ejecucin entre las
pginas ASP.NET y los servicios WCF.
Cuando un servicio WCF es alojado por
IIS, vive dentro de una aplicacin
ASP.NET. Si esa aplicacin tiene una o
ms pginas AJAX que necesitan llamar
al servicio va script, el modo de com-
patibilidad se convierte en una necesi-
dad. Aunque no en todos los casos.
Por defecto, los servicios WCF alo-
jados en IIS comparten con las pginas
ASP.NET un dominio de aplicacin
comn y nico. Por tanto, ASP.NET y
los servicios WCF se ejecutan simult-
neamente (side-by-side). Cualquier peti-
cin WCF es capturada por IIS, rediri-
gida a ASP.NET y procesada por la
tubera HTTP (HTTP pipeline). En
cierto momento, concretamente cuan-
do se lanza el evento PostAuthenticate-
Request, la infraestructura de aloja-
miento de WCF intercepta la peticin,
comienza a procesarla y nunca devuel-
ve el control a la tubera HTTP. Entre
otras cosas, esto quiere decir que los
mdulos HTTP programados para
atender las peticiones en una etapa pos-
terior de la tubera nunca interceptarn
las peticiones WCF. En el escenario
predeterminado, el servicio WCF no
tiene acceso al objeto de contexto
HTTP de ASP.NET. Si un servicio
WCF intenta usar la propiedad Http-
y procesar las respuestas. As pues, el
asunto tiene que ver con la simplicidad.
Si necesitas proteger datos sensibles
mientras se transmiten, dispones del
protocolo HTTPS y de los mecanis-
mos de cifrado correspondientes. Si
necesitas autenticacin, necesitas bus-
car otras soluciones alternativas. La
complejidad y la potencia del esquema
wsHttpBinding estara un poco fuera de
lugar y resultara algo excesiva.
Hay bastantes diferencias entre
basicHttpBinding y wsHttpBinding en lo
relativo al intercambio de paquetes SOAP
a bajo nivel. El esquema basicHttpBin-
ding existe solamente para permitir el
soporte de servicios al antiguo estilo
ASMX basados en el perfil WS-Basic-
Profile 1.1. En particular, existe para satis-
facer las necesidades de los clientes que
no tienen instalado .NET 3.0 o superior.
Para las muchas mquinas que todava
ejecutan Windows 2000 y no pueden ser
actualizadas a .NET 3.x, basicHttpBin-
ding es la nica forma de comunicarse
con el mundo exterior a travs de servi-
cios. En suma, este tipo de enlace existe
sobre todo por razones de compatibili-
dad.
Con basicHttpBinding no se dispo-
ne de soporte para mensajera segura,
al menos por defecto, (o sea, sin las
extensiones WS-*). Por ejemplo, cuan-
do un cliente llama a una operacin de
un servicio, todos los datos de respues-
ta son enviados "en claro" dentro de un
paquete SOAP perfectamente legible.
Adems, este esquema tampoco sopor-
ta fiabilidad (reliability) ni entrega orde-
nada. Esto quiere decir que si se pier-
de una llamada en el camino, el clien-
te no ser informado de este hecho,
agotando su tiempo de espera (timeout)
sin poder determinar si el servidor reci-
bi la llamada. La ausencia de entrega
ordenada implica que si un cliente lan-
za mltiples peticiones, no hay garanta
alguna de que los mensajes de peticin
lleguen al servidor en el mismo orden
en que fueron enviados.
En suma, que no habra ninguna
razn para no utilizar wsHttpBinding en
clientes que consumen servicios WCF.
Pero en Silverlight, as como en
ASP.NET AJAX, este esquema no est
soportado.
En ASP.NET AJAX, wsHttpBinding
no est soportado porque escribir en
la pila cliente de WCF mediante
JavaScript sera bastante complicado,
como tambin lo sera la inclusin de
firmas digitales y el cifrado de la men-
sajera. En Silverlight se dispone de un
potente entorno de desarrollo, pero
an existen limitaciones significativas
en lo relativo a la construccin de la
pila cliente de WCF (por ejemplo, en
cuanto a la seguridad de los mensajes
o las factoras de canales), ya que la
mayora de las caractersticas requie-
ren confianza total.
d
o
t
N
e
t
M
a
n

a
<
<
55
T
o
d
o
t
N
e
t
.
q
a
@
d
o
t
n
e
t
m
a
n
i
a
.
c
o
m

T
o
d
o
t
N
e
t
.
q
a
@
d
o
t
n
e
t
m
a
n
i
a
.
c
o
m
dnm.todonet@qa
<<
Tiene alguna ventaja utilizar el modo de compatibilidad para servicios WCF? O es solamente para clientes AJAX?
Puede darnos alguna pista?
Figura 1. Modos de seguridad basicHttpBinding en Silverlight
Context.Current, siempre recibir un valor nulo como
respuesta. Adems, al autorizar la peticin, el modelo de
seguridad de WCF no reconoce ninguna lista de control
de accesos (ACL) que pudiera haber sido incluida en el
chero .svc. De forma similar, el modelo de seguridad
de WCF no se adhiere a ninguna de las reglas de auto-
rizacin basadas en URL y especicadas en el nodo <aut-
horization> del chero de conguracin. Por ltimo, las
peticiones WCF siempre se ejecutan bajo la identidad
del proceso IIS, independientemente de los valores de
personicacin (impersonation) establecidos en la con-
guracin.
En circunstancias normales, esas diferencias no cons-
tituirn un problema insoluble. Por otro lado, WCF ha
sido diseado especcamente para ser independiente del
protocolo y transporte utilizados. Su independencia de
ASP.NET (que fue diseado de un modo muy depen-
diente de IIS y HTTP) es perfectamente normal.
Cundo es, por tanto, necesario el modo de com-
patibilidad? Cuando cualquiera de las caractersticas antes
citadas limiten nuestra potencia de programacin. Por
ejemplo, supongamos que por razones de seguridad se
necesita autenticar al usuario antes de que pueda proce-
der a una llamada a un servicio WCF. Entonces, mos-
tramos una pgina de identicacin para recoger las cre-
denciales del usuario. Si la autenticacin es correcta, se
genera una cookie que se transmite en las peticiones sub-
siguientes. Si se quiere comprobar las credenciales des-
de el servicio WCF, o si se desea utilizar la autorizacin
basada en URL para proteger el acceso al chero .svc,
no es posible mantener el servicio WCF y la parte
ASP.NET dbilmente acopladas. Aqu es donde inter-
viene la compatibilidad.
Se activa el modo de compatibilidad en el chero de
conguracin, tal como mostramos aqu:
Adems, es necesario que cada servicio d su propia
aprobacin explcita al modelo. Esto se hace aadiendo
a la clase del servicio (no al contrato) el atributo AspNet-
CompatibilityRequirements, como muestra el siguiente
cdigo:
Los servicios WCF han sido diseados para ser inde-
pendientes del tipo de enlace y del transporte. Al habi-
litar el modo de compatibilidad ASP.NET, estamos rom-
piendo esta regla, al hacer que el servicio sea dependiente
de IIS como alojamiento y de HTTP como protocolo
de transporte. Por otro lado, los servicios que son lla-
mados normalmente desde una capa AJAX son general-
mente servicios especcos para AJAX, por lo cual habi-
litar la compatibilidad ASP.NET en estos casos es inclu-
so una opcin natural.
No mucho, me temo. En efecto, se necesitan privile-
gios administrativos para instalar el complemento de
Silverlight. Hay que tener en cuenta, sin embargo, que
esta restriccin no es exclusiva de Silverlight, sino que
es aplicable a cualquier complemento para un nave-
gador. Esto significa que los usuarios individuales de
una red corporativa no pueden instalarlo simplemen-
te navegando a una pgina que utilice Silverlight. Al
mismo tiempo, es competencia de los administrado-
res desplegar el complemento para cada mquina bajo
su control. Para facilitar las cosas a los administrado-
res, Microsoft ha incluido Silverlight como una actua-
lizacin opcional mediante Windows Server Update
Services (WSUS) y tambin mediante Microsoft Upda-
te. De esta forma, los administradores pueden con-
trolar la instalacin de Silverlight en sus organizacio-
nes e incluso programar la instalacin como tarea de
segundo plano. Como resultado, los usuarios podrn
visualizar contenido Silverlight sin requerir ningn
privilegio administrativo.
d
o
t
N
e
t
M
a
n

a
<
<
56
dnm.todonet@qa
<<
T
o
d
o
t
N
e
t
.
q
a
@
d
o
t
n
e
t
m
a
n
i
a
.
c
o
m

T
o
d
o
t
N
e
t
.
q
a
@
d
o
t
n
e
t
m
a
n
i
a
.
c
o
m
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled=true />
<! ... ->
</system.serviceModel>
Traducido al castellano por Marino Posadas
Por qu se necesitan privilegios de administrador para instalar Silverlight? Qu se puede hacer al
respecto?
using System.ServiceModel.A ctivation;
[A spNetCompatibilityRequirements(
RequirementsMode = A spNetCompatibilityRequirementsMode.A llowed)]
public class TimeService : IService
{
// ...
}
d
o
t
N
e
t
M
a
n

a
<
<
58
desvn
Marino Posadas
How virtualization improves softwa-
re development es un excelente artcu-
lo de Daniel Dern sobre las ventajas de
la virtualizacin en todas las fases del desarrollo, donde se ana-
liza cmo han sido los programadores (para crear sus entornos
de pruebas) los que ms han hecho por introducir estas tcnicas
en la empresa. Disponible en http://www.computerworld.com/
action/article.do?command=viewArticleBasic&articleId=9127785&
source=rss_news.
Mike James discute en C# 4.0
goes dynamic - a step too far? las
nuevas caractersticas de C# 4.0 en
cuanto a la adopcin de opciones propias de los lenguajes din-
micos. Lo bueno, lo malo y lo que quedar pendiente. Puede
leerse en http://www.developerfusion.com/article/9789/c-40-goes-
dynamic-a-step-too-far.
Project Astoria Team Blog. El seguimiento
constante de los avances del equipo de
desarrollo de ADO.NET Data Services,
en http://blogs.msdn.com/astoriateam. Con
webcasts accesibles desde ah y vdeos de
sus actividades.
Pluralsight. Muy buenos artculos aporta
este portal de bloggers, avalado por cono-
cidos divulgadores como Fritz Onion,
quien acaba de publicar Creating JSON-enabled WCF servi-
ces in .NET 3.5. Pero hay mucho material valioso ah dentro.
Recomendamos un vistazo a la lista de colaboradores actualiza-
da: http://www.pluralsight.com/community/blogs/fritz.
Wise Registry Cleaner 3.92. Herramienta para mantener el
Registro de Windows limpio de los restos de programas
desinstalados, con un motor de reconocimiento rpido y
seguro. Tras el anlisis, permite que el usuario estudie si
lo considera necesario los problemas encontrados y su
descripcin detallada. Adems, todos los cambios reali-
zados pueden deshacerse posteriormente. Disponible en
http://www.majorgeeks.com/download5437.html.
documentos en la red
utilidades del mes
sitios del mes
El reconocimiento tcnico de los grandes
genios de la informtica
Ninguna tecnologa se ha desarrollado ms que la informtica ni ha pasado a
formar parte de la vida cotidiana en los ltimos 20 aos de una forma tan espec-
tacular como las mltiples aplicaciones que la informtica tiene hoy. Sin embar-
go, el reconocimiento de aquellos que han hecho los grandes descubrimien-
tos no ha trascendido a la cultura popular. Ya, ya s que todo el mundo cono-
ce a Bill Gates y Paul Allen, Steve Jobs y Steve Wozniak y a algunos ms
de los CEO de las grandes compaas. Un cierto porcentaje de programado-
res conoce tambin a los grandes creadores de lenguajes, como Brian Ker-
nighany Dennis Ritchie (autores del lenguaje C), Bjarne Stroustrup (crea -
dor de C++), James Gosling (Java), Anders Hejlsberg (autor principal de
C# y de buena parte de la plataforma .NET), y poco ms Tim Berners-
Lee y Vinton Cerf se convirtieron en personajes populares en nuestro pas a
raz de la obtencin del Premio Prncipe de Asturias, por su labor fundamen-
tal en la popularizacin de Internet. Pero al lado de los cientos de innovacio-
nes que se han sumado para hacer posible lo que la informtica es ahora, son,
como dice el dicho popular, cuatro gatos
No obstante, s que existen reconocimientos oficiales de estos logros,
y tambin otros de tipo ms corporativo, que sus promotores estn empea-
dos en dar a conocer.
En el lado oficial, cabe destacar los Premios Alan Turing (Turing Awards),
concedidos anualmente por la Association for Computing Machinery, de EE.UU.,
que han ido ganando importancia a travs de los aos. En esta revista tuve la
suerte de publicar una entrevista -dotNetMana n12- con uno de los recepto-
res de este prestigioso premio, James Gray, tristemente desaparecido en el mar
el ao pasado. Estos galardones han premiado a algunos de los citados ms arri-
ba, de los que se puede decir sin lugar a duda que son todos los que estn, aun-
que por razones de espacio- no estn todos los que son. Con los Nobel pasa lo
mismo. Si el lector quiere echar un vistazo a los resmenes biogrficos de todos
los Premios Turing hasta el ao 2007 (el de 2008 se nombrar en breve), pue-
de verlos en mi pgina http://www.elavefenix.net/Biografias.aspx.
Pero stos no son los nicos reconocimientos pblicos vinculados a la
Informtica. Al pairo de los anteriores han ido surgiendo otros, ms o menos
especficos, que premian diversos aspectos de la actividad que nos ocupa. En
esta categora, la medalla John von Neumann es quiz la ms reconocida, y
curiosamente ha duplicado algunos de sus premios, como sucede con los entre-
gados a Ole-Johan Dahl y Kristen Nygaard los noruegos creadores de la
teora de la programacin orientada a objetos, o Douglas Engelbart (creador
del ratn, investigador de Microsoft Research y perceptor del Premio Turing
en 1997 y del Von Neumann en 1999). Pero todava hay ms, como los pre-
mios Dijkstra (computacin distribuida), Eckert-Mauchly (arquitectura de orde-
nadores), Loebner (Inteligencia Artificial), Grace Murray Hopper (de tipo
general), Gdel (Teora de la Computacin), Donald Knuth (Teora de la Com-
putacin en la prctica), y un largo etctera de un carcter ms particular.
Pero las grandes corporaciones tambin desean que aquellos que han sido
el alma mater de los desarrollos que despus se han convertido en populares
obtengan la visin pblica que merecen. En el caso de Microsoft, esta mencin
recibe el nombre de Technical Fellow, y entre otros, la poseen los antes cita-
dos Hejlsberg y Engelbart, adems de Butler Lampson (otro perceptor de
varios de los premios anteriores), Dave Cutler, Brad Lovering o Mark Rus-
sinovich. La lista completa (22 miembros) aparece en la pgina http://www.micro-
soft.com/presspass/exec/techfellow, y el propio Bill Gates afirm recientemente que
espera que a este grupo se unan Ray Ozzie y Craig Mundie, quienes actual-
mente lideran la visin tecnolgica de la compaa.
firma.firma.firma.firma
Technibbles Computer Repair Utility Kit. El sitio Technibble
ofrece esta utilidad para la gente de TI (y para cualquie-
ra a quien le guste tener su ordenador a punto), que es
una pequea joya. Technibbles Computer Repair Utility
Kit es un conjunto de 57 utilidades que pueden ejecutar-
se desde un USB Pen Drive, y que incluyen herramien-
tas para ficheros, para la red, reparadores, utilidades de
seguridad y mucho ms. Se puede descargar gratuitamente
de la direccin: http://www.technibble.com/computer-repair-
utility-kit.

Вам также может понравиться