martes, 20 de mayo de 2014

Receta No. 3-1 en C#: Creación de un Dominio de Aplicación (Application Domain)

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 ¿Qué es un dominio de aplicación (application domain)?
3.2 Propiedades de un dominio de aplicación
3.3 Arquitectura ejemplar de un dominio de aplicación
3.4 Creación de un dominio de aplicación
3.5 Descarga de un dominio de aplicación
4. Práctica: Código Fuente C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Vamos a empezar con una nueva serie de recetas bastante útiles para conocer acerca de dominios de aplicación (applications domains), reflection, y metadatos. Precisamente, en esta receta nos vamos a concentrar en una de las tareas más esenciales relacionadas con los dominios de aplicación: cómo crear un dominio de aplicación. Veremos varios de los artefactos del Framework .NET para comprender su y aplicación en nuestros proyectos de construcción de software.

1. Problema

La compañía de construcción de software MuchoSoftware ha acudido a nosotros en busca de una asesoría acerca del uso del Framwork .NET para la creación de aplicaciones robustas, seguras, estables, &c. Nos ha solicitado que les asesoremos, primero que todo, en la arquitectura de la CLR para la carga de aplicaciones en los procesos del sistema operativo, y de la explicación del modelo de seguridad que provee el mecanismo anterior.

2. Solución

Nuestro equipo de asesores de Microsoft Framework .NET ha detectado enseguida sobre la información que requiere nuestro nuevo cliente (i.e., MuchoSoftware): ellos buscan conocer sobre la gestión que realiza la máquina virtual de .NET -CLR-, para localizar los recursos y datos necesarios para la ejecución segura de una aplicación creada bajo este Framework. Nosotros tenemos la respuesta: los dominios de aplicación (o en inglés, application domains).

3. Discusión de la Solución

Ya tenemos definida la necesidad de nuestro cliente. Ahora entremos en los detalles que competen sobre nuestra propuesta de solución.

3.1 ¿Qué es un dominio de aplicación (application domain)?

El sistema operativo Windows posee cientos de procesos que se ejecutan primer o segundo plano. Estos procesos permiten localizar los recursos, además de los datos, requeridos por las aplicaciones que se ejecutan en este entorno. Por ejemplo, una instancia del editor de código fuente Notapad++ requiere de la asignación de memoria física y datos para operar. (Evidentemente, cada instancia nueva de Notepad++ lo va a requerir).

El modelo arquitectural basado en procesos garantiza que si una aplicación falla, sus ocurrencias, errores, excepciones, &c., no va a afectar a las aplicaciones vecinas. Esto facilita la gestión automática de las tareas duras que es responsable el sistema operativo: creación de procesos, asignación dinámica de recursos, instanciación de hilos de ejecución para cada proceso, finalización/suspensión de procesos, entre muchas más.

Este funcionamiento es análogo al de un dominio de aplicación. Un dominio de aplicación es un contenedor (o mecanismo) que se ejecuta dentro de la CLI (Common Language Runtime). La CLI se encarga de aislar cada aplicación para evitar que una afecta a la otra. Ademas, y de acuerdo con [2], un dominio de aplicación tiene asignado un espacio de memoria virtual en el cual se asignan el espacio de memoria requerido para los recursos utilizados por este.

3.2 Propiedades de un dominio de aplicación

A continuación las similitudes (a nivel de propiedades) entre un proceso de sistema operativo y un dominio de aplicación [1]:
  • Un dominio de aplicación puede contener n cantidad de hilos de ejecución.
  • Detener una aplicación contenida en un dominio de aplicación no afecta a las demás aplicaciones que se hallen en el proceso.
  • Las fallas, errores, excepciones, entre otros defectos de una aplicación en un dominio de aplicación no afecta a sus vecinas.
  • Cada dominio de aplicación tiene asignada información descriptiva propia. Esta información no está relacionada con el proceso en el que se ejecuta el dominio de aplicación.
  • Los dominios de aplicación pueden contener diferentes niveles de acceso de seguridad.
  • No existe un método directo de interrelación entre el código de un dominio con otro.

3.3 Arquitectura ejemplar de un dominio de aplicación

En la Figura 1 [3] se muestra la arquitectura ejemplar de distribución de dominios de aplicación:
Arquitectura ejemplo de distribución de dominios de aplicación
Figura 1. Arquitectura ejemplo de distribución de dominios de aplicación [3].
Además, en la Figura 2 [6] se muestra cómo los assemblies integrados en un dominio de aplicación se puede distribuir en varios procesos.
Procesos de SO con uno o varios dominios de aplicación.
Figura 2. Procesos de SO con uno o varios dominios de aplicación [6].

