Каков наилучший способ получить каталог, из которого выполняется сборка - PullRequest
18 голосов
/ 31 октября 2008

Для моих приложений я сохраняю некоторый файл конфигурации в xml вместе со сборкой (exe) и другие временные файлы для обработки.

Я нашел причуду с ".\\" и Application.StartupPath.

Я использовал

String configPath = ".\\config.xml";

Работает нормально, пока я не позвонил OpenFIleDialog, чтобы открыть некоторые файлы в других папках, вышеприведенное утверждение не удалось. Очевидно, «. \» Относится к «CurrentDirectory», который меняется каждый раз, когда мы переходим к другой папке.

В какой-то момент я использовал

String configPath = Path.Combine(Application.StartupPath + "config.xml");

В какой-то момент, когда мне нужно выполнить эту сборку из другой папки с помощью Process.Start(), все начинает разваливаться. Очевидно, рабочий каталог установлен неправильно, и Application.StartupPath фактически ссылается на рабочий каталог, а не на каталог, из которого выполняется сборка, как я предполагал. Поэтому я вынужден прибегнуть к использованию ProcessInfo для установки рабочего каталога в каталог сборки. У меня также были проблемы с этим, когда я писал VSTO.

Итак, мой вопрос: каков наилучший, самый простой и самый надежный способ получить текущий каталог, который выполняет сборка, без тех недоразумений (или недоразумений), о которых я только что упомянул?

РЕДАКТИРОВАТЬ: я хотел получить каталог, в котором находится сборка

РЕДАКТИРОВАТЬ: Согласно MSDN на AppDomain.BaseDirectory , кажется, что это может быть изменено во время выполнения, что я не хочу (просто, чтобы уточнить, не то, что я не хочу разрешить изменение BaseDirectory, но, скорее, когда я получаю его, не зная точно, было ли оно изменено)

РЕДАКТИРОВАТЬ: Я заметил, что связанный вопрос был опубликован гораздо раньше. Что может вызвать изменение текущего каталога исполняемого приложения?

Спасибо, ребята, за ответ.

Ответы [ 7 ]

44 голосов
/ 31 октября 2008
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
12 голосов
/ 12 ноября 2008

Попробуйте реализацию ниже. Свойство CodeBase является наиболее надежным способом определения местоположения, а затем весь код преобразует его в стандартный формат Windows (вместо URI).

static public string AssemblyLoadDirectory
{
    get
    {
        string codeBase = Assembly.GetCallingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}
10 голосов
/ 31 октября 2008

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

Существует Environment.CurrentDirectory, если вы хотите, чтобы рабочий каталог, или Path.GetDirectoryName(typeof(Foo).Assembly.ManifestModule.FullyQualifiedName), чтобы найти местоположение сборки (или, по крайней мере, ее модуль манифеста, который будет одинаковым почти во всех случаях) .

5 голосов
/ 31 октября 2008

Есть также,

System.Reflection.Assembly.GetExecutingAssembly().CodeBase
4 голосов
/ 31 октября 2008

чуть короче:

AppDomain.Current.BaseDirectory
2 голосов
/ 31 октября 2008

Я бы попробовал что-то подобное из следующей ссылки :

string path;
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
MessageBox.Show( path );
1 голос
/ 31 октября 2008

Как насчет

string currentAssemblyFile = System.Reflection.Assembly.GetExecutingAssembly().Location;

, а затем выяснить это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...