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

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

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

Ответы [ 26 ]

2 голосов
/ 05 февраля 2017

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

Так что можете использовать QueryFullProcessImageName , чтобы обойти это:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;

internal static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern bool QueryFullProcessImageName([In]IntPtr hProcess, [In]int dwFlags, [Out]StringBuilder lpExeName, ref int lpdwSize);

    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern IntPtr OpenProcess(
        UInt32 dwDesiredAccess,
        [MarshalAs(UnmanagedType.Bool)]
        Boolean bInheritHandle,
        Int32 dwProcessId
    );
}

public static class utils
{

    private const UInt32 PROCESS_QUERY_INFORMATION = 0x400;
    private const UInt32 PROCESS_VM_READ = 0x010;

    public static string getfolder()
    {
        Int32 pid = Process.GetCurrentProcess().Id;
        int capacity = 2000;
        StringBuilder sb = new StringBuilder(capacity);
        IntPtr proc;

        if ((proc = NativeMethods.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pid)) == IntPtr.Zero)
            return "";

        NativeMethods.QueryFullProcessImageName(proc, 0, sb, ref capacity);

        string fullPath = sb.ToString(0, capacity);

        return Path.GetDirectoryName(fullPath) + @"\";
    }
}
1 голос
/ 23 июня 2019

Другое решение - использовать относительные пути, указывающие на текущий путь:

Path.GetFullPath(".")
0 голосов
/ 03 апреля 2018

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

Различные способы получить путь к исполняемому файлу приложения

0 голосов
/ 28 мая 2012

Вы можете создать имя папки как Ресурсы в рамках проекта, используя Solution Explorer, затем вы можете вставить файл в Ресурсы.

private void Form1_Load(object sender, EventArgs e) {
    string appName = Environment.CurrentDirectory;
    int l = appName.Length;
    int h = appName.LastIndexOf("bin");
    string ll = appName.Remove(h);                
    string g = ll + "Resources\\sample.txt";
    System.Diagnostics.Process.Start(g);
}
0 голосов
/ 07 февраля 2018

Я не видел, чтобы кто-нибудь преобразовал LocalPath, предоставленный отражением .Net Core, в пригодный для использования путь System.IO, так что вот моя версия.

public static string GetApplicationRoot()
{
   var exePath = new Uri(System.Reflection.
   Assembly.GetExecutingAssembly().CodeBase).LocalPath;

   return new FileInfo(exePath).DirectoryName;

}

Это вернет полный путь в формате «C: \ xxx \ xxx», где находится ваш код.

0 голосов
/ 09 марта 2016

Вот надежное решение, которое работает с 32-битными и 64-битными приложениями.

Добавить эти ссылки:

с использованием System.Diagnostics;

с использованием System.Management;

Добавьте этот метод в ваш проект:

public static string GetProcessPath(int processId)
{
    string MethodResult = "";
    try
    {
        string Query = "SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId;

        using (ManagementObjectSearcher mos = new ManagementObjectSearcher(Query))
        {
            using (ManagementObjectCollection moc = mos.Get())
            {
                string ExecutablePath = (from mo in moc.Cast<ManagementObject>() select mo["ExecutablePath"]).First().ToString();

                MethodResult = ExecutablePath;

            }

        }

    }
    catch //(Exception ex)
    {
        //ex.HandleException();
    }
    return MethodResult;
}

Теперь используйте это так:

int RootProcessId = Process.GetCurrentProcess().Id;

GetProcessPath(RootProcessId);

Обратите внимание, что если вы знаете идентификатор процесса, этот метод вернет соответствующий ExecutePath.

Дополнительно, для заинтересованных:

Process.GetProcesses() 

... предоставит вам массив всех запущенных в данный момент процессов и ...

Process.GetCurrentProcess()

... даст вам текущий процесс, вместе с их информацией, например, Идентификатор и т. Д., А также ограниченный контроль, например, Убить и т. Д. *

...