Как я могу получить путь к приложению в консольном приложении .NET? - PullRequest
871 голосов
/ 08 мая 2009

Как найти путь к приложению в консольном приложении?

В Windows Forms , я могу использовать Application.StartupPath, чтобы найти текущий путь, но он не доступен в консольном приложении.

Ответы [ 26 ]

1099 голосов
/ 08 мая 2009

System.Reflection.Assembly.GetExecutingAssembly(). Location 1

Объедините это с System.IO.Path.GetDirectoryName, если все, что вам нужно, это каталог.

1 Согласно комментарию г-на Миндора:
System.Reflection.Assembly.GetExecutingAssembly().Location возвращает местоположение текущей сборки, которая может быть, а может и не быть там, где находится сборка, когда она не выполняется. В случае сборок теневого копирования вы получите путь во временный каталог. System.Reflection.Assembly.GetExecutingAssembly().CodeBase вернет «постоянный» путь сборки.

384 голосов
/ 08 мая 2009

Вы можете использовать следующий код для получения текущей директории приложения.

AppDomain.CurrentDomain.BaseDirectory
147 голосов
/ 14 октября 2011

У вас есть два варианта поиска каталога приложения, которое вы выберете, зависит от вашей цели.

// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests, 
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;

//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);
76 голосов
/ 21 мая 2011

Возможно, немного поздно, но стоит упомянуть:

Environment.GetCommandLineArgs()[0];

Или правильнее получить только путь к каталогу:

System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

Edit:

Довольно много людей отметили, что GetCommandLineArgs не гарантирует возвращение имени программы. См. Первое слово в командной строке - это имя программы только по соглашению . В статье утверждается, что «Хотя очень немногие программы для Windows используют эту причуду (я сам о себе не знаю)» Так что можно «подделать» GetCommandLineArgs, но речь идет о консольном приложении. Консольные приложения обычно бывают быстрыми и грязными. Так что это соответствует моей философии KISS.

43 голосов
/ 06 октября 2011

Для всех, кто интересуется веб-приложениями asp.net. Вот мои результаты 3 различных методов

protected void Application_Start(object sender, EventArgs e)
{
  string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
  string p3 = this.Server.MapPath("");
  Console.WriteLine("p1 = " + p1);
  Console.WriteLine("p2 = " + p2);
  Console.WriteLine("p3 = " + p3);
}

результат

p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging

приложение физически работает с "C: \ inetpub \ SBSPortal_staging", поэтому первое решение определенно не подходит для веб-приложений.

36 голосов
/ 14 апреля 2012

Ответ выше был на 90% от того, что мне было нужно, но вместо обычного пути я вернул Uri.

Как объясняется в сообщении на форумах MSDN, Как преобразовать путь URI в обычный путь к файлу? , я использовал следующее:

// Get normal filepath of this assembly's permanent directory
var path = new Uri(
    System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    ).LocalPath;
27 голосов
/ 08 мая 2009

Вы можете сделать это:

System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
23 голосов
/ 16 ноября 2012

Вы можете использовать это вместо этого.

System.Environment.CurrentDirectory
19 голосов
/ 19 июня 2014

Для консольных приложений вы можете попробовать это:

System.IO.Directory.GetCurrentDirectory();

Вывод (на моей локальной машине):

c: \ users \ xxxxxxx \ Documents \ visual studio 2012 \ Проекты \ ImageHandler \ GetDir \ bin \ Debug

Или вы можете попробовать (в конце есть дополнительный обратный слеш):

AppDomain.CurrentDomain.BaseDirectory

Выход:

c: \ users \ xxxxxxx \ documents \ visual studio 2012 \ Projects \ ImageHandler \ GetDir \ bin \ Debug \

15 голосов
/ 31 января 2017

Я использовал этот код и получил решение.

AppDomain.CurrentDomain.BaseDirectory
...