Environment.CurrentDirectory дает неожиданные результаты при запуске установленного приложения - PullRequest
14 голосов
/ 27 августа 2009

Справочная информация:

Я собрал установщик для своего приложения, и все мои DLL-файлы и файлы содержимого правильно копируются в каталог C:\Program Files\MyCompany\MyApp. Когда я запускаю свое приложение из Visual Studio, все отлично работает. Однако, когда я запускаю установленную версию моего приложения, я получаю DirectoryNotFoundException. Кажется, проблема в Environment.CurrentDirectory.

Я ожидал, что Environment.CurrentDirectory будет ...

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

... но это было на самом деле ...

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

Что здесь происходит? Как мне это решить?

Спасибо.

EDIT:

Хорошо, хм. Эта проблема возникает только при запуске ярлыка в меню «Пуск». Если я запускаю MyApp.exe напрямую, все в порядке.

РЕДАКТИРОВАТЬ 2:

Я думаю, что я дошел до сути этого сейчас. В моем установщике (который является программой установки Visual Studio) ярлык в меню «Пуск» имеет свойство WorkingFolder, которое «указывает папку, в которую будет установлено целевое приложение для ярлыка». Я случайно установил WorkingFolder в «MyCompany». Это должна быть «папка приложения». Теперь, когда я правильно настроил, Environment.CurrentDirectory снова работает, как и ожидалось. Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ 3:

Однако, прочитав приведенные ниже предупреждения, я решил использовать следующее в качестве замены Environment.CurrentDirectory:

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

Ответы [ 5 ]

34 голосов
/ 28 августа 2009

Если вы хотите получить путь к каталогу, в котором работает ваш исполняемый файл, вам не следует полагаться на Environment.CurrentDirectory, поскольку его можно изменить несколькими способами (настройки shotrtcut и т. Д.). Попробуйте вместо этого один из следующих вариантов:

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

или

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
8 голосов
/ 27 августа 2009

Используйте Application.StartupPath вместо Environment.CurrentDirectory.
У меня была похожая проблема, когда CurrentDirectory непреднамеренно меняли на что-то вроде OpenFileDialog, и я даже не осознавал этого.
В вашем случае, похоже, что процесс запуска формы заявки меняет CurrentDirectory без вашего ведома.

3 голосов
/ 28 августа 2009

Поскольку вы сказали, что ваше приложение использует WPF, вы можете использовать приведенный ниже код вместо Application.StartupPath:

String appPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
1 голос
/ 27 августа 2009

Environment.CurrentDirectory содержит текущий каталог, который действительно является текущим каталогом. Значение зависит от многих факторов. Любое приложение может изменить значение. Это значение касается не только вашего приложения.

Если вы хотите получить стартовый каталог, используйте Application.StartupPath.

1 голос
/ 27 августа 2009

Когда программа запускается, текущий каталог обычно совпадает с каталогом начального приложения, если только стартовое приложение не указывает другой рабочий каталог. Это действительно может быть где угодно на диске.

В вашем случае, стартовое приложение - это оболочка (explorer.exe) в обоих случаях. Он указывает рабочий каталог при запуске программы, в зависимости от контекста запуска. Вы видели два разных случая (двойной щелчок по файлу в проводнике и запуск из меню «Пуск»); вы также обнаружили, что Microsoft считает наиболее разумными значения для текущего каталога в любом случае: домашний каталог пользователя и каталог, который отображается в проводнике (соответственно).

...