Ottenere la directory dell'applicazione da un'applicazione WPF


170

Ho trovato soluzioni per Windows Form con AppDomain ma quale sarebbe l'equivalente per un Applicationoggetto WPF ?

Risposte:


329

Un metodo:

System.AppDomain.CurrentDomain.BaseDirectory

Un altro modo per farlo sarebbe:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

Ah grazie. Deve aver trascurato AppDomain in qualche modo. In realtà lo stavo cercando ...
Joey,

3
@Helen: a giudicare dai voti, questa è ovviamente una risposta eccellente. Tuttavia, la risposta ha due modi per ottenere la directory dell'app. Funzioneranno entrambi allo stesso modo?
Christoffer Lette,

21
Vorrei usare la prima alternativa. Sembra più semplice, non ha una chiamata di metodo e causa meno dubbi su cosa effettivamente fa la linea durante la lettura.
Filip,

3
Ho usato il primo metodo in un servizio WCF, in un'applicazione WPF e in un progetto di libreria di classi e ho funzionato bene in tutto.
Apostrofix,

1
Per NetCore e NetStandard, consiglierei il secondo, perché AppDomain è stato aggiunto in 2.0 e non può essere sempre impostato come previsto
cdie,

28

Eccone un altro:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
Questo ottiene la posizione dopo aver copiato l'ombra , come indicato nei documenti . In realtà non sono sicuro che i suggerimenti nella risposta accettata siano influenzati dalla copia shadow.
Christoffer Lette,

2
Questo mi ha dato la sottodirectory della DLL che stavo chiamando, non la directory principale del programma.
Strattonn,

7

Puoi anche usare il primo argomento degli argomenti della riga di comando:

String exePath = System.Environment.GetCommandLineArgs()[0]


1
Tuttavia, si noti che un'applicazione "malvagia" può modificare i suoi argomenti della riga di comando.
Daniel Rose,

@Daniel: Perché dovrebbe farlo da solo? O intendi un'applicazione diversa?
Merlyn Morgan-Graham,

1
@Merlyn: vedi blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Citerò : è un "parametro inizializzato convenientemente al codice di avvio del processo". Quindi puoi modificare deliberatamente o inavvertitamente quella posizione di memoria.
Daniel Rose,

1
@Daniel: chi può farlo? Un altro processo o lo stesso processo? Se ti spari al piede, dovrebbe essere facile rintracciare. Lo definirei meno malvagio e più stupido :) Se un altro processo può farlo, allora è più interessante. Modifica: non vedo nulla in quell'articolo sulla modifica della riga di comando di un programma in esecuzione - solo che il processo di avvio lo passa (non sono sicuro che non sia desiderabile che il processo di avvio cambi la riga di comando) e che puoi interrogarlo tramite WMI.
Merlyn Morgan-Graham,

@ MerlynMorgan-Graham un'applicazione dannosa può modificare l'indirizzo di memoria e forzare invece l'applicazione a eseguirne un'altra. Questo è male, perché diciamo che la loro applicazione è un keylogger e vogliono che si attivi non appena apri un'applicazione specifica. Quindi nel loro codice cattureranno il nome della tua applicazione, eseguiranno il loro keylogger in background, quindi eseguiranno la tua applicazione. L'utente sarà all'oscuro. L'articolo spiega questo, ma non ti dice come farlo. Forse è quello che stavi cercando?
pqsk,

6

Ho usato semplicemente string baseDir = Environment.CurrentDirectory;e il suo lavoro per me.

In bocca al lupo

Modificare:

Ho usato per eliminare questo tipo di errore, ma preferisco modificarlo perché penso che il punto negativo su questa risposta aiuti le persone a conoscere il modo sbagliato. :) Ho capito che la soluzione sopra non è utile e l'ho cambiata in string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Altri modi per ottenerla sono:

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

In bocca al lupo


3
Questa è la directory di lavoro corrente. Si può conincide con la directory dell'applicazione ma questi sono concetti separati (e, soprattutto, la directory di lavoro può cambiare, ad esempio se si ha una finestra di dialogo file comune aperto).
Joey,

1
@joey hai ragione. L'ho cambiato in questo: stringa appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Grazie.
QMaster il

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Prova questo!


3

Prova questo. Non dimenticare using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

1

Ho provato questo:

    label1.Content = Directory.GetCurrentDirectory();

e ottieni anche la directory.


Ciò ottiene la directory di lavoro corrente, che può essere diversa dalla directory del processo.
Thraka,

Immagino di dover valutare Directory.GetCurrentDirectory (); Di Più. Grazie @Thraka per la correzione.
paul

0

È inoltre possibile utilizzare liberamente Application.StartupPath da System.Windows.Forms, ma è necessario aggiungere un riferimento per l'assemblaggio System.Windows.Forms!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.