Compact Framework .NET 2.0

Anuncio
Compact Framework .NET 2.0
Adrián Couñago Silva
Índice
Índice......................................................................................................... 1
1. Introducción........................................................................................ 2
2. Diferencias de .NET Compact Framework ...................................... 3
2.1. Respecto .NET Framework .......................................................... 3
2.2. Respecto .NET Compact Framework 1.0..................................... 3
3. Generalidades y novedades Compact Framework 2.0 .................. 9
3.1. Generalidades CF........................................................................... 9
3.2. Novedades .....................................................................................10
4. Optimizando Compact Framework 2.0 ...........................................13
4.1. Motor de ejecución .......................................................................14
4.2. Colector de basura .......................................................................14
4.3. Excepciones ..................................................................................15
4.4. Windows Forms ............................................................................15
4.5. Servicios web ................................................................................15
5. Mejoras y avances en CF 2.0 ...........................................................17
5.1. Interfaz de usuario ........................................................................17
5.2. Controles de Windows Forms .....................................................17
5.3. Gestión de pantalla .......................................................................18
5.4. Dibujo personalizado ....................................................................19
5.5. Control de teclado.........................................................................19
5.6. Gestión de datos ...........................................................................20
5.7. XML .................................................................................................20
5.8. Seguridad y criptografía ...............................................................21
5.9. Threadings .....................................................................................21
6. Conclusiones.....................................................................................22
7. Glosario..............................................................................................23
8. Referencias ........................................................................................27
1
1. Introducción
Todos los servicios actuales de telecomunicaciones e informática tienden a la exigencia de la
movilidad. El desarrollo de aplicaciones para dispositivos móviles es cada vez mayor.
Las principales restricciones de estos equipos son los recursos finitos de energía así como la
capacidad de procesado y memoria. Los dispositivos móviles deben ser pequeños así que el uso de
periféricos como el teclado o el ratón es impensable. La interoperabilidad con el usuario esta
restringida debido al compromiso entre la movilidad y el tamaño.
En este contexto nace la necesidad de crear herramientas de trabajo que nos permitan desarrollar
aplicaciones para este tipo de equipos.
Compact Framework es la una de las herramientas que se ha creado con este fin. Esta herramienta
nos permite adaptar aplicaciones, que usaríamos en un equipo de sobremesa, a un nuevo entorno
móvil.
Con las nuevas capacidades de transmisión de datos aparecen nuevos servicios y prestaciones.
Necesitamos renovar nuestras herramientas de trabajo de acuerdo a estos cambios. CF como
herramienta ha evolucionado para satisfacer las nuevas necesidades.
En este estudio se pretende definir las características y novedades que aporta Compact Framework
.NET 2.0 disponible en la nueva plataforma Microsoft Visual Studio .NET 2005. Es un estudio
orientativo y gran parte de la información recabada pertenece a las propias fuentes de Microsoft como
señalamos en las referencias.
Compact Framework 2.0 ofrece muchas mejoras sobre su predecesora versión (1.0) Cabe destacar
que las posibles variaciones entre ambas versiones son muchísimas y trataremos las más
destacables y las trataremos de forma superficial.
Básicamente podríamos destacar los siguientes objetivos que persigue la nueva versión:
•
Mejorar la productividad del desarrollador
•
Proveer mayor compatibilidad con el marco completo Framework .NET
•
Aumentar la ayuda para las características del dispositivo
En Compact Framework 2.0 destacan sus nuevas características y la integración del marco .NET
como citamos anteriormente, así por ejemplo existen numerosas características que pueden
introducir variaciones que veremos posteriormente. Son el caso de, por ejemplo, gestión de basura,
servicios web XML, acceso a datos, soporte a criptografía, excepciones...
Aparte de las características de la nueva versión repasaremos también brevemente como se lleva a
cabo alguna de las optimizaciones de la versión posterior, las actualizaciones que hubo y la nueva
versión vigente.
Por último, hablaremos sobre alguna de las conclusiones que hayamos podido extraer de la
información leída y este propio estudio.
2
2. Diferencias
2.1. Respecto .NET Framework
Además, en la siguiente figura podemos hacer un repaso básico sobre los namespaces y librerías de
clases disponibles para CF respecto el paquete Framework .NET completo.
Fig 1. Namespaces y librerías de clases
2.2. Respecto .NET Compact Framework 1.0
Debemos saber que CF 2.0 cumple con todos los namespaces disponibles en la versión anterior
excepto unos tipos y métodos que comentaremos. Según esto siempre se cumplirá el siguiente
esquema:
.NET
CF 1.0
.NET CF
2 .0
Fig 2. CF 1.0 como subconjunto de la versión 2.0
3
Las diferencias se pueden clasificar según:
Descripción
Prestaciones y/o diferencias
Clases y Tipos
Compact Framework soporta como dijimos un
subconjunto de librerías de clases de Framework
.NET. Este subconjunto está destinado para el
diseño de aplicaciones con una serie de
limitaciones
que
corren
en
dispositivos
generalmente móviles y que también tienen una
serie de limitaciones.
COM Interop
Disponibles en la versión 2.0 de CF.
Common Language Runtime
Encargado de operaciones como el gestor de
basura, compilación de código Just in Time y
otras. Existe aproximadamente el 12% del total
del Common Language Runtime de Framework
.NET
Controles
En esta asignatura hemos podido comprobar que
la gran mayoría de controles de Windows Forms
disponibles en un formulario de aplicación común
están también disponibles para CF. Así como
existen controles específicos de CF.
Directorio actual
La funcionalidad de directorio actual no está
presente en Windows CE, por lo que Compact
Framework
no
soporta
los
métodos
GetCurrentDirectory y SetCurrentDirectory. No
obstante,
propiedad
Compact
Framework
WorkingDirectory
posee
para
la
obtener
información sobre el proceso de inicio.
Datos
CF contempla un subconjunto de ADO .NET e
incluye también el proveedor de datos SQL
Server Mobile. No está soportado el namespace
System.Data.OleDb.
Debugging en la consola de comandos
La posterior versión de Compact Framework no
soporta el nuevo debugger (MDbg.exe) por línea
de comandos que provee la versión 2.0. El
antiguo
debugger
(DbqCLR.exe)
fue
descatalogado en la versión 2.0 de Framework
.NET.
4
Despliegue de aplicaciones
Desplegar aplicaciones es tan fácil como copiar
el
assembly
al
dispositivo
que
queramos
utilizando un cable desde el puerto de conexión
del PC de sobremesa. En la nueva versión de
Visual Studio, se pueden desplegar directamente
sobre el dispositivo en el momento de debugar.
Trazo de diagnóstico
Compact
Framework
.NET
no
soporta
la
configuración de archivos de trazo pero se
pueden usar contadores de funcionamiento.
Objetos dispuestos
Framework
.NET
no
garantiza
que
estén
accesibles las propiedades y métodos que un
objeto siempre tuvo disponibles. Sin embargo,
acceder
a
algunas
propiedades
como
la
propiedad Text en el entorno Framework resulta
normalmente satisfactorio. En cambio, debido a
la implementación y a las diferencias que existen
entre Framework .NET y CF .NET el acceso de
propiedades y métodos pueden fallar en CF
.NET.
Codificación y localización
Compact
Framework
depende
del
sistema
operativo en relación a los datos de clases, por
lo que los resultados de las clases pueden ser
inesperados para algunas culturas. CF .NET no
soporta ajustes en per-thread CurrentUICulture.
Eventos
CF .NET soporta los eventos GotFocus y
LostFocus pero no soporta los eventos Activated
y Desactivated.
Secuencias de descripción de excepciones
Compact Framework provee secuencias de
descripción de excepciones mediante mensajes
de error separados en una DLL diferente
(System.SR.DLL). También permite que cada
uno pueda crear sus propias secuencias de
excepción para otras culturas con el objetivo de
localizar aplicaciones.
Nombres de archivo y rutas
Windows CE resuelve un nombre de fichero sin
información de ruta como si estuviese en el
directorio raíz del dispositivo, no en el directorio
de la aplicación desarrollada. Para asegurar la
consecución de operaciones se debe especificar
información acerca de la ruta absoluta.
5
Alta resolución
El recurso HiDPI se añadirá automáticamente en
los proyectos de VS 2005.
Entrada/Salida
Debido
a
las
diferencias
entre
sistemas
operativos, existen apremios y restricciones en el
modelo
de
E/S.
CF
.NET
no
provee
notificaciones de cambio de archivos.
Instalación y ficheros CAB
Es
posible
utilizar
ficheros
CAB
y
crear
aplicaciones MSI para distribuirlas.
Lenguajes
Compact Framework 2.0 soporta el desarrollo
utilizando VB y VC#, en cambio no soporta el
actual C++.
Matemáticas
Los métodos matemáticos no están disponibles
en su totalidad en todas las plataformas, sin
embargo, están incluidas en la API para su
compatibilidad.
Memoria
Compact Framework 2.0 está optimizado para
sistemas alimentados por baterías y nos avisa de
grandes usos de RAM o de ciclos de CPU.
Red
CF .NET provee clases compatibles con la
tecnología
IrDA
conexiones
con
mediante
el
objetivo
infrarrojos
de
y
crear
también
incluye clases de escucha para peticiones HTTP
al dispositivo.
Test de funcionamiento
CF .NET no soporta perfiles de código o el
archivo Perfmin.exe en Monitor de Sistema. Sin
embargo,
se
pueden
usar
contadores
de
funcionamiento.
Código Proxy
CF .Net no soporta todo el código generado por
la herramienta de descripción de lenguaje de
servicios web (WDSL).
Reflection
Compact Framework no soporta el namespace
System.Reflection.Emit.
CF
actualmente
no
soporta el operador de equidad (==) en objetos
de
comparación
tales
como
MethodInfo,
FieldInfo, PropertyInfo, EventInfo, MemberInfo,
MethodBase, ConstructorInfo y ParameterInfo.
Se pueden utilizar hasta 64 bits usando el campo
OpCodes.Shl. Cualquier especificación superior
será reseteada con 64 bits.
6
Control Remoto
CF no permite control remoto.
Mensajería segura
Compact Framework no soporta certificados del
cliente ni autenticación mediante HTTPS. Sólo
es posible usar autenticación básica.
Seguridad
Existen
importantes
diferencias
y
consideraciones que comentaremos.
Serialización
Debido al tamaño y a consideraciones de
funcionamiento, no se soporta la serialización
binaria utilizando el “BinaryFormatter” (visto en la
asignatura) o serialización SOAP mediante el
“SoapFormatter”.
Sin
embargo,
es
posible
la
serialización
mediante la transmisión de objetos de datos
utilizando SOAP en servicios web XML y la
serialización de datasets con XML.
Tamaño
CF tiene alrededor del 8% del paquete completo
de Framework .NET. El tamaño que ocupa en el
disco duro es de un 50% más pequeño debido a
la compresión de archivos de sistemas de
Windows CE.
Sockets
No todas las opciones de Sockets están
disponibles en CF.
Threads
Existen
hasta
cuatro
threads
creados
por
Compact Framework .NET.
Intervalos de tiempo
El valor retornado desde “Now” se especifica
únicamente en segundos, no milisegundos. Se
puede obtener una medida precisa mediante la
propiedad “TickCount”.
Temporizadores
Los métodos “Start” y “Stop” disponibles en un
objeto
tipo
System.Timers.Timer
no
son
soportados, pero es posible parar e iniciar el
temporizador utilizando la propiedad booleana
“Enabled”
disponible
en
System.Windows.Forms.Timer.
Objetos My en VB
CF soporta la característica de VB de los objetos
My, exceptuando los siguientes objetos My:
My.Application,
My.Computer,
My.User
y
My.Settings.
7
Web Services
Los servicios web del cliente ejecutan el archivo
wsdl.exe generado directamente por el código.
No se pueden montar servicios web sobre un
dispositivo como host local porque el host local
se refiere al dispositivo que ejecuta la aplicación
como en el dispositivo mismo. En lugar de esto,
se debería usar el nombre de otra máquina o la
dirección IP.
XML
Debido a numerosas consideraciones, CF no
soporta la validación del esquema XML. Pero sí
soporta el Modelo de Objeto de Documento
(DOM).
8
3. Generalidades y novedades
3.1. Generalidades
Como sabemos, Compact Framework es un subset de Framework .NET. Consiste en una serie de
librerías de clases y tiene algunas clases adicionales específicas para dispositivos que requieren
movilidad. CF .NET se ejecuta sobre el compilador de altas prestaciones JIT. El “Common Language
Runtime” (CLR) está construido especialmente para CF por lo que resultan códigos finales mucho
más eficientes para esta clase de dispositivos. Debemos imaginar las limitaciones que supone utilizar
estos dispositivos como por ejemplo su memoria, los recursos y sobretodo el consumo de baterías y
el tiempo limitado de estas. Para soportar aplicaciones diseñadas con CF los dispositivos deben
hacer uso de una plataforma que lo permita, esta es el sistema operativo de Microsoft diseñado para
este objetivo. El sistema utilizado es una parte reducida del sistema conocido como Windows CE.
CF es compatible con los siguientes dispositivos y plataformas de desarrollo:
Versión Dispositivo
Plataforma
1.0
Pocket PC
Pocket PC 2000, Pocket PC 2002, Windows Mobile 2003 para
Pocket PC, Windows Mobile 2003 para Pocket PC SE,
Windows Mobile Version 5.0 y software para Pocket PC
1.0
Smartphone
Windows Mobile 2003 para Smartphones
Windows Mobile Version 5.0 software for Smartphone
1.0
Otros dispositivos Windows CE 4.1
Windows CE 4.2
Windows CE
Windows CE 5.0
2.0
Pocket PC
Windows Mobile 2003 para Pocket PC, Windows Mobile 2003
para Pocket PC SE, Windows Mobile 5.0 software para Pocket
PC
2.0
Smartphone
Windows Mobile Version 5.0 software para Smartphone
2.0
Otros dispositivos Windows CE 5.0
Windows CE
Recordemos que Smartphone 2002 no soporta CF pero sí Smartphone 2003
En relación con lo anterior, podemos ver una clasificación de los diferentes dispositivos para los que
podemos diseñar, bajo qué versión de Windows CE funciona y las capacidades que aporta. Esto lo
podemos observar en la siguiente figura:
Fig 3. Dispositivos, versiones CE y capacidades
9
La arquitectura de Compact Framework cumple con el siguiente esquema:
Fig 4. Arquitectura de Compact Framework .NET
3.2. Novedades
Como dijimos, la nueva versión de Compact Framework aporta numerosas novedades. Debemos
recordar que Compact Framework .NET proviene de Framework .NET por lo que muchas de estas
novedades y/o mejoras suponen la incorporación de nuevas clases y métodos que provienen de
Framework .NET o bien optimizaciones de las clases y métodos existentes.
P.ej:\\ En el proyecto del juego Snake que tenemos, debíamos utilizar threads. System.Threading
pertenece a Compact Framework y, por supuesto obligatoriamente, a Framework .NET.
Lamentablemente, no disponíamos de los métodos Abort() y Join() en la versión 1.0 mientras que en
CF 2.0 están disponibles.
Compact Framework 2.0 añade una nueva característica en C#, es que permite incluir el
direccionamiento mediante eventos en un código delegado como mostramos en el siguiente ejemplo:
P.ej:\\
Antes en VS 2003:
this.menuItem8.Click += new System.EventHandler(this.menuItem8_Click);
private void menuItem8_Click(object sender, System.EventArgs e)
{
//CODIGO A EJECUTAR
}
En VS 2005 donde se dispone de CF 2.0:
this.menuItem8.Click += new System.EventHandler(sender,args);
//EL OBJETO sender Y EL EVENTO args YA PUEDEN INICIALIZAR EL EVENTO CONTROL
DEL MENUITEM, ESTOS DOS INDICAN EL CODIGO QUE SE DEBE EJECUTAR Y EL EVENTO
SECUNDARIO LANZADO
Criptografia
Se añaden nuevas características de soporte a criptografía. Estas son:
•
Certificados de seguridad X.509
•
Hashing: MD5 y SHA1
•
Encriptación simétrica: RC2, RC4, 3DES, DES
•
Encriptación asimétrica: RSA, DSA
10
DataSet
Otras nuevas implementaciones son las realizadas en la clase System.Data.DataSet. Este alberga el
método GetChanges y otros métodos disponibles en el namespace System.Data.
Eventos
En las excepciones también existen sustanciales cambios, se incluye un evento para cuando el índice
cambia en un TabControl, otro para el cambio del valor de una TrackBar, se añaden eventos en vista
de árbol (Treeview) y todos los eventos de selecion de objeto en un ComboBox o ListBox, como por
ejemplo el evento SelectedIndexChanged.
Excepciones
Se implementan excepciones en casos que antes no se contemplaban, más que nada suponemos
que como medio de ayuda al desarrollador.
P.ej:\\
CF 2.0 incluye un método llamado Substring perteneciente a la clase String que lanza una excepción
si el índice de inicio es mayor que la longitud del string. En la versión posterior, cuando depuramos la
aplicación se para cuando llegamos a este punto.
Red
En cuanto a red, también podemos destacar varias mejoras como la compatibilidad para el futuro
protocolo de Internet Ipv6, así como optimización de la serialización mediante XML. Además CF 2.0
soporta SOAP 1.2 y los siguientes protocolos de autenticación: Negotiate, NTLM y Kerberos.
En CF 2.0 disponemos de encolamiento de mensajes, las clases disponibles en el namespace
System.Messaging están disponibles como también se implementa soporte para clases parciales,
luego pueden usarse en VS2005 cuando se crea un nuevo proyecto.
Control del teclado
La clase RegistryKey está disponible y por tanto se pueden hacer accesos al registro de Windows, la
profundidad máxima de la clave de un registro es de 15 ya que es la limitación que pone Windows CE
Con la nueva versión podemos acceder a puertos serie, se puede soportar hasta 4 puertos
simultáneamente. Además de todo esto, también existen nuevas clases disponibles en la nueva
versión de SQL Mobile Edition.
XML
En relación a los textos en XML, que antes mencionamos sutilmente podemos añadir que se
incorpora la clase XmlSerializer así como los namespaces System.Xml.Xpath y System.Xml.Schema
Se definen tres tipos de My objects: My.Resources Object, My,WebServices Object y My.Forms
Object.
Threads
Además de disponer los métodos Join() y Abort() para los threads que antes comentamos, también se
incluyen los métodos BeginInvoke, EndInvoke y parámetros útiles con el método Invoke.
11
Aunque la compilación en línea de comandos es soportada en versiones anteriores de CF, la nueva
versión provee más facilidad y soporte para la compilación y la debugación mediante una Terminal de
comandos.
Controles
CF cuenta con nuevos controles disponibles en Microsoft.WindowsCE.Forms, más adelante
repasaremos qué mejoras presentan los formularios de Windows y el objeto Graphics utilizado en el
proyecto de Snake.
Librería de clases soportadas y no soportadas por el Compact Framework:
Compact Framework es compatible con el 28 por 100 de las librerías que se encuentran en la versión
completa. Algunas de las prestaciones que no soporta el CF son las siguientes:
•
ASP .NET
•
Gestión remota del dispositivo nativo.
•
Funcionalidad como servidor Web.
•
Desarrollo de aplicaciones en C++, J# y JSP.
•
Seguridad por palabra clave.
Sin embargo ofrece algunas funcionalidades propias que no se encuentran en la versión completa
como son:
•
Microsoft.WindowsMobile.DirectX
•
Microsoft.WindowsMObile.DirectX.Direct3D
•
Microsoft.WindowsCE.Forms
•
Infrared Connections
•
System.Data.SqlServerCe
La necesidad de librerías propias relacionadas con el movimiento de gráficos en 3D y de controles
con DirectX se debe a la menor capacidad del procesador del equipo nativo entre otras limitaciones.
Los formularios se han readaptado al nuevo tamaño de pantalla y a la manera de gestionar los
eventos producidos por el usuario. Se han incluido librerías propias relacionadas con la gestión de
los sockets y la transmisión de datos a través de infrarrojos. La librería SQLServer permite la
interoperabilidad con las bases de datos de un servidor SQL móvil.
Algunas de estas funcionalidades requieren la instalación de herramientas específicas para ser
utilizadas. Un ejemplo es un kit propio de desarrollo para la versión 5.0 de Windows Mobile,
normalmente llamados paquetes SDK.
12
4. Optimizando Compact Framework
Muchas de las diferencias que distinguen la versión de Compact Framework con su predecesora es
precisamente la optimización de muchas de sus principales características. Es decir, de una versión a
su posterior, además de agregar funciones inexistentes, se realizan mejoras que aumentan la
eficiencia de ejecución de la aplicación. Debemos recordar que este es uno de los objetivos
primordiales que busca el programador.
Así podemos destacar, por ejemplo, las particularidades relacionadas con el almacenaje de variables
en memoria donde podemos distinguir los siguientes elementos:
•
Almacenaje – Flash/ROM
•
Memoria física
•
Memoria virtual – 32 MBytes por proceso
Compact Framework 2.0 está diseñado según:
•
Cubrir el 28% del total de Framework .NET
•
Compilador Just in Time (JIT) para dispositivos móviles (generación rápida de código)
•
Llamadas virtuales interpretadas
•
Carga escasa de metadatos
En resumen, podemos consultar la siguiente tabla donde se encuentran algunas de las llamadas y la
optimización que han tenido al respecto de sus versiones predecesoras y distinguidas según su
optimización se vea incrementada por su tamaño o tiempo de ejecución. La tabla es la siguiente:
Grande
es mejor
Pequeño
es mejor
Podemos comprobar como algunas de las características destacadas en la tabla aumentan su
eficiencia dependiendo las llamadas por segundo, iteraciones, bytes por segundo o segundos. Estas
unidades de medida se distinguen en las que mejoran minimizándolas o maximizándolas.
Para la medida del funcionamiento y la optimización del mismo se utilizan más contadores de
funcionamiento con el objetivo de verificar los tiempos de ejecución que se desean obtener o
13
simplemente los tiempos que han logrado conseguir los desarrolladores de la nueva versión. A esto
se le añaden estadísticas que ayudan a conseguir el objetivo marcado. Estos contadores los
podríamos resumir en:
•
De utilización genérica
•
De utilización para interoperaciones COM
•
Control de threadings
•
Objetos GUI
•
Control de actividad de red (bytes recibidos/enviados por socket)
Cabe destacar que también se añaden nuevos colectores de basura (GC) que optimizan el espacio
estático disponible ya que eliminan posibles variables y/u objetos que no serán utilizados dado que
sus tiempos de latencia son también menores.
4.1 Motor de la ejecución
En relación a la optimización de llamadas podemos distinguir dos tipos:
•
Llamadas controladas (requieren más recursos que las nativas)
1. Llamada a instancias
2. Llamada virtual
3. Invocación de plataforma:
•
Propiedades: son llamadas
El compilador de ejecución JIT es el mismo en todas las versiones, no obstante se han incluido
también optimizaciones como son el método “inlining” para métodos simples, registro de variables y
en aspectos internos de la secuencia de ejecución del compilador.
Gracias a las mejoras aportadas en las llamadas a funciones se han obtenido resultados muy
interesantes donde, por ejemplo, una llamada a una función virtual se reduce el tiempo de ejecución
en un 30% del valor anterior.
4.2 Colector de basura (GC)
El colector de basura de Compact Framework realiza más rápidamente las asignaciones de espacio,
concretamente de 7.5 bytes/segundo.
Lo más importante es que el propio colector de basura gestiona su propia pila en bloques de 64
KBytes y 1 Mbytes de cache. Además utiliza una función para devolver memoria virtual y física al
sistema llamada VirtualAlloc.
Si existe fragmentación de la información a almacenar, GC puede comprimir su propia pila.
Los elementos que accionan el GC son:
•
Fallo en la localización de memoria
•
Existencia de un millón de objetos localizados por GC
•
Que una aplicación pase a ejecutarse en segundo plano
•
Mediante GC.Collect() método que avisa a GC
En el tiempo en el cuál se ejecuta el colector de basura se realizan las siguientes acciones:
1. Parada de todos los threads mediante un punto seguro
14
2. Encontrar todos los objetos vivos (en uso) y marcarlos
3. Desmarcar los objetos que están inactivos y añadirlos a la cola finalizadora
4. Se compacta la pila del colector de basura si así se requiriese
5. Se retorna el total de memoria libre obtenida al sistema operativo
Todas las mejoras hechas en el colector de basura suponen una increíble eficiencia en contra de la
versión antigua, ya que la localización y gestión de objetos activos e inactivos también es mucho más
eficiente. De esta manera es como se obtienen fantásticos resultados de prueba, donde se sitúan
contadores de tiempo que desvelan un decremento del tiempo de ejecución del 10000%. Mientras en
la versión predecesora un código de prueba producía una cadena de 20040 objetos de secuencia en
memoria en la nueva versión el mismo código obtenía solamente 56 cadenas. Por este motivo
podemos afirmar que el colector de basura es uno de los elementos mejor optimizados o que el salto
dado de una versión a otra es mucho más evidente.
4.3 Excepciones
Las excepciones en la nueva versión de Compact Framework son mucho más eficientes y trabajan en
segundo plano de forma más sutil, haciendo presencia en el momento de lanzar la propia excepción.
Esta es la permisa que busca la nueva versión, ya que normalmente una excepción no entra en juego
hasta que es lanzada y, además, se lanza en circunstancias limitadas. De aquí la importancia de
hacer que consuman menos recursos del sistema.
La nueva versión añade contadores de funcionamiento para controlar el número de excepciones
lanzadas para que el propio sistema a la vez tenga un caudal más constante de trabajo a lo largo del
tiempo, minimizando así los recursos dedicados.
Recordemos, que en el VS2003 ya se incluían las sentencias “try/catch/finally” en lugar de “on
error/go to”.
4.4 Windows Forms
Los formularios de Windows han tenido muchos avances entre los que se encuentran:
•
Carga de formularios en segundo plano.
•
Carga más rápida del formulario.
•
Optimización de buffers para minimizar el parpadeo en la pantalla (hasta un 50% mejor).
•
Renderización previa de imágenes antes de su representación en el formulario: requiere un
tratamiento básico previamente, pero posteriormente aumenta la eficiencia de manipulación
de estas imágenes.
4.5 Web Services
En la nueva versión de CF se ha intentado resolver en la medida de lo posible los embotellamientos
en servicios Web. Normalmente, estos problemas en los servicios Web son debidos a dos problemas
básicos: que la red esté limitando o bien que la propia CPU del dispositivo limite el servicio.
15
Como indicamos antes, se utilizan contadores de funcionamiento que controlan los bytes recibidos y/o
enviados por un socket en concreto. De esta forma se intenta optimizar partiendo de la base que el
servicio vaya alcanzando su límite sin llegar a él maximizando así la eficiencia sin llegar al colapso.
Además de estos contadores, se añade mensajería específica para el control y la gestión de una
sesión de un servicio Web.
Por último, como último recurso se recomienda optimizar el esquema de serialización en el caso de
tener al límite el uso de CPU.
16
5. Mejoras y avances
5.1.
Interfaz de usuario
La interfaz de usuario de Compact Framework se distingue claramente del paquete completo
Framework .NET ya que los controles y el aspecto global de la interfaz se ve empobrecido.
Como hemos visto en clase, el desarrollo de aplicaciones visuales para dispositivos móviles y
smartphones está limitado porque los controles disponibles no son los mismos, las propiedades y
tamaños de las pantallas tampoco y el teclado no ofrece la misma versatilidad que un teclado
convencional.
Los avances recientes en capacidades de exhibición, tales como pantallas de alta resolución y
distintas orientaciones, han hecho el trabajo del desarrollo de la interfaz de usuario una labor más
desafiante.
Para simplificar la tarea de crear interfaces de usuario, Compact Framework 2.0
proporciona nuevas características disponibles para la personalización de la misma.
5.2.
Controles de Windows Forms
A continuación enumeramos los distintos controles que incorpora la nueva versión. Entre algunos de
estos se encuentran:
•
MonthCalendar: es un control de calendario personalizado que provee una visualización
gráfica de la fecha y es bastante útil para que los usuarios seleccionen una fecha de forma
gráfica.
•
DateTimePicker: es un control personalizado para mostrar por pantalla y permitir a los
usuarios introducir una fecha, incluso la hora. Es especialmente utilizada para aplicaciones de
SmartPhones debido a que su combinación de una disposición gráfica reducida y el cómodo
formato de selección de fecha. Cuando queremos mostrar esta información por pantalla, el
control DataTimePicker tiene un aspecto muy similar a un TextBox, sin embargo, cuando el
usuario está seleccionando una fecha, un calendario emergente similar al control
MonthCalendar se muestra por pantalla.
•
WebBrowser: el control WebBrowser encapsula la herramienta Web Browser, provee de altas
capacidades gráficas y expone una gran variedad de eventos que permite a la aplicación la
interacción entre el usuario y el contenido del navegador web además de permitir que la
aplicación tenga comportamientos personalizados (eventos).
•
Notification: este control encapsula la capacidad de notificación que permite a las
aplicaciones para PocketPC enviar una notificación al usuario sin cambiar el contexto en el
que la actividad del usuario transcurre. El texto de la notificación puede ser texto plano o bien
lenguaje HTML. Además para mostrar información por pantalla, las notificaciones pueden
recibir entradas por parte del usuario incluyendo botones HTML y hipervínculos en el propio
texto de la notificación.
•
DocumentList: el control DocumentList provee de un mecanismo estandar para gestionar y
mostrar archivos tales como los que se usan cuando abrimos hojas de cálculo de Excel
Mobile o documentos de texto de Word Mobile. Este control le da la posibilidad al usuario de
navegar por los archivos del sistema, borrar, copiar, mover y renombrar archivos. El usuario
17
también puede usar este control para enviar correos electrónicos y archivos mediante el uso
de puertos infrarrojos, Bluetooth u otros sistemas de comunicación.
•
DataGrid en SmartPhones: en esta versión es posible implementar el control DataGrid sobre
dispositivos SmartPhones. Tal y como para PocketPC, el control DataGrid sobre
SmartPhones soporta configurar el tamaño de las columnas, múltiples estilos de
visualización, manipulación de valores nulos y eventos de selección.
•
LinkLabel: simplemente es un control que permite mostrar hipervínculos en nuestra
aplicación.
•
Splitter: es un control que permite la capacidad de configurar el tamaño de los controles fijos.
•
ToolBar: control que añade una barra de herramientas de Windows capaz de mostrar
imágenes como botones.
•
Controles de usuario: la nueva versión soporta controles de usuario. Con la ventaja añadida
de que en CF 2.0 las aplicaciones pueden crearse gráficamente mediante controles. Tal y
como sucede con el paquete completo Framework .NET de VS2005, en CF 2.0 .NET los
controles de usuario aparecen automáticamente en el control Toolbox y solamente
arrastrándolos sobre el formulario ya los tenemos funcionales en la aplicación.
5.3.
Gestión de pantalla
Como sabemos, la multitud de factores que intervienen en el desarrollo de una aplicación para un
dispositivo móvil (tamaño de ventana, teclado, sin ratón …) requiere que por parte de los
desarrolladores se implementes interfaces que deben ser dinámicas en lugar de estáticas. Esto
quiere decir que se ajusten a las características de cada dispositivo en concreto maximizando las
prestaciones visuales en cada momento.
Aunque en muchas ocasiones esto no es posible (por falta de tiempo, recursos…) Compact
Framework 2.0 intenta simplificar la esta tarea de crear interfaces dinámicas ya que tiene muchas
capacidades de gestión de pantalla.
Entre estas nuevas capacidades podríamos destacar las siguientes:
•
Control Docking: CF 2.0 soporta este control que permite fijar y marcar zonas de controles
que dependen de un control padre. Cuando el padre es redimensionado los controles fijados
también se autoredimensionan rellenando la zona especificada en el control padre. Existe la
posibilidad de rellenar por completo el control padre.
•
Control Anchoring: la nueva versión soporta también el “anclaje” de controles. Este término se
utiliza para denominar a la función que nos permite identificar a uno o más controles y fijar
una distancia respecto el eje o los ejes de control padre. Cuando se lleve a cabo un
redimensionamiento del control padre, los controles “anclados” también se redimensionarán
automáticamente pero conservando la distancia apropiada entre ellos y los ejes del control
padre.
•
Automatic Scrolling: aparte de los controles propios de un formulario de poder hacer “scroll”
en un formulario, se añade la propiedad de Automatic Scrolling. Esta propiedad permite que
cuando está activada (“trae”) se añade automáticamente un control con una “scroll bar” que
18
permite al usuario moverse y encontrar aquellos controles que no están visibles en el
formulario.
•
Automatic Scaling: es una nueva propiedad incluida que indica como el control debe dibujarse
cuando debe mostrase por pantalla con una resolución diferente a la resolución original en el
que fue diseñado.
Además de esto, en la nueva versión de Compact Framework, tal y como sucedía en Framework
.NET, están disponibles los métodos “SuspendLayout” y “ResumeLayout”. Estos métodos están
disponibles en las clases de CF 2.0 y son utilizados en la conjunción con otro grupo de múltiples
eventos relacionados con la reposición o el redimensionamiento de controles hijos.
También se añaden clases gráficas que proveen de información como la resolución de la pantalla
del dispositivo en uso. Por ejemplo, existe una propiedad llamada “DpiX” la que indica el número
de puntos por píxel horizontales o “DpiY” para los verticales.
5.4.
Dibujo personalizado
Para simplificar la creación de interfaces de calidad, CF 2.0 ha añadido un buen número de
características que permiten a las aplicaciones una manejabilidad mayor y más fácil utilizando dibujos
personalizados.
Entre las nuevas características disponibles podemos destacar:
•
Fuentes rotativas: se añade la clase “LogFont” que permite a CF 2.0 disponer en pantalla
texto y el cambio de ángulos de vista y otros efectos de texto.
•
Paleta personalizada: las aplicaciones ahora se pueden crear con un “Pen” de un tamaño y
color personalizado.
•
Bitmaps: como en la versión predecesora es posible trabajar con archivos bitmap. Ahora bien,
se incluyen más opciones cuando creamos los bitmaps y en el momento de salvar el bitmap
en un archivo o bien en un stream. En general, resulta más sencillo visualizar y manipular
bitmaps a través de la combinación de los métodos “LockBits” y “UnlockBits”.
•
Compatibilidad con DirectX: Windows Mobile 5.0 incluye un buen número de funciones para
dibujo en dos y tres dimensiones a través de la implementación nativa de las interfaces
gráficas de programación de DirectX. Las aplicaciones diseñades para un sistema Windows
Mobile 5.0 tienen la posibilidad de utilizar clases propias que están contenidas en el
namespace “Microsoft.Windows.DirectX”.
5.5.
Control de teclado
Actualmente, muchos de los nuevos dispositivos de bolsillo ya incluyen teclado, bien sea reducido
(concentrando varios caracteres en una tecla), interactivo en pantalla, etc. Para permitir que los
desarrolladores tengan la ventaja de utilizar las posibilidades y prestaciones que ofrece la utilización
del teclado, CF 2.0 soporta el uso de teclados.
Se añade una propiedad que permiten ordenar los controles de la aplicación de forma que los
usuarios pueden navegar por ellos utilizando el tabulador.
Asimismo, se añaden eventos de teclado como: KeyUp, KeyDown, KeyLeft, KeyRight y KeyPressed.
19
Además, el control del formulario tiene la propiedad “KeyPreview”. Cuando esta propiedad se
encuentra con el valor booleano “false”, los eventos de teclado se envían directamente hacia el foco
del control. Si está en “true”, todos los eventos se envían mediante una instancia prioritaria al
formulario para ser enviado después al control que en ese momento tenga el foco.
5.6.
Gestión de datos
Los datos son la parte más importante de cualquier aplicación. Las clases orientadas a la gestión de
datos están directamente relacionadas con el nivel de esfuerzo que se requiere la programación para
acceder y trabajar con datos.
Compact Framework .NET provee nuevas clases de datos añadidas a las ya disponibles. Entre las
clases incluidas en la nueva versión son:
•
Clases de acceso a SQL: permite el acceso a bases de datos SQL Server 2005 Mobile. Este
acceso es mucho más rápido y una solución mucho más eficiente, en cuanto a consumo de
recursos del sistema, para el acceso a datos SQL Mobile que la clase DataSet. Tal y como
sucedía en la clase DataSet, “SqlCeResultSet” puede usarse como fuente de datos
enlazados.
•
DataSet: la clase DataSet y las clases relacionadas poseen nuevas características. Estas
características no sólo proveen una gran funcionalidad sino que también intenta acercar la
clase DataSet a lo que viene establecido normalmente en el paquete completo de Framework
.NET.
•
GetChanges y Merge: son métodos que están añadidos en la nueva versión disponible en la
clase DataSet. El método GetChanges retorna una copia del objeto DataSet que contiene
todos los cambios hechos desde la última llamada al método AcceptChanges.
El método Merge fusiona un objeto DataSet combinándolo con otro. Este método es muy útil
sobretodo para fusionar cambios desde un objeto DataSet, retornado por el método
GetChanges, a otro objeto DataSet diferente.
•
Copy: el método Copy retorna un nuevo objeto DataSet que contiene la misma estructura y
datos que el objeto original.
•
Serialización de DataTables: la clase DataTable contiene los métodos WriteXml y ReadXml,
los cuales disponen de capacidades de serialización y deserialización de texto XML de tablas
individuales. Además también soporta pasar DataTables como argumentos de un servicio
Web.
5.7. XML
La versión 2.0 de CF ofrece nuevas prestaciones respecto al procesado de datos mediante XML
respecto de su predecesora. Estas nuevas prestaciones simplifican el trabajo con este tipo de
archivos ya que se incluyen nuevas clases que nos permiten seleccionar nodos del archivo, realizar
búsquedas dentro de cada nodo y la comunicación entre equipos mediante serialización.
20
XmlDocument es la clase que nos permite seleccionar nodos y realizar búsquedas de datos dentro
del mismo archivo.
XmlSerializer mejora las capacidades de serialización respecto de la anterior versión. Permite utilizar
servicios web que utilicen esta tecnología.
XmlSchema permite la creación de archivos XML mediante esquema en tiempo de ejecución de la
aplicación.
5.8. Seguridad y criptografía
La seguridad es un factor a considerar en la gran mayoría de aplicaciones, incluyendo aquellas que
se ejecutan en dispositivos móviles. Además las capacidades de seguridad incluidas en la plataforma
Windows Mobile, CF 2.0 incluye criptografía y protocolos de red.
CF 2.0 brinda soporte a la criptografía, por ejemplo soporta el sistema MD5 y SHA1, como también el
RC2, RC4, 3DES y DES (encriptaciones simétricas) y el RSA o DSA (encriptaciones asimétricas).
Además de la autenticación “Digest” incluida en la versión posterior, la nueva versión incluye soporte
para autenticación NTLM y Kerberos.
5.9.
Threadings
Los cambios que se han realizado en Compact Framework 2.0 aportan a las aplicaciones más control
de los threads e incorporan la clase Thread haciéndola prácticamente idéntica a la clase disponible en
la versión completa de Framework .NET
CF 2.0 añade soporte para threads en segundo plano. Estos son threads que no acaban de
ejecutarse mientras haya threads primarios activos hasta que estos últimos estén terminados. Existe
una propiedad de los threads llamada “IsBackground” con el objetivo de definir los threads de
segundo plano.
Además también incluye método para abortar la ejecución de un hilo llamado “Abort”. Cuando se
llama a este método, se lanza una excepción llamada “ThreadAbortException” y normalmente finaliza
el thread abortado.
Existe la posibilidad de establecer una coordinación entre hilos de ejecución diferentes, es decir
podemos bloquear un thread esperando por el inicio de otro.
CF 2.0 permite la identificación de cada uno de los threads por nombres asignando un string a la
propiedad “Name” existente ahora en esta versión.
Ahora está disponible utilizar ejecución asíncrona de un delegado en un thread de interfaz de usuario.
Hasta ahora en la versión 1.0 sólo se soportaba la ejecución síncrona mediante el método
“Control.Invoke” mientras que en 2.0 se provee el método “Control.BeginInvoke” que ejecuta
asíncronamente el delegado. El método “Control.EndInvoke” retorna el resultado de esta operación.
21
6. Conclusiones
En primer lugar destacar que existen innumerables mejoras en la nueva versión de Compact
Framework 2.0. Además de cubrir un porcentaje mayor del paquete completo de Framework .NET,
también mejora las ya disponibles en la versión posterior, adaptándolas más a las necesidades reales
de los dispositivos y aplicaciones actuales, así como la creación de nuevos métodos con el mismo
objetivo.
En contra de lo anterior, debemos decir que parece que Compact Framework está desarrollado muy
irregularmente. Con esto nos referimos a que el avance en diferentes campos ha sido muy diferente y
no se han llevado a cabo de una forma equitativa. Suponemos que debido, aparte de las nuevas
necesidades tecnológicas, a cuestiones de marketing. Y es que muchos de los grupos de desarrollo
en los que se divide el grupo de trabajo de Microsoft de Compact Framework equiparan la
programación de ciertas clases a nivel de paquete completo mientras que en otros no sucede esto.
Como hemos visto aporta muchas novedades en cuanto a los threads, tema relacionado con el
proyecto de la asignatura. Los métodos y propiedades ahora disponibles quizás se hubieran ajustado
más o de manera más sencilla a los objetivos que perseguíamos en el proyecto.
Resumiendo y como idea general extraemos que la nueva versión de Compact Framework aporta
aquellas novedades que se hacen imprescindibles para la programación de aplicaciones actuales.
Además de la optimización de muchas de las llamadas a métodos ya presentes en versiones
anteriores. Por estas razones suponemos que sería interesante comenzar a migrar nuestra
herramienta de desarrollo .NET por la nueva versión VS2005 disponiendo así de CF 2.0 para el
diseño de aplicaciones sobre PDAs, Smartphones, etc.
22
7. Glosario
A
Active-x
Un conjunto de tecnologías de interoperabilidad independientes del lenguaje, creadas por Microsoft,
que permiten que los componentes de software escritos en diferentes lenguajes funcionen juntos en
entornos de red. Los elementos fundamentales de la tecnología ActiveX son el Modelo de objetos
componentes (COM) y el Modelo de objetos componentes distribuido (DCOM).
ASP
Active Server Pages: Páginas de Servidor Activo. Es la especificación para páginas Web
dinámicamente creadas, con extensión .ASP, con ActiveX y ejecutadas en servidores con Microsoft
Internet Information Server (IIS). Cuando un browser solicita una página ASP, el servidor Web la
genera con código HTML y se la envía.
B
Bytecode
Es un código intermedio más abstracto que el código máquina. Habitualmente se trata como a un
fichero binario que contiene un programa ejecutable similar a un módulo.
C
CLR
Common Language Runtime es el motor en tiempo de ejecución del nucleo de CF. Permite utilizar
servicios como la compilación de diferentes lenguajes de programación entre otras prestaciones.
COM
Es una arquitectura de software desarrollada por Microsoft para construir aplicaciones basadas en
componentes. Los objetos COM son componentes discretos, cada uno con una identidad única, y con
interfaces que permiten su uso desde otras aplicaciones o componentes. Son más versátiles que los
DLLs de Windows porque son completamente independientes del lenguaje, tienen capacidades de
comunicación intraprocesos, y caben fácilmente en un diseño orientado a objetos.
ActiveX también está basado en COM.
D
DES
Data Encryption Standard.Algoritmo de Encriptacion de Estandar. Algoritmo desarrollado por IBM,
utiliza bloques de datos de 64 bits y una clave de 56 bits. Es utilizado por el gobierno americano.
23
DCOM
Modelo de objetos componentes distribuido. Extensiones del Modelo de objetos componentes (COM)
que facilita la distribución transparente de objetos a través de redes y de Internet. DCOM forma parte
de la especificación administrada por The Open Group para la distribución en plataformas.
DIRECTX
Interfaz de programación bajo Windows, que permite acceder directamente al hardware (por ejemplo,
tarjetas gráficas y de sonido). Se suele utilizar para programar juegos en este sistema.
E
F
G
GUI
Interfaz gráfica de usuario (GUI) es un método para facilitar la interacción del usuario con el
ordenador a través de la utilización de un conjunto de imágenes y objetos (iconos, ventanas..)
además de texto.
H
Hash
Un hash o función resumen se refiere a una función o método para generar claves o llaves que
representen de manera unívoca a un documento, registro o archivo.
J
JIT (Just In Time)
Compilación en tiempo de ejecución (también conocida como traducción dinámica) es una técnica
para mejorar el rendimiento de sistemas de programación que compilan a bytecode, consistente en
traducir el bytecode a código máquina nativo en tiempo de ejecución.
K
Kerberos:
protocolo de seguridad muy difundido en entornos Unix y adoptado también por otros sistemas
operativos como, por ejemplo, Windows 2000. Básicamente utiliza una aplicación, el servidor de
autenticación, para validar las contraseñas y los esquemas de cifrado.
L
M
24
MD5
es un algoritmo utilizado para crear firmas digitales. Está orientado al uso con máquinas de 32 bits y
es más seguro que un algoritmo MD4, que puede romperse.
El MD5 es una función hash de un sólo sentido, o sea que toma un mensaje y lo convierte en una
cadena fija de dígitos, también conocida como digest.
Cuando se utiliza una función hash de un sólo sentido, se puede comparar un mensaje digest
calculado contra el mismo digest desencriptado mediante una clave pública para verificar que el
mensaje no fue falsificado. Dicha comparación se denomina "hashcheck".
Metadato:
Los metadatos son información de la información misma. En esencia, intentan responder a las
preguntas quién, qué, cuándo, cómo, dónde y porqué, sobre cada una de las facetas relativas a los
datos que se documentan.
P
PocketPc
PocketPC es un ordenador de bolsillo, también llamado PDA (Personal Digital Assistant). Se trata de
un pequeño ordenador, diseñado para ocupar el mínimo espacio y ser fácilmente transportable que
ejecuta el sistema operativo Windows CE de Microsoft, el cual le proporciona capacidades similares a
los PCs de escritorio.
R
RSA
El sistema criptográfico con clave pública RSA recibe su nombre por la inicial del apellido de sus
inventores: Ronald Rivest, Adi Shamir y Leonard Adleman. Todo usuario de dicho sistema hace
pública una clave de cifrado y oculta una clave de descrifrado. Cuando se envía un mensaje, el
emisor busca la clave pública de cifrado del receptor y una vez que dicho mensaje llega al receptor,
éste se ocupa de descifrarlo usando su clave oculta.
S
SDK
Software Development Kit. Es un paquete de programación que permite desarrollar aplicaciones para
una plataforma específica. Típicamente un SDK incluye una o más APIs, herramientas de
programación y la documentación pertinente.
Serializacion
Codificar una estructura de datos como una tira de bits. Deserializar sería la operación contraria.
SOAP
25
Simple Object Access Protocol. Es un protocolo de mensajería basado en XML y que se usa para
codificar la información en los mensajes de petición y respuesta en servicios Web antes de enviarlos
por la red. Los mensajes SOAP son independientes de cualquier sistema operativo y pueden
transportarse usando una variedad de protocolos de Internet, como SMTP, MIME, y HTTP.
Socket
Un objeto de software utilizado por un cliente para conectarse a un servidor; los componentes básicos
incluyen el número de puerto y la dirección de red del host local.
SQL
Structured Query Language. Lenguaje de programación que se utliza para recuperar y actualizar la
información contenida en una base de datos.
Históricamente, el SQL ha sido el lenguaje favorito para sistemas de administración de bases de
datos corriendo en minicomputadoras y mainframes. Sin embargo, el SQL está teniendo soporte en
sistemas de base de datos para PC porque soportan bases de datos distribuidos (bases de datos
sobre distintos sistemas de computadoras). Esto permite que varios usuarios sobre una LAN accedan
a la misma base de datos simultáneamente.
W
Windows Ce
Variación minimalista del sistema operativo Windows para equipos móviles. Es compatible con los
procesadores Intel x86,MIPS,ARM y SuperH.
X
X509
Es un standard ampliamente usado para definir certificados digitales. El X.509 es actualmente una
Recomendación de la ITU, lo cual significa que aún no ha sido oficialmente definido o aprobado para
su uso estandarizado.Como resultado, las empresas han implementado este standard en distintas
maneras.
XML
Lenguaje universal de marcado para documentos estructurados y datos en la web, mas amplio, mas
rico y mas dinámico que HTML. No solo es un lenguaje de marcado, sino también un metalenguaje
que permite describir otros lenguajes de marcado. Permite el uso ilimitado de los tipos de datos que
pueden utilizarse en Internet, lo cual resuelve los problemas que surgen entre las organizaciones que
deben intercambiar datos procedentes de standards distintos.
26
8. Referencias
Novedades en CF 2.0
•
http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnnetcomp/html/whats_new_netcf2.asp
Formularios y gráficos
• http://msdn2.microsoft.com/en-us/library/hyc18s6t.aspx
Controles
• http://msdn2.microsoft.com/en-us/library/5c632yz4.aspx
Desarrollo para SmartPhones
• http://msdn2.microsoft.com/en-us/library/ms172541.aspx
Diferencias
• http://msdn2.microsoft.com/en-us/library/2weec7k5(en-US,VS.80).aspx
Librerías de CF 2.0
• http://www.mperfect.net/cfBcl/
Soporte Framework y nuevas características
• http://msdn2.microsoft.com/en-us/library/h1ek3akf.aspx
Varios (SmartPhones con CF 2.0)
• http://www.mentores.net/default.aspx?tabid=104&type=art&site=196&par
entid=51
Optimización
• Presentación oficial de Microsoft acerca de CF .NET
27
Descargar