3.4 Creación de un dominio de aplicación

A continuación el proceso de creación de un dominio de aplicación en el lenguaje de programación C#:


En la línea 25 utilizamos la versión sobrecargada del método CreateDomain [8] (clase AppDomain [7]) que recibe como parámetro un objeto string que representa el nombre del nuevo dominio (este nombre es legible para el humano). (En la Figura 3 se muestran todas las versiones sobrecargadas de CreateDomain).
Versiones sobrecargadas del método CreateDomain (clase AppDomain)
Figura 3. Versiones sobrecargadas del método CreateDomain (clase AppDomain) [9].

> Prueba de ejecución.

Resultado:
Resultado proceso creación de un dominio de aplicación.
Figura 4. Resultado proceso creación de un dominio de aplicación.

Antes de pasar a la siguiente sub-sección, mencionaré otros artefactos relacionados con dominios de aplicación:

3.4.1 Objeto Evidence

Un objeto Evidence [10] (namespace System.Security.Policy) define la información de políticas de seguridad de los dominios de aplicación: permisos sobre archivos, ejecución, inter-comunicación con otros dominios, etc.). (Veremos su funcionamiento en entregas de recetas y artículos posteriores).

3.4.2 Clase AppDomainSetup

La clase AppDomainSetup [11] consiste en un contendedor de la información relacionada de un dominio de aplicación [1]. En la Figura 5 [1] se enumeran algunas de las propiedades comúnmente usadas de esta clase:
Propiedades (recurrentes) de la clase AppDomainSetup
Figura 5. Propiedades (recurrentes) de la clase AppDomainSetup [1].

3.5 Descarga de un dominio de aplicación

Esta operación nos puede resultar de gran utilidad cuando hayamos dejado de usar un dominio de aplicación para liberar los recursos (por ejemplo). Veamos cómo se descarga un dominio de aplicación en C#:



Resultado:
Resultado de descarga de un dominio de aplicación
Figura 6. Resultado de descarga de un dominio de aplicación.

4. Práctica: Código Fuente C#

Veamos código fuente C# donde se demuestra la creación de un dominio de aplicación con detalles adicionales (evidencia, restricciones, directorio raíz, entre otros más):


> Prueba de ejecución.

Resultado:
Creación de AppDomain con ajustes
Figura 7. Creación de AppDomain con ajustes.

5. Conclusiones

En esta receta hemos tenido la gran oportunidad de introducirnos en otro término interesante: el de los dominios de aplicación. La creación y descarga de dominios son operaciones básicas que las podemos lograr con estos artefactos: AppDomain.CreateDomain() y AppDomain.Unload. En general, vimos que los AppDomains son contenedores de assemblies que separan una aplicación de otra para evitar conflictos y acceder a recursos asignados por los procesos de forma eficiente. Nos extenderemos más sobre estos temas en las siguientes recetas.

Glosario

  • Application domain
  • Contenedor
  • Descarga
  • Dominio de aplicación
  • Evidencia
  • Modelo
  • Recurso
  • Seguridad

Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Application domain - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Application_Domain
[3]: Y tú, ¿dominas tus aplicaciones? | Diario de un Dotnetero - http://www.dotnetero.com/2006/10/y-tu-dominas-tus-aplicaciones.html
[4]: How to: Unload an Application Domain - http://msdn.microsoft.com/en-us/library/c5b8a8f9(v=vs.110).aspx
[5]: What ASP.NET Programmers Should Know About Application Domains - http://odetocode.com/articles/305.aspx
[6]: Arquitectura de Sistemas Informáticos: Dominios de aplicaciòn en .NET (App Domains) - http://metodologiasdesistemas.blogspot.com/2008/04/dominios-de-aplicacin-en-net-app.html
[7]: AppDomain Class (System) - http://msdn.microsoft.com/en-us/library/system.appdomain(v=vs.110).aspx
[8]: AppDomain.CreateDomain Method (String) (System) - http://msdn.microsoft.com/en-us/library/47e8e141(v=vs.110).aspx
[9]: AppDomain.CreateDomain Method (System) - http://msdn.microsoft.com/en-us/library/system.appdomain.createdomain(v=vs.110).aspx
[10]: Evidence Class (System.Security.Policy) - http://msdn.microsoft.com/en-us/library/system.security.policy.evidence(v=vs.110).aspx
[11]: AppDomainSetup Class (System) - http://msdn.microsoft.com/en-us/library/system.appdomainsetup(v=vs.110).aspx


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.