2009-08-27 12 views
13

Tło:Environment.CurrentDirectory przynosi nieoczekiwane rezultaty podczas uruchamiania zainstalowanych aplikacji

Zbudowałem instalatora dla mojej aplikacji, a wszystkie moje pliki dll i treści są coraz poprawnie skopiowane do katalogu C:\Program Files\MyCompany\MyApp. Kiedy uruchamiam moją aplikację z Visual Studio, wszystko działa świetnie. Jednak po uruchomieniu zainstalowanej wersji aplikacji otrzymuję numer DirectoryNotFoundException. Problem wydaje się być z Environment.CurrentDirectory.

Spodziewałem Environment.CurrentDirectory być ...

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

... ale to było rzeczywiście ...

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

Co tu się dzieje? Jak rozwiązać ten problem?

Dzięki.

EDIT:

Dobra, hmm. Ten problem występuje tylko po uruchomieniu skrótu Menu Start. Jeśli uruchomię bezpośrednio MyApp.exe, wszystko będzie dobrze.

EDIT 2:

myślę, że dotarłeś do końca tego teraz. W moim Instalatorze (będącym Visual Studio SetupProject) skrót menu Start ma właściwość o nazwie WorkingFolder, która "Określa folder, w którym zostanie zainstalowana docelowa aplikacja dla skrótu." Przypadkowo ustawiłem WorkingFolder na "MyCompany". Powinien to być "Folder aplikacji". Teraz, gdy mam go poprawnie ustawiony, Environment.CurrentDirectory znowu działa zgodnie z oczekiwaniami. Dzięki za twoją pomoc.

EDIT 3:

Jednak czytając ostrzeżenia poniżej, zdecydowałem się pójść z następujących jako zamiennik dla Environment.CurrentDirectory:

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

Odpowiedz

31

Jeśli chcesz uzyskać ścieżkę do katalogu, w którym działa twój plik wykonywalny, nie powinieneś polegać na Environment.CurrentDirectory, ponieważ można go zmienić na wiele sposobów (ustawienia strzałek, itp.). Wypróbuj jedną z tych opcji zamiast:

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

lub

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

Poszedłem z drugim rozwiązaniem, ponieważ pierwszy nie będzie działał z aplikacją WPF (chyba że dołączymy zestaw dla Windows Forms). – devuxer

8

Zastosowanie Application.StartupPath zamiast Environment.CurrentDirectory.
Miałem podobny problem, ponieważ CurrentDirectory został nieumyślnie zmieniony przez coś takiego jak OpenFileDialog, nawet nie zdając sobie z tego sprawy.
W twoim przypadku wygląda na to, że proces, od którego uruchamiasz formularz zgłoszeniowy, powoduje, że nie wiesz o tym, CurrentDirectory.

+0

StartupPath nie wydaje się być członkiem System.Windows.Application, System.Net.Mime.MediaTypeNames.Application lub MS.Internal.Documents.Application. Jeśli ma to jakieś znaczenie, jest to aplikacja WPF. – devuxer

+0

Ach ok ... tak, 'Application.StartupPath' znajduje się w przestrzeni nazw' System.Windows.Forms'. – Donut

1

Po uruchomieniu programu bieżący katalog jest zwykle taki sam, jak bieżący program, chyba że początkowa aplikacja określa inny katalog roboczy. To naprawdę może być wszędzie na dysku.

W twoim przypadku początkową aplikacją jest powłoka (explorer.exe) w obu przypadkach. Określa katalog roboczy podczas uruchamiania programu, w zależności od kontekstu uruchomienia. Widzieliście dwa różne przypadki (dwukrotne kliknięcie pliku w eksploratorze i uruchamianie z menu startowego); w obu przypadkach znalazłeś również to, co Microsoft uważa za najbardziej sensowne wartości dla bieżącego katalogu: katalog domowy użytkownika i katalog pokazany w eksploratorze (odpowiednio).

1

Środowisko.CurrentDirectory zawiera bieżący katalog, który jest obecnie aktualnym katalogiem. Wartość zależy od wielu czynników. Każda aplikacja może zmienić wartość. Ta wartość nie dotyczy tylko Twojej aplikacji.

Jeśli chcesz uzyskać katalog startowy, użyj Application.StartupPath.

3

Skoro powiedział, że aplikacja jest przy użyciu WPF, można użyć poniższy kod zamiast Application.StartupPath:

String appPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); 
Powiązane problemy