web-dev-qa-db-fra.com

Trouver l'emplacement de l'exécutable de mon application dans WPF (C # ou vb.net)?

Comment trouver l'emplacement de l'exécutable de mon application dans WPF (C # ou VB.Net)?

J'ai utilisé ce code avec les formulaires Windows:

Application.ExecutablePath.ToString();

Mais avec WPF, j'ai reçu cette erreur de Visual Studio: 

System.Window.Application ne contient pas de définition pour ExecutablePath.

42
Shahin

System.Reflection.Assembly.GetExecutingAssembly().Location devrait fonctionner.

83
Blorgbeard

Plusieurs alternatives:

Directory.GetParent(Assembly.GetExecutingAssembly().Location)

System.AppDomain.CurrentDomain.BaseDirectory

Seulement en VB:

My.Application.Info.DirectoryPath
29
Konrad Rudolph

cela vous est utile: Application.ExecutablePath est égal à:

Process.GetCurrentProcess().MainModule.FileName;
5
dexiang

L'assembly en cours d'exécution peut être un DLL si le code est situé dans une bibliothèque:

var executingAssembly = Assembly.GetExecutingAssembly(); //MyLibrary.dll
var callingAssembly = Assembly.GetCallingAssembly(); //MyLibrary.dll
var entryAssembly = Assembly.GetEntryAssembly(); //WpfApp.exe or MyLibrary.dll

Donc, le meilleur moyen que j'ai trouvé est (C #):

var wpfAssembly = (AppDomain.CurrentDomain
                .GetAssemblies()
                .Where(item => item.EntryPoint != null)
                .Select(item => 
                    new {item, applicationType = item.GetType(item.GetName().Name + ".App", false)})
                .Where(a => a.applicationType != null && typeof(System.Windows.Application)
                    .IsAssignableFrom(a.applicationType))
                    .Select(a => a.item))
            .FirstOrDefault();

Donc, dans votre cas, vous pouvez trouver l'emplacement de l'Assemblée:

var location = wpfAssembly.Location;
2
scrat789

En vous basant sur d'autres réponses, voici un exemple qui montre comment supprimer le nom de l'exécutable du chemin et combiner le résultat avec un sous-dossier et un nom de fichier:

sur ma version mise à jour de Hotspotizer ( http://github.com/birbilis/Hotspotizer ), je viens d’ajouter un support pour le chargement d’un fichier Gesture Collection au démarrage, s’il se trouve dans Library\Default.hsjson, en utilisant le code suivant:

const string GESTURE_COLLECTION_LIBRARY_PATH = "Library"
const string DEFAULT_GESTURE_COLLECTION = "Default.hsjson"

//...

LoadGestureCollection(
  Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
  GESTURE_COLLECTION_LIBRARY_PATH,
  DEFAULT_GESTURE_COLLECTION));
0
George Birbilis