La arquitectura .NET
Introducción
El Framework .NET es el elemento central de las aplicaciones. Gestiona la ejecución, la asignación de memoria, los permisos. La arquitectura .NET está compuesta principalmente por dos componentes: por un lado, el CLR (Common Language Runtime) y por otro, las bibliotecas de clases.
Desde ahora el .NET Core está disponible. Se trata de un subconjunto del Framework .NET que aporta las siguientes ventajas:
-
Portabilidad: el código puede portarse en diferentes plataformas para así maximizar la reutilización de código.
-
Modularidad: las soluciones pueden integrar únicamente las librerías útiles para no sobrecargar las aplicaciones desarrolladas.
-
Open source: los códigos fuentes están disponibles en GitHub (https://github.com/dotnet/) y permiten a todo el mundo contribuir a su desarrollo.
En lo que se refiere específicamente a las aplicaciones Windows, el despliegue no ha evolucionado. Esto quiere decir que una aplicación se apoya en la instalación del Framework .NET en la máquina destino. Si el Framework .NET no está instalado, se pedirá al usuario que lo instale. En el caso de que la aplicación use una librería .NET Core no incluida en el Framework .NET, esta se incrustará en el paquete de la aplicación.
CLR
El CLR es el entorno de ejecución de las aplicaciones. Es multilenguaje gracias al CLS (Common Language Specification), que es un conjunto de reglas que todo compilador que cree aplicaciones que se van a ejecutar con CLR, tiene que respetar. La potencia del CLR consiste en combinar varios ensamblados, independientemente del lenguaje en el que se han escrito. De esta manera, una aplicación escrita en C# podrá referenciar y utilizar una librería escrita en VB.
Para llegar a este nivel de compatibilidad, el compilador convierte el código a lenguaje intermedio, (IL) que permite ser interpretado de la misma manera independientemente del lenguaje en el que se ha escrito el código. La compatibilidad de los tipos entre los diferentes lenguajes está garantizada por el CTS (Common Types System). Cada tipo básico de un lenguaje, tiene un equivalente en el Framework .NET y, por tanto, en lenguaje intermedio. Así, un integer en VB y un int en C# serán del mismo tipo System.Int32.
Una vez compilada, una aplicación se resume en, al menos, un archivo ejecutable. Éste está en lenguaje intermedio. Cuando la ejecución se lanza, el CLR examina el manifiesto para determinar si se respetan las condiciones de seguridad. Si es así, el CLR crea un proceso para alojar la aplicación y el compilador JIT (Just In Time) transforma el código compilado en lenguaje intermedio...
Las bibliotecas de clases
El Framework .NET está compuesto de varias bibliotecas de clases, clasificadas en espacios de nombres, los cuales están organizados de manera jerárquica a partir del espacio de nombres raíz System. Por tanto, las funcionalidades relacionadas se clasifican dentro de un mismo espacio de nombres. System.IO, por ejemplo, reagrupa los tipos que tienen como objetivo interactuar con el sistema de archivos.
A continuación, se muestran algunos espacios de nombres que se utilizan habitualmente:
Espacio de nombres |
Descripción |
System |
Espacio de nombres raíz. Contiene los tipos básicos del Framework .NET. |
System.Collections |
Contiene los tipos que permiten crear y gestionar las listas y las tablas. |
System.Data |
Contiene los tipos necesarios para la manipulación y la comunicación con las bases de datos. |
System.Drawing |
Contiene el conjunto de tipos que permiten gestionar el renderizado gráfico y el tratamiento de elementos visuales. |
System.IO |
Contiene el conjunto de clases que permiten interactuar con el sistema de archivos. |
System.Windows.Forms |
Contiene todos los tipos que permiten la creación de aplicaciones Windows, ya sean formularios o controles. |
Estas bibliotecas de clases se pueden consultar a través del explorador de objetos, desde el menú Ver - Examinador de objetos ([Ctrl][Alt] J):
No es raro necesitar bibliotecas...
Los tipos
El Framework .NET está compuesto de dos conjuntos de tipos: los tipos por valor y los tipos por referencia. Para almacenar los datos, el CLR tiene dos zonas de memoria: la pila y la cola.
La pila funciona del siguiente modo: el último en entrar es el primero en salir. Esta zona va a alojar en memoria las variables del programa. De esta manera, cuando se llama a una función, sus parámetros se almacenan en la pila y si esta función llama a otras, las variables se ubican por encima de las anteriores. Al terminar la ejecución de la función, las variables quedan inaccesibles y se eliminan de la pila, liberando la memoria ocupada.
La cola es una librería reservada para el almacenamiento de los objetos reutilizables. El CLR gestiona las entradas y salidas de este espacio memoria de manera automática, gracias a la recuperación de la memoria. Este proceso siempre está activo. Es inútil destruir explícitamente los objetos dentro de la aplicación. El colector se ejecuta en un proceso de baja prioridad. Esta prioridad puede aumentar si la memoria necesita vaciarse más rápidamente. El inconveniente principal es que no es posible conocer con exactitud el momento en el que será destruido un objeto. Como consecuencia, no se puede manejar el momento de ejecución del código asociado a esta destrucción. Las clases que necesitan...