.net - net - system io c#




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

Для моих приложений я храню некоторый файл конфигурации в 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 , кажется, что это может быть изменение во время выполнения, чего я не хочу (просто уточнить, не то, что я не хочу менять BaseDirectory, но, скорее, когда я получить его, не зная наверняка, было ли это изменено)

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

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


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

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


Есть также,

System.Reflection.Assembly.GetExecutingAssembly().CodeBase

Несколько короче:

AppDomain.Current.BaseDirectory

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

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

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




directory