2009-08-27 8 views
13

Background:Environment.CurrentDirectory sta dando risultati inaspettati durante l'esecuzione di applicazione installata

ho costruito un programma di installazione per la mia app, e tutta la mia dll e file di contenuto sono sempre correttamente copiato nella directory C:\Program Files\MyCompany\MyApp. Quando eseguo la mia app da Visual Studio, tutto funziona alla grande. Quando eseguo la versione installata della mia app, tuttavia, ottengo uno DirectoryNotFoundException. Il problema sembra essere con Environment.CurrentDirectory.

mi aspettavo di essere Environment.CurrentDirectory ...

"C:\\Program Files\\MyCompany\\MyApp" 

... ma era in realtà ...

"C:\\Documents and Settings\\DanThMan" 

cosa sta succedendo qui? Come lo risolvo?

Grazie.

EDIT:

Va bene, hmm. Questo problema si verifica solo se eseguo il collegamento del menu Start. Se eseguo direttamente MyApp.exe, è tutto a posto.

EDIT 2:

penso che ho ottenuto fino in fondo questo momento. Nel mio programma di installazione (che è un SetupProject di Visual Studio), il collegamento del menu Start ha una proprietà denominata WorkingFolder, che "Specifica la cartella in cui verrà installata l'applicazione di destinazione per il collegamento". Avevo accidentalmente impostato WorkingFolder in "MyCompany". Dovrebbe essere "Cartella dell'applicazione". Ora che ho impostato correttamente, Environment.CurrentDirectory sta funzionando di nuovo come previsto. Grazie per tutto il vostro aiuto.

EDIT 3:

Tuttavia, leggendo le avvertenze di seguito, ho deciso di andare con il seguente come una sostituzione per Environment.CurrentDirectory:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); 

risposta

31

Se si desidera ottenere il percorso della directory in cui viene eseguito il file eseguibile, non si deve fare affidamento su Environment.CurrentDirectory, poiché può essere modificato in vari modi (impostazioni shotrtcut, ecc.). Prova una di queste opzioni, invece:

System.IO.Path.GetDirectoryName(Application.ExecutablePath); 

o

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); 
+1

Sono andato con la seconda soluzione perché la prima non funzionerà con un'app WPF (a meno che non si includa l'assembly per Windows Form). – devuxer

8

Uso Application.StartupPath invece di Environment.CurrentDirectory.
Ho avuto un problema simile, in cui il CurrentDirectory veniva modificato inavvertitamente da qualcosa come un OpenFileDialog senza che io me ne rendessi nemmeno conto.
Nel tuo caso, sembra che il processo in cui stai avviando il modulo di domanda stia cambiando lo CurrentDirectory a tua insaputa.

+0

StartupPath non sembra essere un membro di System.Windows.Application, System.Net.Mime.MediaTypeNames.Application o MS.Internal.Documents.Application. Se fa alcuna differenza, questa è un'app WPF. – devuxer

+0

Ah ok ... sì, 'Application.StartupPath' si trova nello spazio dei nomi' System.Windows.Forms'. – Donut

1

All'avvio di un programma, la directory corrente è in genere uguale a quella dell'applicazione iniziale, a meno che l'applicazione di avvio non specifichi una directory di lavoro diversa. Può essere davvero ovunque sul disco.

Nel suo caso, la domanda di partenza è il guscio (explorer.exe) in entrambi i casi. Specifica una directory di lavoro all'avvio di un programma, a seconda del contesto del lancio. Hai visto due casi diversi (doppio clic su un file in explorer e esecuzione dal menu di avvio); hai anche trovato ciò che Microsoft considera i valori più sensati per la directory corrente in entrambi i casi: la home directory dell'utente e la directory mostrata in explorer (rispettivamente).

1

Environment.CurrentDirectory contiene la directory corrente che è attualmente la directory corrente. Il valore dipende da molti fattori. Qualsiasi applicazione può modificare il valore. Questo valore non riguarda solo la tua applicazione.

Se si desidera ottenere la directory di avvio, utilizzare Application.StartupPath.

3

Dal momento che ha detto che l'applicazione utilizza WPF, è possibile utilizzare il codice qui sotto, invece di Application.StartupPath:

String appPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); 
Problemi correlati