Para llegar más lejos
El diseño con GDI+
Durante el desarrollo de una aplicación, la capa de abstracción de Windows permite no tener que escribir código para un componente particular. Es el caso, por ejemplo, de las tarjetas gráficas: hay muchas, todas diferentes. Por este motivo la capa GDI (Graphics Device Interface) está a disposición de los desarrolladores. Se comunica con esta API y se encarga de la relación con Windows, a continuación, la información pasará por el driver de la tarjeta gráfica y, por último, a la pantalla. En el Framework .NET, esta API se conoce con el nombre de GDI+. Está repartida en seis espacios de nombres:
-
System.Drawing: este espacio de nombres contiene la mayor parte de las clases, estructuras y otras definiciones básicas para la programación gráfica.
-
System.Drawing.Design: este espacio de nombres contiene las clases útiles para el desarrollo de la interfaz gráfica durante la fase de diseño en Visual Studio.
-
System.Drawing.Drawing2D: este espacio de nombres proporciona la mayor parte de las clases para el diseño en dos dimensiones, principalmente el diseño vectorial, las transformaciones geométricas y los efectos visuales como el anti-aliasing.
-
System.Drawing.Imaging: este espacio de nombres proporciona las clases que permiten gestionar la manipulación de las imágenes.
-
System.Drawing.Printing: este espacio de nombres proporciona las clases que permiten simplificar la impresión de contenido en formato texto e imagen.
-
System.Drawing.Text: este espacio de nombres contiene las clases que simplifican la manipulación de las fuentes de caracteres.
1. La clase Graphics
La clase Graphics se utiliza principalmente en la visualización. Un objeto Graphics representa una superficie de diseño para un elemento. Éste puede ser un formulario, un botón o una etiqueta. Esta clase realiza la operación de visualización de los elementos visuales.
Un objeto Graphics no se puede instanciar directamente mediante su constructor. Se debe crear directamente a partir del elemento visual. Las clases que derivan de la clase Control exponen el método CreateGraphics, que devuelve una referencia al objeto Graphics asociado:
Forms.Main main = new Forms.Main();
System.Drawing.Graphics graphics = main.CreateGraphics();...
El remoting
El remoting le permite utilizar el acceso remoto en sus aplicaciones para que se puedan comunicar entre ellas. Se puede tratar de aplicaciones residentes en la misma máquina o en máquinas diferentes que pertenezcan a la misma red o a redes diferentes.
1. Introducción
El remoting consiste en mover los objetos por la red. Este principio se basa en el packaging de los objetos (marshalling y unmarshalling). El marshalling es el principio de transformación de un objeto para que pueda circular entre aplicaciones. El unmarshalling es el proceso inverso.
El Framework .NET proporciona tres protocolos de formato en el espacio de nombres System.Runtime.Remoting.Channels:
-
TCP (System.Runtime.Remoting.Channels.Tcp) con un empaquetado binario.
-
HTTP (System.Runtime.Remoting.Channels.Http) con un empaquetado SOAP.
-
IPC (System.Runtime.Remoting.Channels.Ipc), este protocolo de comunicación es más rápido que los protocolos TCP y HTTP, pero solo se puede utilizar para comunicaciones entre aplicaciones en una misma máquina.
El siguiente esquema ilustra como se comunican las aplicaciones remotas:
El proxy es una capa intermedia creada y gestionada por el Framework .NET. Se encarga de dirigir las peticiones del cliente hacia el servidor y, a la inversa, para recuperar las respuestas. Las comunicaciones no se realizan por tanto de manera directa con el servidor o el cliente, sino con el proxy.
2. La implementación
Vamos a construir una aplicación de chat sencilla, en la que el funcionamiento cliente/servidor encaje con los principios del remoting. El primer paso durante la creación de una aplicación cliente/servidor es proporcionar una interfaz que permita exponer los miembros tanto al cliente como al servidor. A continuación, se crean el servidor y el cliente en dos aplicaciones distintas.
a. La capa común
Para que el cliente se pueda comunicar con el servidor, debe conocer los métodos disponibles. Las clases comunes se deberán distribuir en la aplicación cliente y servidor.
Para simplificar la distribución de la capa común, vamos a crear una librería.
Cree un nuevo proyecto Librería de clases llamada RemotingLibrary en la solución, declare la clase Chat de la siguiente manera:
using System;
namespace RemotingLibrary
{
public class Chat: MarshalByRefObject ...
La reflexión
Los ejemplos de esta sección están disponibles en el proyecto Reflection.
El Framework .NET expone en el espacio de nombres System.Reflection las clases que permiten acceder a los metadatos de un ensamblado, enumerar los tipos y sus miembros. Este espacio de nombres incluye muchas clases, entre ellas las más comunes son las clases Assembly, Module, MethodInfo, FieldInfo, PropertyInfo o EventInfo.
1. La clase System.Type
La clase Type del espacio de nombres System está en el núcleo del proceso de reflexión. Esta clase modeliza los tipos y permite conocer detalles como su nombre, su espacio de nombres o si son de tipo por valor o por referencia.
Puede obtener un objeto Type a partir de una instancia del objeto llamando al método GetType, que hereda de la clase Object:
int i = 1;
Type tipoInt = i.GetType();
Console.WriteLine(tipoInt.FullName);
Console.WriteLine(tipoInt.Namespace);
Console.WriteLine(tipoInt.Name);
La salida del ejemplo anterior es la siguiente:
System.Int32
System
Int32
La palabra clave typeof también permite recuperar un objeto Type relacionado con el tipo que se pasa como argumento de la palabra clave:
Type tipoString = typeof(string);
Console.WriteLine(tipoString.FullName);
Console.WriteLine(tipoString.Namespace);
Console.WriteLine(tipoString.Name);
La salida del ejemplo anterior es la siguiente:
System.String
System
String
La clase Type contiene muchísimas propiedades para describir un tipo. Examine la ventana de las Variables locales para descubrirlas:
2. Cargar un ensamblado de manera dinámica
La clase abstracta Assembly permite cargar un ensamblado a partir de un archivo compilado...