web-dev-qa-db-fra.com

Comment obtenir le nom de l'exécutable actuel en C #?

Je veux obtenir le nom du programme en cours d'exécution, c'est-à-dire le nom du programme exécutable. En C/C++, vous l'obtenez à partir de args[0].

314
Joakim
System.AppDomain.CurrentDomain.FriendlyName
377
Steven A. Lowe

System.AppDomain.CurrentDomain.FriendlyName - Retourne le nom du fichier avec l'extension (par exemple, MyApp.exe). 

System.Diagnostics.Process.GetCurrentProcess().ProcessName - Renvoie le nom de fichier sans extension (par exemple, MyApp).

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName - Renvoie le chemin d'accès complet et le nom du fichier (par exemple, C:\Examples\Process\MyApp.exe). Vous pouvez ensuite passer ceci dans System.IO.Path.GetFileName() ou System.IO.Path.GetFileNameWithoutExtension() pour obtenir les mêmes résultats que ci-dessus.

206
Lee Grissom

System.Diagnostics.Process.GetCurrentProcess() obtient le processus en cours d'exécution. Vous pouvez utiliser la propriété ProcessName pour déterminer le nom. Vous trouverez ci-dessous un exemple d'application de console.

using System;
using System.Diagnostics;

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

Cela devrait suffire:

Environment.GetCommandLineArgs()[0];
90
James B

C'est le code qui a fonctionné pour moi:

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

Tous les exemples ci-dessus m'ont donné le nom de processus avec vshost ou le nom de la DLL en cours d'exécution.

20
Tal Segal

Essaye ça:

System.Reflection.Assembly.GetExecutingAssembly()

Cela vous renvoie une instance System.Reflection.Assembly qui contient toutes les données que vous pourriez souhaiter connaître sur l’application actuelle. Je pense que la propriété Location pourrait obtenir précisément ce que vous recherchez.

18
Andrew Hare

Pourquoi personne n'a suggéré cela, c'est simple.

Path.GetFileName(Application.ExecutablePath)
11
xmen
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;

vous donnera FileName de votre application comme; "MyApplication.exe"

11
Teoman shipahi

Couple plus d'options:

  • System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
  • Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
10
JohnB
  • System.Reflection.Assembly.GetEntryAssembly().Location renvoie l'emplacement du nom d'exe si l'assembly n'est pas chargé de la mémoire.
  • System.Reflection.Assembly.GetEntryAssembly().CodeBase renvoie l'emplacement en tant qu'URL.
8
langpavel

Si vous avez besoin du nom du programme pour configurer une règle de pare-feu, utilisez:

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

Cela garantira que le nom est correct lors du débogage dans VisualStudio et lors de l'exécution de l'application directement dans Windows.

7
Mark Uebel

En cas de doute ou de doute, courez en rond, criez et criez. 

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");
    }
}

Je ne peux pas prétendre avoir testé chaque option, mais cela ne fait rien de stupide comme de renvoyer le vhost pendant les sessions de débogage.

7
Orwellophile

SI vous recherchez l’information complète sur le chemin de votre exécutable, la méthode la plus fiable consiste à utiliser les éléments suivants:

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

Cela élimine tous les problèmes avec les dll intermédiaires, vshost, etc.

5
theMayer

Vous pouvez utiliser Environment.GetCommandLineArgs() pour obtenir les arguments et Environment.CommandLine pour obtenir la ligne de commande réelle telle qu’elle a été entrée.

Vous pouvez aussi utiliser Assembly.GetEntryAssembly() ou Process.GetCurrentProcess() .

Cependant, lors du débogage, vous devez faire attention car cet exemple final peut donner le nom de l'exécutable de votre débogueur (selon la façon dont vous attachez le débogueur) plutôt que votre exécutable, comme les autres exemples.

4
Jeff Yates

C'est ce que tu veux:

Assembly.GetExecutingAssembly ().Location
2

Pour les applications Windows (formulaires et console), j'utilise ceci:

Ajoutez une référence à System.Windows.Forms dans VS puis:

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

Cela fonctionne correctement pour moi que j'exécute l'exécutable ou que je débogue dans VS.

Notez qu'il renvoie le nom de l'application sans l'extension.

John

1
John

Essayez Application.ExecutablePath

0
Bean

Cela fonctionne si vous n'avez besoin que du nom de l'application sans extension:

 Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName);
0
RJN

Sur .Net Core (ou Mono), la plupart des réponses ne s'appliquent pas lorsque le fichier binaire définissant le processus est le fichier binaire d'exécution de Mono ou .Net Core (dotnet) et non votre application qui vous intéresse , utilisez ceci:

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