100 votes

Comment puis-je trouver l'exécutable en cours nom de fichier?

Double Possible:
Comment puis-je obtenir le nom de l'exécutable en C#?

Un fichier exécutable charge une bibliothèque externe.
Est-il un moyen pour la bibliothèque, à savoir les appelant fichier exécutable?

(J'aurais juré que j'ai vu la réponse à cet ailleurs, mais je n'arrive pas à le retrouver)

130voto

Thomas Levesque Points 141081
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

83voto

Matthew Brindley Points 5240

Si vous voulez que l'exécutable:

System.Reflection.Assembly.GetEntryAssembly().Location

Si vous voulez l'assemblée que la consommation de votre bibliothèque (qui pourrait être la même assemblée que ci-dessus, si votre code est appelé directement à partir d'une classe à l'intérieur de votre exécutable):

System.Reflection.Assembly.GetCallingAssembly().Location

Si vous souhaitez juste le fichier*nom* et non pas le chemin, utilisez:

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

42voto

Alexander Zwitbaum Points 1627

Outre les réponses ci-dessus.

J'ai écrit la suite test.exe comme l'application de la console

static void Main(string[] 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);
}

Puis j'ai compilé le projet et l'a renommé sa sortie à l'test2.exe fichier. Les lignes de sortie sont corrects et le même.

Mais, si je le démarre dans Visual Studio, le résultat est:

d:\test2.vhost.exe

d:\test2.exe

d:\test2.exe

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

Le ReSharper plug-in pour Visual Studio a souligné l'

System.Diagnostics.Process.GetCurrentProcess().MainModule

que possible du Système.NullReferenceException. Si vous regardez dans la documentation de la MainModule, vous trouverez que cette propriété peut jeter aussi NotSupportedException, PlatformNotSupportedException et InvalidOperationException.

Le GetEntryAssembly méthode n'est pas à 100% "safe". MSDN:

Le GetEntryAssembly méthode permet de retourner la valeur null lorsque géré assemblée a été chargé à partir d'une application non gérée. Par exemple, si un non géré application crée une instance d'un composant COM écrite en C#, un appel à la GetEntryAssembly méthode du composant visual C# renvoie la valeur null, parce que le point d'entrée pour le processus était non géré code plutôt que d'une gestion de l'assemblée.

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

Plus d'intérêt est si nécessaire pour résoudre le problème de la virtualisation. Par exemple, nous avons un projet, où nous utilisons un Xenocode Postbuild pour le lien .net code dans un fichier exécutable. Cet exécutable doit être renommé. Donc, toutes les méthodes ci-dessus ne fonctionnent pas, parce qu'ils ne reçoivent l'information pour l'assemblage ou le processus intérieur.

La seule solution que j'ai trouvé 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");

11voto

mnaoumov Points 459

De l'environnement.GetCommandLineArgs()[0]

7voto

Noldorin Points 67794

Je pense que ce doit être ce que vous voulez:

System.Reflection.Assembly.GetEntryAssembly().Location

Ceci renvoie à l'assemblée qui a été chargé pour la première fois lorsque le processus a commencé, qui semble être ce que vous voulez.

GetCallingAssembly ne sont pas nécessairement de retour à l'assemblée que vous voulez dans le cas général, puisqu'il revient à l'assemblée contenant la méthode immédiatement supérieur dans la pile d'appel (c'est à dire qu'il pourrait être dans la même DLL).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X