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)
Réponses
Trop de publicités?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)
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");
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).