Bienvenidos sean a este post, hoy veremos un tema muy particular.
Hace unos dias atras un suscriptor, nowe2018, me hizo una consulta muy interesante sobre lo visto en este post:
En este post vimos como en C# podiamos obtener los argumentos pasados a traves de la linea de comandos pero solamente eso, es decir a diferencia de C o C++ no podiamos obtener el nombre del programa que lo ejecutaba,, me puse a averiguar y pude encontrar una forma muy practica de hacerlo pero esa no era la unica opcion asi que me decidi a armar un post comentando sobre como se puede hacer en sus distintas opciones, comencemos con la primera.
AppDomain
Esta es la primera opcion que tenemos disponible veamos como se aplica en un ejemplo, para ello crearemos un archivo llamado programa.cs y le agregaremos el siguiente codigo:
programa.cs
using System;
public class program
{
static int Main()
{
string programa = AppDomain.CurrentDomain.FriendlyName;
Console.Write("Nombre del programa: ");
Console.WriteLine(programa);
return 0;
}
}
Este sera el caso mas simple, primero definiremos una variable llamada programa y en este almacenaremos el resultado obtenido de AppDomain y FriendlyName despues las siguiente dos lineas son para mostrar el contenido de la variable programa, compilemos y veamos como es su salida:
C:\Users\tinchicus>programa.exe
Nombre del programa: programa.exe
C:\Users\tinchicus>
Como pueden ver funciono perfectamente pero de todas las opciones es la que posee el inconveniente mas grave, si el programa esta corriendo en una red con dominio nos devolvera el dominio y no el nombre del programa, asi que nos puede servir siempre y cuando no estemos en la condicion anterior, veamos el segundo caso.
ProcessName
Esta opcion puede ser un poco mas precisa pero veamos como funciona mediante un ejemplo, para ello tomemos el archivo anterior y cambiemos su codigo de la siguiente forma:
using System;
public class program
{
static int Main()
{
string p = System.Diagnostics.Process.GetCurrentProcess()
.ProcessName;
Console.WriteLine("Nombre del programa: " + p);
return 0;
}
}
Es similar a lo visto anteriormente pero en este caso le decimos que tome el nombre del proceso actual, y nuevamente lo muestre en pantalla, si lo compilamos y probamos tendremos la siguiente salida:
C:\Users\tinchicus>programa.exe
Nombre del programa: programa
C:\Users\tinchicus>
En este caso obtuvimos el nombre del proceso no del programa por esto el inconveniente que podemos tener aca es que el nombre del programa no sea igual al del proceso, generando una discordancia, no lo descarten pero al igual que en el caso anterior no es 100% fiable, veamos el ultimo caso.
FileName
Este puede ser la mejor opcion pero para eso veamos como trabaja, para ello tomaremos el archivo anterior y modificaremos su codigo anterior de la siguiente manera:
using System;
public class program
{
static int Main()
{
string p = System.Diagnostics.Process.GetCurrentProcess()
.MainModule.FileName;
Console.WriteLine("Nombre del programa: " + p);
return 0;
}
}
En este caso solo cambiamos la propiedad que nos devolvera el nombre, aqui seguimos usando a GetCurrentProcess pero observen que ahora le decimos que desde MainModule nos devuelva cual es el nombre del archivo, esto gracias a FileName, luego mostraremos el resultado almacenado en la variable, compilemos y veamos como es la salida:
C:\Users\tinchicus>programa.exe
Nombre del programa: C:\Users\tinchicus\programa.exe
C:\Users\tinchicus>
Como pueden ver nos devolvio el nombre del programa pero con todo el path donde se encuentra ubicado, en caso de necesitar solamente el nombre del programa y no el path completo modiffiquen el codigo anterior de la siguiente manera:
using System;
using System.IO;
public class program
{
static int Main()
{
string p = Path.GetFileName(System.Diagnostics.Process
.GetCurrentProcess().MainModule.FileName);
Console.WriteLine("Nombre del programa: " + p);
return 0;
}
}
Primero incluimos una nueva libreria para poder acceder al nuevo metodo, en este caso es GetFileName, el cual nos extraera el nombre del archivo de un path informado, esto lo aplicaremos a la instruccion que usamos para obtener el nombre del programa, lo asignamos a la variable y lo mostramos, compilemos y veamos la nueva salida:
C:\Users\tinchicus>programa.exe
Nombre del programa: programa.exe
C:\Users\tinchicus>
Con todo esto comentado, obviamente esta es la mejor opcion porque va directo al hueso pero no quiere decir que este libre de fallas, la primera opcion es mas simple siempre y cuando no estemos en un dominio de red, la segunda opcion no es incorrecta tampoco pero no siempre el nombre del archivo sera igual al del proceso.
En resumen, hoy hemos visto como obtener el nombre del programa desde el codigo, hemos visto las tres opciones posibles, un ejemplo de cada uno de ellos, sus pros y contras, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50

hola trinichus,
yo tmbien busque algunos métodos mas para obtener el nombre del programa:
*Environment.CommandLine
*Environment.GetCommandLineArgs()[0]
no se bien la diferencia entre ambos(devuelven cadena y array, sera eso??)
tmbien me gusto el tuyo de .ProcessName, aunque es el k mas probabilidades tiene(aunke es facil de evitar no krees?) de los k dijiste de fallar no??
Saludos trinichus 🙂
Me gustaMe gusta
En realidad el q mas falla es el primero xq cuando esta en dominio d red t devuelve ese, d todos el mejor pa mi es el tercero pero si debe haber mas pero lo hice pa q me quede d ayuda memoria, y gracias x la idea.
Igual te acepto sugerencias pa agregar al blog, abrazo!
Me gustaMe gusta