Comment trouver le nom du fichier exécutable actuel?

Duplication possible:
Comment puis-je obtenir le nom de l’exécutable actuel en C #?

Un fichier exécutable charge une bibliothèque externe.
Existe-t-il un moyen pour la bibliothèque de connaître le fichier exécutable appelant?

(J’aurais juré avoir vu la réponse à cela ailleurs, mais je n’arrive plus à le trouver)

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

Si vous voulez l’exécutable:

 System.Reflection.Assembly.GetEntryAssembly().Location 

Si vous souhaitez que l’assembly qui consum votre bibliothèque (qui pourrait être le même assemblage que ci-dessus, si votre code est appelé directement à partir d’une classe dans votre exécutable):

 System.Reflection.Assembly.GetCallingAssembly().Location 

Si vous souhaitez uniquement le nom du fichier et non le chemin, utilisez:

 Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location) 

En plus des réponses ci-dessus.

J’ai écrit à la suite de test.exe comme application console

 static void Main(ssortingng[] args) { Console.WriteLine( System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); Console.WriteLine( System.Reflection.Assembly.GetEntryAssembly().Location); Console.WriteLine( System.Reflection.Assembly.GetExecutingAssembly().Location); Console.WriteLine( System.Reflection.Assembly.GetCallingAssembly().Location); } 

Ensuite, j’ai compilé le projet et renommé sa sortie dans le fichier test2.exe. Les lignes de sortie étaient correctes et identiques.

Mais si je le lance dans Visual Studio, le résultat est le suivant:

d: \ test2.vhost.exe

d: \ test2.exe

d: \ test2.exe

C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorlib.dll

Le plug-in ReSharper du Visual Studio a souligné le

 System.Diagnostics.Process.GetCurrentProcess().MainModule 

comme possible System.NullReferenceException. Si vous examinez la documentation du MainModule, vous constaterez que cette propriété peut également générer NotSupportedException, PlatformNotSupportedException et InvalidOperationException.

La méthode GetEntryAssembly n’est pas non plus 100% “sûre”. MSDN:

La méthode GetEntryAssembly peut renvoyer null lorsqu’un assembly géré a été chargé à partir d’une application non gérée. Par exemple, si une application non gérée crée une instance d’un composant COM écrit en C #, un appel à la méthode GetEntryAssembly à partir du composant C # renvoie null, car le point d’entrée du processus était un code non géré plutôt qu’un assembly géré.

Pour mes solutions, je préfère le Assembly.GetEntryAssembly().Location .

Plus besoin de résoudre le problème pour la virtualisation . Par exemple, nous avons un projet dans lequel nous utilisons un Xenocode Postbuild pour lier le code .net à un exécutable. Cet exécutable doit être renommé. Donc, toutes les méthodes ci-dessus n’ont pas fonctionné, car elles n’obtiennent que les informations pour l’assemblage d’origine ou le processus interne.

La seule solution que j’ai trouvée est

 var location = System.Reflection.Assembly.GetEntryAssembly().Location; var directory = System.IO.Path.GetDirectoryName(location); var file = System.IO.Path.Combine(directory, System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe"); 

Environment.GetCommandLineArgs () [0]

Je pense que cela devrait être ce que vous voulez:

 System.Reflection.Assembly.GetEntryAssembly().Location 

Cela retourne l’assembly qui a été chargé au démarrage du processus, ce qui semble être ce que vous voulez.

GetCallingAssembly ne retournera pas nécessairement l’assembly souhaité dans le cas général, car il retourne l’assembly contenant la méthode immédiatement supérieure dans la stack des appels (c.-à-d. Qu’il pourrait être dans la même DLL).

Assembly.GetEntryAssembly()

Celui-ci n’était pas inclus:

 System.Windows.Forms.Application.ExecutablePath; 

~ Joe