Ответ 1
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
В моих приложениях я храню некоторый файл конфигурации в 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: Я заметил, что связанный с этим вопрос был опубликован намного раньше. Что изменит текущий каталог исполняемого приложения?
Спасибо, ребята, за ответ.
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
Попробуйте выполнить ниже. Свойство 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);
}
}
Вам нужен фактический рабочий каталог или каталог, содержащий сборку? Это не совсем понятно.
Там Environment.CurrentDirectory
, если вы хотите, чтобы рабочий каталог или 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 );
Как насчет
string currentAssemblyFile = System.Reflection.Assembly.GetExecutingAssembly().Location;
а затем выясните это оттуда...