Ответ 1
Я обычно обращаюсь к каталогу, в котором содержится мое приложение .exe с:
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
Из программы a.exe, расположенной в c:/dir, мне нужно открыть текстовый файл c:/dir/text.txt. Я не знаю, где может находиться файл a.exe, но text.txt всегда будет одним и тем же путем. Как получить имя текущей исполняемой сборки изнутри для самой программы, чтобы я мог получить доступ к текстовому файлу?
ИЗМЕНИТЬ: что если a.exe является сервисом Windows? У него нет приложения, поскольку оно не является прикладной программой Windows.
Спасибо заранее.
Я обычно обращаюсь к каталогу, в котором содержится мое приложение .exe с:
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
string exePath = Application.ExecutablePath;
string startupPath = Application.StartupPath;
РЕДАКТИРОВАТЬ - Без использования объекта приложения:
string path = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
Подробнее см. здесь:
Получить интересующую вас сборку (например, назначен переменной System.Reflection.Assembly a
):
System.Reflection.Assembly.GetEntryAssembly()
, илиtypeof(X).Assembly
для класса X
, который в интересующей вас сборке (для Windows Forms вы можете использовать typeof(Program)
)Затем введите путь, из которого был загружен файл, из которого была загружена эта сборка a
:
System.IO.Path.GetDirectoryName(a.Location)
Объект Application
из приложения Windows Forms также является возможностью, как объясняется в других ответах.
В VB.NET мы можем получить это следующим образом:
Assembly.GetEntryAssembly.Location
В С#:
Assembly.GetEntryAssembly().Location
используя ответ peSHlr, хорошо работал при тестировании в NUnit.
var thisType = typeof(MyCustomClass);
var codeLocation = Path.GetDirectoryName(thisType.Assembly.Location);
var codeLocationPath = Path.GetDirectoryName(codeLocation);
var appConfigPath = Path.Combine(codeLocationPath, "AppConfig");
MessageBox.Show("This program is located in: " + Environment.CurrentDirectory);