domingo, 17 de agosto de 2014

Pregunta C# (4 de 20): ¿Cómo Obtener la Ubicación de una Aplicación de Consola en C#?

Índice

0. Introducción
1. Contexto
1.1 ¿Qué es una aplicación consola?
1.2 Aplicaciones consola en .NET
2. Obtención de la Ubicación de una Aplicación Consola en Ejecución
2.1 Clase System.Reflection.Assembly
2.2 Método Path.GetDirectoryName(string)
3. Aplicación
4. Recursos
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Esta es la pregunta número 4 (de 20) del curso de Twenty C# Questions Explained de Microsoft Virtual Academy. En esta oportunidad vamos a conocer el proceso para la obtención de la ubicación en disco de un assembly que se haye en ejecución. Esto nos puede resultar útil, por ejemplo, para escribir o leer un archivo binario o de texto directamente desde esa ubicación como recurso de almacenamiento del estado de la aplicación o de la persistencia de los datos del usuario.

1. Contexto

1.1 ¿Qué es una aplicación consola?

Una aplicación consola consiste en un ambiente de trabajo basado en texto. Este ambiente está compuesto naturalmente por dos partes bien definidas:
  1. La entrada estándar: teclado
  2. La salida estándar: el monitor (o la pantalla)
La interacción entre el usuario y el sistema basado en consola se realiza a través de comandos textuales (uso de la entrada estándar). Estos comandos ejecutan operaciones y una vez finalizada su ejecución presentan (aunque no necesariamente) el resultado al usuario en la salida estándar.

Los sistema operativos modernos (e.g., Windows, MacOS, o aquellos basados en Unix) cuentan con este medio de interacción para controlar o llevar a cabo tareas administrativas o inclusive en la actualidad se siguen utilizando software de producción empresarial. En el caso del sistema operativo Windows, éste viene integrado con el programa COM.EXE; con este programa podemos indicar al sistema, por ejemplo, para la navegación entre directorios de usuario o programa, manipular archivos, ejecutar otros programas, etc. En la Figura 1 una captura de pantalla de la ejecución de COM.EXE.
CMD.EXE
Figura 1. CMD.EXE.

Para operaciones administrativas avanzadas del sistema operativo Windows, Microsoft tiene a disposición otro entorno similar al anterior pero aún más robusto y poderoso, debido a que se trata de un marco de trabajo para la automatización y configuración de tareas administrativas gracias a su propio lenguaje de scripting (o instrucciones diseñadas para tareas específicas) [3]: Windows PowerShell.
Windows PowerShell
Figura 2. Windows PowerShell.

1.2 Aplicaciones consola en .NET

Microsoft .NET Framework cuentan con los artefactos de software para la la creación, ejecución de aplicaciones basadas en consola. Estas aplicaciones las podemos crear directamente usando un editor de texto plano (e.g., Notepad++) o de manera más cómoda y ágil sobre el entorno de desarrollo integrado Visual Studio. (Muchos de los seguidores de este blog ya habrán visto que los ejemplos de ejecución se llevan a cabo en un ambiente como este, y que la escritura de los programas de demostración se escriben casi en su totalidad en Notepad++.)

Continuando, en el caso de Visual Studio la creación de una aplicación consola lo podemos hacer siguiendo estos pasos:
  1. Menú File
  2. Submenú New
  3. Comando Project...
  4. Sección Visual C#
  5. Sub-sección Windows
  6. Selección de la plantilla Console Application
  7. Asignamos un nombre y una ubicación al proyecto y a la solución
  8. Clic en OK
Creación aplicación consola en Visual Studio 2013
Figura 3. Creación aplicación consola en Visual Studio 2013.

2. Obtención de la Ubicación de una Aplicación de Consola en Ejecución

Ahora que hemos comprendido los esenciales de lo que se entiende por una aplicación consola, pasemos a explicar los artefactos necesarios para obtener la ubicación de una aplicación de este tipo, además de una demostración en código C# sobre los resultados prácticos de la implementación de estos.

2.1 Clase System.Reflection.Assembly


