Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Mace Windu en 9 Enero 2009, 16:34 pm



Título: Conceptos de la arquitectura .NET Framework
Publicado por: Mace Windu en 9 Enero 2009, 16:34 pm
Conceptos de la arquitectura .NET Framework

El .NET Framework es un entorno de ejecución de aplicaciones informáticas sobre el que se ejecuta cualquier programa desarrollado en .NET en cualquiera de sus lenguajes (VB.NET, Visual C++ .NET, Visual C# .NET, Visual J#, NetCOBOL, etc.).
Forma parte de Microsoft .NET que incluye además herramientas de programación (Visual Studio .NET), servidores (Windows 2003 Server o SQL Server), software cliente (Windows XP, Windows CE, Office XP), etc.)

Además, ofrecen un entorno de ejecución común, su instalación es transparente, se acabó el fin de las incompatibilidades de DLL y otros componentes y las capacidades son las mismas en todos los lenguajes .NET

Arquitectura de .NET Framework

(http://xs226.xs.to/xs226/08183/presentaci_n1376.png) (http://xs.to)

El entorno común de ejecución (Common Language Runtime, CLR) administra el código en tiempo de ejecución y proporciona los servicios básicos (administración de memoria, control de excepciones, control de hilos de ejecución).

Biblioteca de clases base (Base Class Library, BCL) es una colección de código OO que puede ser empleado desde cualquier lenguaje .NET. Contiene los tipos básico, clases para entrada/salida, seguridad, etc.
Al tener definidos los tipos de datos para todos los lenguajes, facilita el intercambio de datos entre aplicaciones desarrolladas en distintos lenguajes.

La capa de datos y XML gestiona el acceso a los datos y el tratamiento de datos XML. Los datos los gestiona mediante ADO.NET y gran parte de la información de .NET (configuración, estructura de archivos y de aplicaciones) se gestiona mediante XML.
También aporta facilidad para importar, exportar y tratar datos de/hacia XML.

ASP.NET utiliza Web Forms (para aplicaciones Web basadas en ASP) y los servicios Web. Windows Forms proporciona un conjunto de componentes de interfaz para desarrollar aplicaciones cliente basadas en Windows.

Common Language Runtime

(http://xs226.xs.to/xs226/08183/dibujo2183.png) (http://xs.to)

El cargador de clases (Class Loader) llama al puntero de inicio del procedimiento, establece su entorno de memoria y mantiene la ejecución bajo control.

El control de recursos: recolector de basura, control de la pila, administrador de códigos.

El control de excepciones, el control de seguridad y el  compilador de código nativo interaccionan con el sistema operativo(NOTA; el código intermedio debe compilarse a código nativo).

Las clases base definen el entorno de trabajo sobre el que se apoya el código.

Especificación del lenguaje común (CLS)

El CLS es un conjunto de directivas proporcionadas por Microsoft para el desarrollo de lenguajes compatibles con .NET.
Fijan las características comunes a los lenguajes y los fabricantes pueden ampliarlas o modificarlas.
Una aplicación no debería hacer uso de las características ampliadas cuando se comunique con otros componentes .NET.

Actualmente están desarrollados o en fase de desarrollo más de 50 lenguajes .NET.

Los lenguajes .NET son más parecidos entre si que otros lenguajes clásicos. Por lo tanto, su velocidad de ejecución es bastante similar. La elección de un lenguaje u otro no dependerá de la velocidad de ejecución.
También se garantiza la interoperabilidad entre lenguajes. Todos utilizan los mismos tipos basados en el Sistema de tipo común (Common Type System, CTS) y la posibilidad de crear una aplicación con componentes desarrollados en distintos lenguajes.
Por todo ello, la curva de aprendizaje para un nuevo lenguaje .NET es menor.

Como muestra de ello, un mismo ejemplo del clásico "Hola mundo" en distintos lenguajes .NET

En VB.NET:

Código
  1. Public Class MiPrograma
  2.   Shared Sub main()
  3.      System.Console.WriteLine("¡Hola mundo!")
  4.      System.Console.ReadLine()
  5.   End sub
  6. End Class
  7.  

En C#:

Código
  1. public class MiPrograma{
  2.   static void main(){
  3.      System.Console.WriteLine("¡Hola mundo!");
  4.      System.Console.ReadLine();
  5.   }
  6. }

En J#:

Código
  1. public class MiPrograma{
  2.   public static void Sub main(Strings args[]){
  3.      System.Console.WriteLine("¡Hola mundo!");
  4.      System.Console.ReadLine();
  5.   }
  6. }

Lenguaje intermedio de Microsoft (MSIL)

Los compiladores .NET no producen código nativo (código binario ejecutable directamente por el procesador), si no que producen código intermedio (MSIL o simplemente IL).
Se trata de una especie de lenguaje máquina asociado a un procesador virtual que no corresponde a ninguna CPU disponible en la actualidad.

El compilador de código nativo (compilador JIT, Just-In-Time) de la CLR es el que se encargará de compilar "al vuelo" el código IL a lenguaje nativo de la plataforma donde se ejecute la aplicación.
Esta característica permitirá que el código de una aplicación .NET pueda ejecutarse en otra plataforma distinta sin ningún cambio (siempre y cuando exista un CLR para esa plataforma).

(http://xs227.xs.to/xs227/08184/3510.png) (http://xs.to)

Ensamblados, manifiestos y metadatos

Un ensamblado es la unidad de instalación de una aplicación .NET. Está compuesto de uno o más archivos de recursos y de archivos ejecutables MSIL (módulos administrados).
Los módulos administrados contienen código IL y metadatos que describen los tipos del módulo.
Un ensamblado tendrá un archivo ejecutable portable (PE) que se generará al compilar la aplicación a MSIL. Este archivo será .exe o .dll y no podrá ejecutarse si no está contenido en un manifiesto de ensamblado.

Los ensamblados crean un límite de seguridad, pues es la unidad donde se solicitan y conceden los permisos.
También, crean un límite de tipos, la referencia a un tipo incluye el nombre del ensamblados en que reside.
Además, del límite de tipos, también existe un límite de ámbito de referencia.
El manifiesto del ensamblado contiene metadatos para resolver los tipos: especifica que tipos se exponen fuera del ensamblado y enumera los tipos de ensamblado de los que depende.
En adición, forma un límite de versión, por lo que todos los recursos de un ensamblado pertenecen a la misma versión.
Por otra parte, crean la unidad de implementación. Al arrancar una aplicación sólo deben estar presentes los ensamblados a los que llama la aplicación inicialmente. El resto se recuperan a petición.

Este es el fin al problema de versiones. Las aplicaciones Win32 requieren que los componentes que utiliza estén especificados como entradas del registro. Dos aplicaciones distintas pueden usar el mismo componente, pero con versiones distintas.

Los ensamblados son autodescriptivos, es decir, no dependen de las entradas del registro. La instalación de aplicaciones se simplifica, ya que sólo es necesario copiar los directorios donde están contenidos los recursos a los que llama el ensamblado.
Con éste se instala siempre la versión adecuada de los componentes.

Modelo de ejecución

(http://xs227.xs.to/xs227/08184/4502.png) (http://xs.to)

.NET Framework no es un interprete de bytecode como la máquina virtual Java, pues no traduce las instrucciones una a una, ya que compila todo el método a la vez.
El tiempo de carga inicial es despreciable, porque no carga toda la aplicación a la vez. Además, no necesita utilizar técnicas de optimización de bajo nivel.

El compilador Just-in-Time

(http://xs227.xs.to/xs227/08184/5286.png) (http://xs.to)

El compilador JIT estándar realiza una compilación completa, optimizando el código y verificando su integridad.

El EconoJIT está diseñado para aplicaciones en el que la velocidad de descarga es importante (aplicaciones ASP.NET) o cuando se ejecuta  en dispositivos con recursos ilimitados (Windows CE).
Además, no realiza una optimización del código y permite el rechazo de código.

El generador de imágenes nativas (NGEN) genera código en tiempo de instalación y mejora de rendimiento en casos especiales.

Además, no implica la utilización de código nativo de forma directa.

La biblioteca de clases

La biblioteca de clases (BCL) es un conjunto de clases que permiten a todos los lenguajes .NET realizar tareas comunes (entrada/salida, acceso a BBDD, interfaz de usuario, etc.)

Su forma de acceso es común a todos los lenguajes. Mantiene la interoperabilidad entre lenguajes que se ajustan al CLS. También permite su modificación mediante herencia.

Espacios de nombre

Los espacios de nombres o Namespaces organizan la infinidad de clases de la BCL. Para utilizar los tipos de la BCL de un espacio de nombres concreto se utiliza la notación de punto.
Esto permite agrupar espacios de nombres y clases relacionadas bajo una raíz común.
Por ejemplo, System.Data guarda las clases relacionadas con el acceso a datos, System.Windows.Forms guarda las clases de interfaz para las aplicaciones basadas en formularios Windows...

Cada espacio de nombres se puede guardar en una o varias DLL. La ubicación física no tiene porqué guardar correspondencia con la organización lógica de los Namespaces.

El concepto de espacios de nombres permite ampliar la biblioteca con clases propias de una forma coherente.

Para crear nuevos Namespaces em VB.NET, por ejemplo, se utiliza la declaración Namespace...End Namespace

Código
  1. Namespace CPH
  2.    Namespace MiProyecto
  3.        Class MiClase
  4.        ...
  5.        End Class
  6.    End Namespace
  7. End Namespace

Para utilizar un espacio de nombres ya creado y no usar el nombre completamente cualificado, en VB.NET, se utiliza la declaración Imports. Esta declaración, no importa nada, simplemente añade el Namespace cuando no se utiliza un nombre completamente cualificado.

Código
  1. Imports CPH.MiProyecto
  2. ...
  3. Dim xxx As New MiClase()
  4. 'Sería lo mismo que utilizar New CPH.MiProyecto.MiClase()

El ensamblado CPH (una biblioteca de clases) incluye 3 espacios de nombres:

Código
  1. 'En el ensamblado CPH
  2. Namespace MiProyecto1
  3.    Public Class MiClase
  4.  
  5.    End Class
  6.  
  7.    Public Class MiClase2
  8.  
  9.    End Class
  10. End Namespace
  11.  
  12. Namespace MiProyecto2
  13.    Public Class MiClase3
  14.  
  15.    End Class
  16. End Namespace
  17.  
  18. Namespace MiProyecto3
  19.    Public Class MiClase4
  20.  
  21.    End Class
  22. End Namespace

La aplicación importa 2 Namespaces, por lo que no tiene que utilizar el nombre cualificado para las clases Clase3 y Clase4:

Código
  1. Imports CPH.MiProyecto1
  2. Imports CPH.MiProyecto2
  3.  
  4. Module Modulo1
  5.    Sub Main()
  6.        Dim a As Class1
  7.        Dim b As Class2
  8.        Dim c As MisClases.Class3
  9.        Dim d As MisClases.Class4
  10.    End Sub
  11. End Module




En este artículo he descrito algunos de los conocimientos que hay que conocer a la hora de trabajar sobre .NET. Cualquier duda o crítica sobre el artículo, háganla aquí por favor.

Salu2