¿Cómo obtengo el nombre del ejecutable actual en C #?


356

Quiero obtener el nombre del programa actualmente en ejecución, ese es el nombre ejecutable del programa. En C / C ++ lo obtienes args[0].


¿El archivo ejecutable es un archivo EXE (Windows Forms, aplicaciones WPF)? Un programa puede ser una aplicación de escritorio (WinForms, WPF y WinRT-Windows Phone?), Aplicación web, aplicación de servicio Wcf, complemento de Visual Studio, complemento de Outlook-Word, prueba unitaria en VS (MSTest) o aplicación Silverlight.
Kiquenet

Respuestas:


406
System.AppDomain.CurrentDomain.FriendlyName

61
Cuidado con la respuesta aceptada. Hemos tenido problemas con el uso de System.AppDomain.CurrentDomain.FriendlyNameaplicaciones desplegadas Click-Once. Para nosotros, esto devuelve " DefaultDomain ", y no el nombre exe original.
Gaspode

40
Usamos esto al final:string file = object_of_type_in_application_assembly.GetType().Assembly.Location; string app = System.IO.Path.GetFileNameWithoutExtension( file );
Gaspode

44
FriendlyName se puede establecer en cualquier cosa. Además, obtener la ubicación del ensamblaje puede no ser suficiente si tiene un exe con varios dlls. Además, si utiliza varios AppDomain, Assembly.GetCallingAssembly () devuelve nulo.
user276648

2
@Gaspode: sería más fácil decir Path.GetFileNameWithoutExtension (GetType (). Assembly.Location): no necesita especificar un objeto de un tipo en el ensamblaje actual. Puede usar GetType de esto, y luego ni siquiera necesita decir "esto".
vbullinger

44
Esto puede ser útil, pero debería no ser la respuesta aceptada: Es muy diferente de lo que se pidió - que casualmente será el mismo que en algunas situaciones, pero esto es algo completamente distinto. Si no escribió la solicitud usted mismo, podría devolver "¡Me gustan las papas!" ¡o lo que sea que tu colega humorístico escribió en esta propiedad cuando construyeron la aplicación!
AnorZaken

237

System.AppDomain.CurrentDomain.FriendlyName - Devuelve el nombre del archivo con la extensión (por ejemplo, MyApp.exe).

System.Diagnostics.Process.GetCurrentProcess().ProcessName- Devuelve el nombre del archivo sin extensión (por ejemplo, MyApp).

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName- Devuelve la ruta completa y el nombre de archivo (por ejemplo, C: \ Ejemplos \ Procesos \ MyApp.exe). Luego puede pasar esto System.IO.Path.GetFileName()o System.IO.Path.GetFileNameWithoutExtension()lograr los mismos resultados que los anteriores.


3
AppDomain puede ser una aplicación EXE, una aplicación web, una aplicación de prueba de unidad, Addin Visual Studio y "Silverlight App" (?). Quizás una solución completa interesante para todos los casos. Por ejemplo, para Prueba unitaria VS2012 - Nombre del proceso: vstest.executionengine.x86 MainModule.FileName: C: \ PROGRAM FILES (X86) \ MICROSOFT VISUAL STUDIO 11.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ vstest.executionengine.x86.exe MainModule.ModuleName: vstest.executionengine.x86.exe FriendlyName: UnitTestAdapter: Running test ApplicationName:
Kiquenet

Un "programa" puede ser una aplicación de escritorio (WinForms, WPF y WinRT-Windows Phone?), Aplicación web, aplicación de servicio Wcf, complemento de Visual Studio, complemento de Outlook-Word, prueba de unidad en VS (MSTest) o aplicación Silverlight . Por ejemplo, ¿cómo obtener el servicio de ensamblaje del host para una aplicación de servicio Wcf alojada en IIS, no en IISExpress o WebDevServer?
Kiquenet

66
+1 Voy a ir con esta respuesta porque proporciona las tres variaciones que podrías necesitar de una manera limpia y simple. Usar el nombre simple del programa sin ruta o extensión es muy útil para el texto de ayuda ( /?cambio) en el programa, porque usar la extensión y la ruta simplemente lo desordenan innecesariamente.
Synetech

2
Recuerde eliminar el resultado deGetCurrentProcess()
Mahmoud Al-Qudsi

Process.GetCurrentProcess().ProcessName()devuelve MyApp.vshost para mí.
Jonathan Wood