La clase Assembly [10] (N:System.Reflection) representa la construcción modular de un assembly (cfr. Creación y Uso de un Módulo) en el Framework .NET. Esta clase es capaz de describir los artefactos integrales de la biblioteca de clases del Framework, como también los propios creados por un programador. Además, ofrece miembros (métodos, precisamente) que permiten cargar un assembly en caliente (con esta expresión me refiero a la posibilidad de cargar nuevos artefactos del modelo, o componentes de terceros, una vez el proyecto haya sido construido (build time) el componente).

Lo que nos interesa en particular de esta clase es el método GetExecutingAssembly [6]. Con este método obtenemos el assembly que contiene la aplicación en ejecución. Esta es su firma:

public static Assembly GetExecutingAssembly()

Como mencionamos obtiene una instancia del assembly en ejecución, una vez obtenido podemos utilizar la propiedad Location [7] para la representación en cadena de caracteres de la dirección en disco en donde se haya el assembly:

public virtual string Location { get; }

2.2 Método Path.GetDirectoryName(string)

A continuación el artefacto que requerimos para mostrar la información de un directorio específico (el obtenido con la propiedad Location) es el método GetDirectoryName [8] (clase System.IO.Path). Su firma:

public static string GetDirectoryName(string path)

3. Aplicación

Ahora que ya contamos con los fundamentos requeridos, pasemos a construir un ejemplo muy práctico y sencillo sobre cómo mostrar en pantalla de la consola la ubicación actual de un assembly que crearemos a mano con el uso de Notepad++ como editor de código fuente C#.

En la línea 17 utilizamos la propiedad Location para obtener la ubicación en disco del assembly ObtencionUbicacionAssembly.exe, el cual se haya en ejecución. La representación de esta ubicación es una cadena de caracteres la cual la asignamos a la variable ubicacion (tipo string). Más adelante, línea 21-22, utilizamos el método GetDirectoryName al cual le pasamos como argumento la ubicación almacenada en la variable ubicacion:

Path.GetDirectoryName(ubicacion)


Este método retorna la representación string que al mismo tiempo sirve como argumento del método WriteLine, el se encarga de presentar en pantalla (salida estándar) del nombre del directorio donde se encuentra el assembly ObtencionUbicacionAssembly.exe.

Compilación:


  1. csc /target:exe ObtencionUbicacionAssembly.cs

Ejecución assembly:


  1. .\ObtencionUbicacionAssembly.exe

> Prueba de ejecución (ideone.com).

> Prueba de ejecución (local):
Ejecución assembly ObtensionUbicacionAssembly.exe
Figura 4. Ejecución assembly ObtensionUbicacionAssembly.exe.

4. Recursos

El recuso multimedial presentando en el curso Twenty C# Questions Explained en Microsoft Virtual Academy:

5. Conclusiones

Hemos comprendido el proceso de obtención de la dirección en disco de un assembly en ejecución, el cual nos puede resultar muy útil cuando, por ejemplo, queremos realizar operaciones de manipulación de archivos de texto plano o binarios desde disco. Con las herramientas que nos ofrece el Framework .NET podemos realizar estas tareas de forma sencilla y directa (el ejemplo escrito en la sección 4 lo demuestra). En la próxima pregunta explicaremos cómo invocar el constructor de clase base.

6. Glosario

  • Assembly
  • Directorio
  • IDE
  • Locación
  • Microsoft
  • PowerShell
  • Recurso
  • Ubicación
  • Visual Studio

7. Literatura & Enlaces

[1]: Twenty C# Questions Explained - http://www.microsoftvirtualacademy.com
[2]: Console application - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/Console_application
[3]: Windows PowerShell - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/Windows_PowerShell
[4]: Assembly Class (System.Reflection) - http://msdn.microsoft.com/en-us/library/system.reflection.assembly(v=vs.110).aspx
[5]: R1-3 Creación y Uso de un Módulo | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2013/10/r1-3-creacion-y-uso-de-un-modulo.html
[6]: Assembly.GetExecutingAssembly Method (System.Reflection) - http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getexecutingassembly(v=vs.110).aspx
[7]: Assembly.Location Property (System.Reflection) - http://msdn.microsoft.com/en-us/library/system.reflection.assembly.location(v=vs.110).aspx
[8]: Path.GetDirectoryName Method (System.IO) - http://msdn.microsoft.com/en-us/library/system.io.path.getdirectoryname(v=vs.110).aspx


J

No hay comentarios:

Publicar un comentario

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