Подтвердить что ты не робот

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

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

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

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

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

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

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

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

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

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

EDIT: я хотел получить каталог, в котором находится сборка

EDIT: Согласно MSDN на AppDomain.BaseDirectory, кажется, что это может быть изменение во время выполнения, что я не делаю want (Просто уточнить, не то, что я не хочу разрешать изменение BaseDirectory, но, скорее, когда я его извлечу, не зная наверняка, было ли это изменено)

EDIT: Я заметил, что связанный с этим вопрос был опубликован намного раньше. Что изменит текущий каталог исполняемого приложения?

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

4b9b3361

Ответ 1

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))

Ответ 2

Попробуйте выполнить ниже. Свойство 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);
    }
}

Ответ 3

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

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

Ответ 4

Существует также

System.Reflection.Assembly.GetExecutingAssembly().CodeBase

Ответ 5

Короче:

AppDomain.Current.BaseDirectory

Ответ 6

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

string path;
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
MessageBox.Show( path );

Ответ 7

Как насчет

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

а затем выясните это оттуда...