106

System.Diagnostics.Process.GetCurrentProcess()obtiene el proceso actualmente en ejecución. Puede usar la ProcessNamepropiedad para descubrir el nombre. A continuación se muestra una aplicación de consola de muestra.

using System;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Process.GetCurrentProcess().ProcessName);
        Console.ReadLine();
    }
}

36
Mejor uso Process.GetCurrentProcess (). MainModule.FileName
KindDragon

Process.GetCurrentProcess (). MainModule.FileName funciona perfectamente desde un complemento de Excel (ExcelDNA)
earcam

10
Este enfoque fallará cuando se use en el tiempo de ejecución Mono; El nombre del proceso para las aplicaciones que se ejecutan en Mono siempre será una variante de .../bin/monoon * nixes o .../mono.exeWindows.
cdhowie

1
Esta debería ser la respuesta aceptada. El nombre del dominio de aplicación actual puede no tener nada que ver con el nombre del proceso ejecutable, especialmente cuando hay varios dominios de aplicación presentes
Ivan Krivyakov

Este método puede ser sustancialmente más lento que jugar con la clase Assembly.
Erwin Mayer

99

Esto debería ser suficiente:

Environment.GetCommandLineArgs()[0];

3
Hmm, esto devuelve (cuando se ejecuta desde vs.net y usa la cosa de alojamiento de depuración), la ubicación y el nombre del nombre de archivo.vshost.exe ... ese es el archivo que se está ejecutando en este momento)
Frederik Gheysels

13
Esta es la mejor respuesta para mí porque Environment.GetCommandLineArgs()es el análogo exacto de C # de argvC / C ++.
Frederick The Fool

¡Convenido! la mejor respuesta. Necesito obtener Environment.GetCommandLineArgs () [1];
Jerry Liang

1
Para evitar la ruta completa:Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0])
Nathan

1
Esto funciona bien cuando se trata de rastrear servicios WCF. El nombre del proceso vuelve con iisexpress en mi caso. Pero este comando me da el nombre real del ensamblado del servicio WCF.
P.Brian.Mackey

19

Este es el código que funcionó para mí:

string fullName = Assembly.GetEntryAssembly().Location;
string myName = Path.GetFileNameWithoutExtension(fullName);

Todos los ejemplos anteriores me dieron el nombre de proceso con vshost o el nombre de dll en ejecución.


44
Para aquellos que no saben, o se lo perdieron en otras respuestas, el espacio de nombres para Assembly es System.Reflection, y el espacio de nombres para Path es System.IO.
amalgamate

44
GetEntryAssembly devolverá nulo si el punto de entrada de la aplicación está en código nativo en lugar de un ensamblado.
Emdot

18

Prueba esto:

System.Reflection.Assembly.GetExecutingAssembly()

Esto le devuelve una System.Reflection.Assemblyinstancia que tiene todos los datos que podría desear saber sobre la aplicación actual. Creo que la Locationpropiedad podría obtener lo que buscas específicamente.


66
Puede ser más seguro usarlo en CodeBaselugar de Locationen caso de que la función de instantáneas de .NET esté activa. Ver blogs.msdn.com/suzcook/archive/2003/06/26/…
Dirk Vollmar el

18
Tenga cuidado con GetExecutingAssembly (): si llama a esto desde un ensamblaje de biblioteca, devuelve el nombre del ensamblaje de biblioteca, que es diferente del nombre del ensamblado de entrada (es decir, el ejecutable original). Si usa GetEntryAssembly (), devuelve el nombre del ejecutable real, pero arroja una excepción si el proceso se ejecuta bajo WCF (ciertamente es una situación rara). Para obtener el código más sólido, use Process.GetCurrentProcess (). ProcessName.
Contango el

@Gravitas: Ciertamente no, cualquier ejecutable que se esté ejecutando "interpretado", por ejemplo, con / usr / bin / mono tendrá el nombre de proceso incorrecto. Además, ProcessName no funcionará con los servicios de Windows. Si lo usa en una biblioteca, use GetCallingAssembly.
Stefan Steiger

1
Trabajó para mi. El nombre de propiedad de la llamada GetName () de instancia de ensamblado devuelta es lo que necesita y no incluye la parte ".exe". También probado en Mono / Linux con el resultado esperado. Assembly.GetName (). Name
Hatoru Hansou

