¿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].

Joakim
fuente
¿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
Steven A. Lowe
fuente
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.

Lee Grissom
fuente
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();
    }
}
Aaron Daniels
fuente
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];
James B
fuente
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.

Tal Segal
fuente
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.

Andrew Hare
fuente
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"

Teoman shipahi
fuente
11

Por qué nadie sugirió esto, es simple.

Path.GetFileName(Application.ExecutablePath)
X Men
fuente
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
10

Un par de opciones más:

  • System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
  • Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
JohnB
fuente
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.

Mark Uebel
fuente
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.

Orwellophile
fuente
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.
Langpavel
fuente
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.

theMayer
fuente
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.

Jeff Yates
fuente
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
Frederik Gheysels
fuente
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);
Tobias
fuente
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

Juan
fuente
1

Súper fácil, aquí:

Environment.CurrentDirectory + "\\" + Process.GetCurrentProcess().ProcessName
Fantasma delirante
fuente
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);
RJN
fuente
-1

Para obtener el camino y el nombre

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

Ewerton Dutra
fuente
Esto duplica esta respuesta y esta respuesta .
TOCINO