Получение абсолютного пути к исполняемому файлу с помощью С#?

Взгляните на этот псевдокод:

string exe_path = system.get_exe_path()
print "This executable is located in " + exe_path

Если я соберу указанную выше программу и помещу исполняемый файл в C:/meow/, она будет выводить This executable is located in C:/meow/ при каждом запуске, независимо от текущего рабочего каталога.

Как я могу легко сделать это, используя C#?


person Community    schedule 01.11.2009    source источник
comment
Дубликат: stackoverflow.com/questions/218061/get-the-applications- путь   -  person Konrad Rudolph    schedule 02.11.2009
comment
stackoverflow.com/questions/1023306/   -  person Roman A. Taycher    schedule 09.06.2011


Ответы (9)


в MSDN есть статья, в которой говорится об использовании System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; если вам нужен каталог, используйте System.IO.Path.GetDirectoryName для этого результата.

Или есть более короткий Application.ExecutablePath, который «Получает путь к исполняемому файлу, который запустил приложение, включая имя исполняемого файла», поэтому это может означать, что он немного менее надежен в зависимости от того, как было запущено приложение.

person Mark Rushakoff    schedule 01.11.2009
comment
System.Reflection.Assembly.GetExecutingAssembly() получит сборку EXE только в том случае, если она вызывается из нее. GetEntryAssembly() получит правильную сборку. - person GraemeF; 02.11.2009
comment
Это особенно важно, если вы создаете службу Windows, поскольку служба запускается из C:\Windows\System32, поэтому у вас будет этот рабочий каталог. Вместо этого я буду использовать метод GraemeF. - person kevindaub; 02.11.2009
comment
Вышеупомянутый метод возвращает текущий путь в виде URI (т. е. file://c:\\data). Что сработало: System.Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location ) ); - person arikfr; 01.02.2010
comment
На самом деле это System.IO.Path. Таким образом, полное имя с правильным пространством имен должно быть следующим: System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location) - person Victor Chelaru; 06.01.2013
comment
Я не понимаю после этих комментариев, как правильно! Путь Виктора не включает GetEntryAssembly, что, по словам @GraemeF, было бы правильным. А что не так с Application.ExecutablePath? - person noelicus; 14.11.2013
comment
noelicus: согласно ответу и комментариям, безопасный и точный метод, который почти всегда будет работать правильно: System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) - person Graham Laight; 15.11.2013
comment
Однако Application.ExecutablePath является частью Windows.Forms... на который по умолчанию не ссылаются в консольных приложениях. - person Nyerguds; 02.05.2014
comment
Статья предназначена для Compact Framework 1.0. На мой взгляд немного устаревший. System.Reflection.Assembly.GetEntryAssembly().Location следует использовать для exe. - person Erik Philips; 16.05.2014
comment
Возможно, это был правильный ответ в 2009 году, но для всего, кроме самого простого приложения Windows hello world, правильным ответом является ответ от Liquid Core. - person zmilojko; 09.05.2015

var dir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

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

По этой причине я публикую ответ, указанный в комментариях, чтобы дать ему то внимание, которого он заслуживает.

person user1    schedule 07.04.2015
comment
Хорошо, хотя должно быть .GetEntryAssembly(), а не .GetExecutingAssembly(). - person mklement0; 15.01.2019

«Получает путь или UNC-местоположение загруженного файла, содержащего манифест».

См.: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.location.aspx

Application.ResourceAssembly.Location
person Mike de Klerk    schedule 19.09.2012
comment
Обратите внимание, что это решение зависит от WPF: Application — это класс, который инкапсулирует специфичные для приложения функции WPF. - person mklement0; 15.01.2019

Предположим, у меня есть файл .config в консольном приложении, и теперь я получаю, как показано ниже.

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\YourFolderName\\log4net.config";
person Muhammad Mubashir    schedule 25.07.2013
comment
Не гарантируется, что CurrentDirectory будет каталогом, в котором выполняется приложение. - person ; 28.04.2015
comment
Пожалуйста, используйте Path.Combine. Там много кода, который не работает должным образом в Mono из-за комбинированных вручную путей, подобных этому. - person Joseph Lennox; 03.10.2015

На моей стороне я использовал с приложением формы:

String Directory = System.Windows.Forms.Application.StartupPath;

он принимает путь запуска приложения.

person Sébastien    schedule 08.12.2015

Тот, который работал у меня и не выше, был Process.GetCurrentProcess().MainModule.FileName.

person Charles A.    schedule 10.12.2020

Если вы планируете создать консольное приложение для использования с планировщиком заданий, я бы рекомендовал использовать этот подход:

var execDirectoryPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)?.Replace("file:\\", "");

Таким образом, путь будет адаптироваться к любому местоположению, в которое вы поместите исполняемый файл.

person Jose Lugo    schedule 24.06.2021

person    schedule
comment
Это лучший и самый простой ответ. Этот метод работает на linux/mono и Windows, независимо от текущего каталога. - person raider33; 17.04.2016

person    schedule
comment
Хорошо, хотя его можно упростить до System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), что также быстрее. - person mklement0; 15.01.2019