1
Hmm, tenga en cuenta que la cadena devuelta no cambiará incluso si cambia el nombre del archivo ejecutable a mano utilizando el explorador de archivos. Mientras que Environment.GetCommandLineArgs () [0] cambia junto con el nombre de archivo ejecutable real (por supuesto). Casualmente, el segundo método resultó mejor para mi situación específica, ya que quiero que la carpeta de datos se nombre como el nombre de archivo ejecutable real.
Hatoru Hansou

11
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;

le dará el nombre de archivo de su aplicación como; "MyApplication.exe"


11

Por qué nadie sugirió esto, es simple.

Path.GetFileName(Application.ExecutablePath)

3
Qué espacio de nombres reside la aplicación.
Jeetendra

66
Esto es útil cuando está dentro de una aplicación de Windows Forms, pero no de otra manera
NineBerry

@NineBerry Puede que le interese Application.ExecutablePathel código fuente de .
Espeluznante

@NineBerry Ver mi publicación. Esto funciona dentro de las aplicaciones de consola si agrega una referencia a System.Windows.Forms.
John


9

Si necesita el nombre del programa para configurar una regla de firewall, use:

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

Esto asegurará que el nombre sea correcto tanto al depurar en VisualStudio como al ejecutar la aplicación directamente en Windows.


2
Para mis propósitos (crear un nombre de archivo de registro), esta es la mejor respuesta. Si ejecuta un proceso alojado (por ejemplo, un servicio o una aplicación web), System.AppDomain.CurrentDomain.FriendlyName puede devolver un nombre GUID-y feo con barras inclinadas incrustadas.
Curt

8

Cuando tengas dudas o dudas, corre en círculos, grita y grita.

class Ourself
{
    public static string OurFileName() {
        System.Reflection.Assembly _objParentAssembly;

        if (System.Reflection.Assembly.GetEntryAssembly() == null)
            _objParentAssembly = System.Reflection.Assembly.GetCallingAssembly();
        else
            _objParentAssembly = System.Reflection.Assembly.GetEntryAssembly();

        if (_objParentAssembly.CodeBase.StartsWith("http://"))
            throw new System.IO.IOException("Deployed from URL");

        if (System.IO.File.Exists(_objParentAssembly.Location))
            return _objParentAssembly.Location;
        if (System.IO.File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName))
            return System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName;
        if (System.IO.File.Exists(System.Reflection.Assembly.GetExecutingAssembly().Location))
            return System.Reflection.Assembly.GetExecutingAssembly().Location;

        throw new System.IO.IOException("Assembly not found");
    }
}

No puedo afirmar que probé cada opción, pero no hace nada estúpido como devolver el vhost durante las sesiones de depuración.


2
+1 para diversión. :-) Sin embargo, difícilmente usaría este código, a menos que esté escribiendo una biblioteca realmente genérica que no tenga idea de su entorno (y entonces probablemente no sería una buena idea mantener el estado global que iba a usar) el nombre para)
Andrey Tarantsov

@Orwellophile Un "programa" puede ser una aplicación de escritorio (WinForms, WPF y WinRT-Windows Phone?), Aplicación web, aplicación de servicio Wcf, complemento de Visual Studio, complemento de Outlook-Word, prueba de unidad en VS (MSTest) o, Aplicación Silverlight. Por ejemplo, ¿cómo obtener el servicio de ensamblaje del host para una aplicación de servicio Wcf alojada en IIS, no en IISExpress o WebDevServer? ¿Algún código completo válido para A WinForms, WPF, aplicación web, aplicación de servicio Wcf, complemento de Visual Studio, complemento de Outlook-Word, prueba unitaria en aplicaciones VS (MSTest)?
Kiquenet

8
  • System.Reflection.Assembly.GetEntryAssembly().Location devuelve la ubicación del nombre exe si el ensamblado no se carga desde la memoria.
  • System.Reflection.Assembly.GetEntryAssembly().CodeBase devuelve la ubicación como URL.

Probado, esto funciona al 100%, incluso si se llama desde una biblioteca de C #.
Contango el

1
GetEntryAssembly () devuelve nulo si no está en el AppDomain principal.
user276648

4

SI está buscando la información de ruta completa de su ejecutable, la forma confiable de hacerlo es utilizar lo siguiente:

   var executable = System.Diagnostics.Process.GetCurrentProcess().MainModule
                       .FileName.Replace(".vshost", "");

