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

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

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

Ответы [ 26 ]

13 голосов
/ 02 февраля 2018

Если вы ищете способ совместимый с .NET Core, используйте

System.AppContext.BaseDirectory

Это было представлено в .NET Framework 4.6 и .NET Core 1.0 (и .NET Standard 1.3). См .: Свойство AppContext.BaseDirectory .

Согласно этой странице ,

Это предпочтительная замена для AppDomain.CurrentDomain.BaseDirectory в .NET Core

8 голосов
/ 26 апреля 2016

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

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

8 голосов
/ 07 апреля 2014

Я использовал

System.AppDomain.CurrentDomain.BaseDirectory

когда я хочу найти путь относительно папки приложений. Это работает как для ASP.Net, так и для приложений winform. Также не требуется никаких ссылок на сборки System.Web.

7 голосов
/ 15 февраля 2013

Я использую это, если предполагается, что exe-файл вызывается двойным щелчком

var thisPath = System.IO.Directory.GetCurrentDirectory();
6 голосов
/ 25 июля 2014

Я имею в виду, почему не метод p / invoke?

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    public class AppInfo
    {
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = false)]
            private static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
            private static HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);
            public static string StartupPath
            {
                get
                {
                    StringBuilder stringBuilder = new StringBuilder(260);
                    GetModuleFileName(NullHandleRef, stringBuilder, stringBuilder.Capacity);
                    return Path.GetDirectoryName(stringBuilder.ToString());
                }
            }
    }

Вы бы использовали его так же, как Application.StartupPath:

    Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");
6 голосов
/ 23 февраля 2018

Следующая строка даст вам путь к приложению:

var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

Вышеупомянутое решение работает должным образом в следующих ситуациях:

  • простое приложение
  • в другом домене, где Assembly.GetEntryAssembly () будет возвращать ноль
  • DLL загружается из встроенных ресурсов как байтовый массив и загружается в домен приложений как Assembly.Load (byteArrayOfEmbeddedDll)
5 голосов
/ 12 апреля 2015

в VB.net

My.Application.Info.DirectoryPath

работает для меня (Тип приложения: Библиотека классов). Не уверен насчет C # ... Возвращает путь без имени файла в виде строки

5 голосов
/ 29 марта 2012

Assembly.GetEntryAssembly().Location или Assembly.GetExecutingAssembly().Location

Используйте в сочетании с System.IO.Path.GetDirectoryName(), чтобы получить только каталог.

Пути от GetEntryAssembly() и GetExecutingAssembly() могут отличаться, хотя в большинстве случаев каталог будет одинаковым.

С GetEntryAssembly() вы должны знать, что это может вернуть null, если модуль ввода неуправляемый (т.е. исполняемый файл C ++ или VB6). В этих случаях можно использовать GetModuleFileName из Win32 API:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
5 голосов
/ 14 июля 2014
AppDomain.CurrentDomain.BaseDirectory

Устранит проблему, ссылаясь на сторонние справочные файлы с установочными пакетами.

2 голосов
/ 20 ноября 2017

Попробуйте эту простую строку кода:

 string exePath = Path.GetDirectoryName( Application.ExecutablePath);
...