lunes, 2 de junio de 2014

Receta No. 3-7 en C#: Crear una Instancia en un Dominio de Aplicación Diferente

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código Fuente C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En esta nueva receta vamos a conjugar varios de los conceptos aprendidos acerca de dominios de aplicación y la manipulación (carga y descarga) de tipos en tiempo de ejecución entre distintos dominios de aplicación. Presentaré un ejemplo que consiste en crear un manejador (controlador) de plug-ins, de tal manera que logremos un grado moderado de eficiencia y eficacia en la gestión de dominios de aplicación. ¡Empecemos!

1. Problema

Nos llega un nuevo requerimiento (esta vez más complejo) en donde nos piden implantar un método de carga de assemblies más eficiente al que actualmente tenemos implementando en nuestro entorno de producción; de tal manera que la creación de tipos en un dominio de aplicación resulte más fácil y de forma controlada.

2. Solución

Ya hemos identificado los elementos de la biblioteca de clases de Microsoft .NET Framework que requerimos para sofisticar la carga de assemblies; junto con la instanciación de tipos desde un dominio de aplicación diferente: se trata de los métodos CreateInstance y CreateInstanceFrom de la clase AppDomain.

3. Discusión de la Solución

En la receta no. 3-6 conocimos acerca del proceso de ejecución de un assembly en un dominio de aplicación diferente al anfitrión (local); lo anterior lo logramos a través del uso del método ExecuteAssembly de la clase AppDomain. Ahora lo que tenemos que hacer es diseñar un método más sofisticado que nos permita controlar la carga de assemblies e instanciación de tipos de forma más sencilla y controlada. Para lograr esto, recurriremos a los métodos CreateInstance [2] (Mejorar el Rendimiento de una Aplicación Evitando la Carga de Assemblies Innecesarios en Dominios de Aplicación) y CreateInstanceFrom [3] de la clase AppDomain [4].

Continuando, los métodos mencionados también poseen firmas sobrecargados que permiten la instanciación de tipos (usando sus cualquiera de sus constructores disponibles) desde un dominio de aplicación diferentes. A todo lo anterior, se suma los mecanismos de instanciación de los métodos CreateInstanceAndUnwrap [6] y CreateInstanceFromAndUnwrap [7] (Receta No. 3.2 en C#: Crear Tipos que Operen entre Diferentes Dominios de Aplicación),que resultan útil para la obtención de un tipo específico con la simple operación de conversión desde ObjectHandle al tipo específico que queremos manipular.

Tal como lo sugieren en [1], recurriremos a usar una técnica para facilitar la gestión de dominios de aplicación; esto se logra a través de una clase controladora. Esta clase controladora no es más que un tipo MBR (como lo que aprendimos en [9]). Básicamente, estos son los pasos a seguir para la creación y uso de esta clase:
  1. Creación de la clase controladora basada en marshal-by-value [9].
  2. Instanciación de la clase controladora en un dominio de aplicación por medio del método CreateInstance.
  3. Manipulación del dominio de aplicación y su contenido.
  4. Realizar operaciones como:

    - Carga de assemblies,
    - Creación de otros dominios de aplicación (según la demanda),
    - Optimización del uso de recursos en la descarga de dominios de aplicación
En la siguiente sección vamos a poner todos estos pasos en práctica para que el concepto de clase controladora quede afianzado y tengamos una idea fuerte de lo que se trata su naturaleza.

Antes de pasar a la sección práctica, tengamos en cuenta esta advertencia hallada en [1]:
Precaución uso de métodos CreateInstance y CreateInstanceFrom con tipos MBV
Figura 1. Precaución uso de métodos CreateInstance y CreateInstanceFrom con tipos MBV [1].

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

Crearemos la clase controladora a la que llamaremos GestorPlugins. Esta clase nos permitirá instanciar tipos en un dominio de aplicación y crear tipos con constructores distintos al de cero-argumentos.

Archivo de código fuente GestorPlugins.cs [enlace diferente]:
[Nota: En el archivo de código fuente se hayan todos los comentarios del funcionamiento de la clase controladora GestorPlugins.]

Compilación:

  1. csc /target.exe /out:GestorPlugins.exe GestorPlugins.cs

Resultado:

Conclusiones

Las clases controladoras son la pieza clave para la gestión eficiente de carga de assemblies, e instanciación de tipos en dominios de aplicación. También nos facilita la instanciación de tipos con constructores con cero o varios argumentos.

Glosario

  • AppDomain
  • Application domain
  • Assembly
  • Dominio de aplicación
  • Plugin

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]: Assembly.CreateInstance Method (System.Reflection) - http://msdn.microsoft.com/en-us/library/system.reflection.assembly.createinstance(v=vs.110).aspx
[3]: AppDomain.CreateInstanceFrom Method (System) - http://msdn.microsoft.com/en-us/library/system.appdomain.createinstancefrom(v=vs.110).aspx
[4]: AppDomain Class (System) - http://msdn.microsoft.com/en-us/library/System.AppDomain(v=vs.110).aspx
[5]: Receta No. 3-3 en C#: Mejorar el Rendimiento de una Aplicación Evitando la Carga de Assemblies Innecesarios en Dominios de Aplicación - http://ortizol.blogspot.com/2014/05/receta-no-3-3-en-csharp-mejorar-el-rendimiento-de-una-aplicacion-evitando-la-carga-de-assemblies-innecesarios-en-dominios-de-aplicacion.html
[6]: AppDomain.CreateInstanceAndUnwrap Method (System) - http://msdn.microsoft.com/en-us/library/system.appdomain.createinstanceandunwrap(v=vs.110).aspx
[7]: AppDomain.CreateInstanceFromAndUnwrap Method (System) - http://msdn.microsoft.com/en-us/library/system.appdomain.createinstancefromandunwrap(v=vs.110).aspx
[8]: ObjectHandle Class (System.Runtime.Remoting) - http://msdn.microsoft.com/en-us/library/system.runtime.remoting.objecthandle(v=vs.110).aspx
[9]: Receta No. 3.2 en C#: Crear Tipos que Operen entre Diferentes Dominios de Aplicación | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/05/receta-no-3-2-en-c-crear-tipos-que-operen-entre-diferentes-dominios-de-aplicacion.html


J

No hay comentarios:

Publicar un comentario

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