jueves, 29 de mayo de 2014

Receta No. 3-6 en C#: Ejecutar un Assembly en otro Dominio de Applicación

Tabla de Contenido

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

0. Introducción

En esta receta vamos a aprender a ejecutar un assembly en un dominio de aplicación diferente al anfitrión. Esta tarea consiste en crear un assembly (ejecutable para el caso que corresponde), luego crear una aplicación de demostración, y desde esta última ejecutar el assembly en un nuevo AppDomain. Esta tarea va a requerir el uso de varios nuevos artefactos del Framework .NET: ExecuteAssembly, or ExecuteAssemblyByName. Ambos métodos de la clase AppDomain (N:System).

1. Problema

Ya sólo no basta con crear tipos y cargarlos en un dominio de aplicación distinto (como lo que aprendimos en la receta Crear Tipos que Operen entre Diferentes Dominios de Aplicación); ahora requerimos cargar un assembly con todos sus tipos (i.e., clases, interfaces, enumeraciones, eventos, delegados) en otro dominio de aplicación. Esto es necesario para facilitar la segmentación estructural de los módulos que puedan integran una aplicación basada en la arquitectura de componentes.

2. Solución

Recurriremos a nuevos (en nuestro contexto) artefactos (métodos precisamente) de la clase AppDomain [2]: ExecuteAssembly y ExecuteAssemblyByName.

3. Discusión de la Solución

Contextualizamos ambos métodos en las siguientes sub-secciones.

3.1 Método ExecuteAssembly

El método ExecuteAssembly [3] permite ejecutar un assembly sobre un dominio específico (sobre una instancia de AppDomain que lo invoca). El método ExecuteAssembly es un método sobrecargado. Trabajaremos con la versión que requiere el nombre del archivo del assembly. Esta es su firma [4]:

public int ExecuteAssembly(string assemblyFile)

El parámetro assemblyFile corresponde con la ruta del archivo absoluta.

Comprendamos mejor el uso de este método a través del siguiente ejemplo:

1. Creemos un assembly ejecutable:


(El archivo no contiene nada nuevo de lo que hemos visto hasta el momento.)
2. Compilamos:


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

3. Ahora creamos el archivo que permitirá la ejecución del assembly recién creado en otro dominio de aplicación. Pero debemos colocar una copia del archivo AssemblyEjemplo.exe en la carpeta C:\shared.

Archivo UsoNuevoAssembly.cs:

Compilamos:


  1. csc /target:exe UsoNuevoAssembly.cs

Resultado:
Ejecución de assembly con AppDomain.ExecuteAssembly(string)
Figura 1. Ejecución de assembly con AppDomain.ExecuteAssembly(string).

3.2 Método ExecuteAssemblyByName

El método ExecuteAssemblyByName [6] que permite cargar un assembly especificando su nombre nombre completo. Posee varias firmas (método sobrecargado). Para ejemplificar usaremos la firma [7]:

public int ExecuteAssemblyByName(string assemblyName)

1. Vamos a reusar el archivo NuevoAssembly.cs; lo compilamos tal cual como lo hicimos arriba.

2. Creamos el siguiente archivo para probar directamente el método ExecuteAssemblyByName(string):

Archivo UsoExecuteAssemblyByName.cs:

3. Compilamos:


  1. csc /target:exe UsoExecuteAssemblyByName.cs

Resultado:
Ejecución de assembly con AppDomain.ExecuteAssemblyByName(string)
Figura 2. Ejecución de assembly con AppDomain.ExecuteAssemblyByName(string).

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

En esta sección práctica vamos a reutilizar el assembly creado en la compilación dentro de sí mismo. Usaremos el método ExecuteAssembly, previamente crearemos un dominio de aplicación para cargar ese mismo assembly dentro del nuevo AppDomain.


Compilación:


  1. csc /target:exe EjecucionRecursivaAssembly.cs

Antes de ejecutar, es importante hacer una copia a la carpeta C:\shared del archivo EjecucionRecursivaAssembly.cs.

Resultado:
Figura 3. Ejecución recursiva de un assembly.

5. Conclusiones

En pocas palabras podemos decir que la infraestructura de artefactos del Framework .NET posibilita la creación y ejecución de assemblies en diferentes dominios de aplicación de forma muy intuitiva y fácil; en las definiciones que vimos arriba: ExecuteAssembly y ExecuteAssemblyByName, comprobamos que este proceso es así. El ejemplo en la sección práctica integra varios conocimientos: creación de assemblies (tarea que se realizó recursivamente), la creación de un nuevo dominio, y la ejecución del assembly recién creado sobre este último.

6. Glosario

  • AppDomain
  • Assembly
  • Dominio de aplicación
  • Recursivo
  • URL

7. 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]: AppDomain Class (System) - http://msdn.microsoft.com/en-us/library/system.appdomain(v=vs.110).aspx
[3]: AppDomain.ExecuteAssembly Method (System) - http://msdn.microsoft.com/en-us/library/system.appdomain.executeassembly(v=vs.110).aspx
[4]: AppDomain.ExecuteAssembly Method (String) (System) - http://msdn.microsoft.com/en-us/library/sxx9f4c2(v=vs.110).aspx
[5]: How to execute code in another AppDomain that the current one | C# Coding and .NET Technologies - http://dotnetgalactics.wordpress.com/2010/04/06/how-to-execute-code-in-another-appdomain-that-the-current-one/
[6]: AppDomain.ExecuteAssemblyByName Method (System) - http://msdn.microsoft.com/en-us/library/system.appdomain.executeassemblybyname(v=vs.110).aspx
[7]: AppDomain.ExecuteAssemblyByName Method (String) (System) - http://msdn.microsoft.com/en-us/library/fdf11asa(v=vs.110).aspx


J

No hay comentarios:

Publicar un comentario

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