Получение каталога приложения из приложения WPF


170

Я нашел решения для Windows Forms с AppDomain, но что было бы эквивалентно для Applicationобъекта WPF ?

Ответы:


329

Один метод:

System.AppDomain.CurrentDomain.BaseDirectory

Еще один способ сделать это будет:

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

Ах, спасибо. Должно быть, как-то не заметили AppDomain. Я искал это, на самом деле ...
Джои

3
@ Хелен: Судя по положительным голосам, это, очевидно, отличный ответ. Однако у ответа есть два способа получить каталог приложения. Будут ли они оба работать одинаково хорошо?
Кристофер Летт

21
Я бы использовал первый вариант. Он выглядит проще, не имеет вызова метода и вызывает меньше сомнений относительно того, что на самом деле делает строка при чтении.
Филипп

3
Я использовал первый метод в сервисе WCF, в приложении WPF и в проекте библиотеки классов и отлично работал во всех.
Апостроф

1
Для NetCore и NetStandard я бы порекомендовал второй, потому что AppDomain был добавлен в 2.0 и не всегда мог быть установлен как ожидалось
cdie

28

Вот еще один:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
Этот получает местоположение после теневого копирования , как указано в документах . Я на самом деле не уверен, что на предложения в принятом ответе влияет теневое копирование.
Кристоффер Летт

2
Это дало мне подкаталог DLL, которую я вызывал, а не основной каталог программы.
Страттонн

7

Вы также можете использовать первый аргумент аргументов командной строки:

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


1
Однако обратите внимание, что «злое» приложение может изменять свои аргументы командной строки.
Даниэль Роуз

@Daniel: Зачем это делать с собой? Или вы имеете в виду другое приложение?
Мерлин Морган-Грэм

1
@Merlyn: См. Blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Я процитирую: это «удобно инициализированный параметр для кода запуска процесса». Таким образом, вы можете намеренно или случайно изменить эту область памяти.
Даниэль Роуз

1
@ Даниель: кто может? Другой процесс или тот же процесс? Если вы выстрелите себе в ногу, это должно быть легко выследить. Я бы назвал это менее злым и более глупым :) Если другой процесс может сделать это, то это более интересно. Изменить: я не вижу ничего в этой статье об изменении командной строки запущенной программы - только то, что процесс запуска передает его (не уверен, что процесс запуска нежелательно изменять командную строку), и что вы можете запросить его через WMI.
Мерлин Морган-Грэм

@ MerlynMorgan-Graham вредоносное приложение может изменить адрес памяти и заставить ваше приложение вместо этого запустить другое вредоносное приложение. Это зло, потому что, скажем, их приложение является кейлоггером, и они хотят, чтобы оно активировалось, как только вы откроете отдельное приложение. Поэтому в своем коде они запомнят имя вашего приложения, запустят кейлоггер в фоновом режиме, а затем запустят ваше приложение. Пользователь будет невежественным. Статья объясняет это, но не говорит вам, как это сделать. Может быть, это то, что вы искали?
pqsk

6

Я использовал просто string baseDir = Environment.CurrentDirectory;и свою работу для меня.

Удачи

Редактировать:

Я имел обыкновение удалять этот тип ошибки, но я предпочитаю редактировать это, потому что я думаю, что минус в этом ответе помогает людям знать о неправильном пути. :) Я понял, что приведенное выше решение бесполезно, и я изменил его на string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Другие способы получить его:

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);

Удачи


3
Это текущий рабочий каталог. Он может совпадать с каталогом приложения, но это отдельные понятия (и самое главное, рабочий каталог может измениться, например, если у вас был открыт общий диалог файлов).
Джои

1
@ Джой, ты прав. Я изменил это следующим образом: строка appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Спасибо.
QMaster

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

Попробуй это!


3

Попробуй это. Не стоит забывать using System.Reflection.

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

1

Я попробовал это:

    label1.Content = Directory.GetCurrentDirectory();

и получите также каталог.


Это получает текущий рабочий каталог, который может отличаться от каталога процесса.
Трака

Я предполагаю, что должен оценить Directory.GetCurrentDirectory (); Больше. Спасибо @Thraka за исправление.
Пол

0

Вы также можете свободно использовать Application.StartupPath из System.Windows.Forms, но вы должны добавить ссылку для сборки System.Windows.Forms!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.