Esto elimina cualquier problema con dlls intermedios, vshost, etc.


Probé su manera confiable en Ubuntu Linux 15.10 C ++ usando realpath seguido de reemplazo de cadena STL C ++ y causó que Point and Click fallara. ¿Podría haber sido causado por un error en mono como nuestro director de software supuso hoy? Gracias.
Frank

No
programo

Gasponde escribió anteriormente que "Hemos tenido problemas con el uso de System.AppDomain.CurrentDomain.FriendlyName en aplicaciones desplegadas Click-Once". ¿Podría adivinar cuáles podrían ser los problemas con las aplicaciones desplegadas Click-Once en .NET? Gracias.
Frank

Devuelve C: \ Archivos de programa \ dotnet \ dotnet.exe para mi programa de ejemplo en VS2017.
jwdonahue

3

Puede usar Environment.GetCommandLineArgs()para obtener los argumentos y Environment.CommandLineobtener la línea de comando real tal como se ingresó.

Además, puedes usar Assembly.GetEntryAssembly()o Process.GetCurrentProcess().

Sin embargo, al depurar, debe tener cuidado, ya que este ejemplo final puede dar el nombre ejecutable de su depurador (dependiendo de cómo adjunte el depurador) en lugar de su ejecutable, como pueden hacerlo los otros ejemplos.


44
Tenga cuidado con GetExecutingAssembly (): si llama a esto desde un ensamblaje de biblioteca, devuelve el nombre del ensamblaje de biblioteca, que es diferente del nombre del ensamblado de entrada (es decir, el ejecutable original). Si usa GetEntryAssembly (), devuelve el nombre del ejecutable real, pero arroja una excepción si el proceso se ejecuta bajo WCF (ciertamente es una situación rara). Para obtener el código más sólido, use Process.GetCurrentProcess (). ProcessName.
Contango el

@Gravitas: buen punto - wow, ¡ha pasado un tiempo desde que escribí esto! : D editaré en consecuencia
Jeff Yates

Environment.CommandLineda la ruta absoluta, no la línea de comando ingresada, al menos en Mono / Linux.
Caracol mecánico

@Mechanicalsnail: Parece que Mono no sigue la documentación. Interesante.
Jeff Yates

1

Es esto lo que quieres:

Assembly.GetExecutingAssembly ().Location

44
Tenga cuidado con GetExecutingAssembly (): si llama a esto desde un ensamblaje de biblioteca, devuelve el nombre del ensamblaje de biblioteca, que es diferente del nombre del ensamblado de entrada (es decir, el ejecutable original). Si usa GetEntryAssembly (), devuelve el nombre del ejecutable real, pero arroja una excepción si el proceso se ejecuta bajo WCF (ciertamente es una situación rara). Para obtener el código más sólido, use Process.GetCurrentProcess (). ProcessName.
Contango el

Una respuesta no debería ser una pregunta. ¿Es eso lo que quería el OP?
jwdonahue

1

En .Net Core (o Mono), la mayoría de las respuestas no se aplicarán cuando el binario que define el proceso sea el binario de tiempo de ejecución de Mono o .Net Core (dotnet) y no la aplicación real que le interesa. En ese caso , utilizar este:

var myName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);

1
GetEntryAssembly()puede devolver nulo.
user2864740

1

Para las aplicaciones de Windows (formularios y consola), uso esto:

Agregue una referencia a System.Windows.Forms en VS y luego:

using System.Windows.Forms;
namespace whatever
{
    class Program
    {
        static string ApplicationName = Application.ProductName.ToString();
        static void Main(string[] args)
        {
            ........
        }
    }
}

Esto funciona correctamente para mí si estoy ejecutando el ejecutable real o depurando dentro de VS.

Tenga en cuenta que devuelve el nombre de la aplicación sin la extensión.

Juan


1

Súper fácil, aquí:

Environment.CurrentDirectory + "\\" + Process.GetCurrentProcess().ProcessName

1
Para .NET Core Process.GetCurrentProcess (). ProcessName devuelve "dotnet".
Evgeni Nabokov

1
El directorio actual es transitorio temporalmente y no se puede confiar en que sea la ubicación del ensamblado / ejecutable.
jwdonahue

1

Esto funciona si solo necesita el nombre de la aplicación sin extensión:

Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName);

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.