1135 votes

Comment puis-je obtenir le chemin de l'application dans une application console .NET ?

Comment trouver le chemin de l'application dans une application console ?

En Formulaires Windows je peux utiliser Application.StartupPath pour trouver le chemin actuel, mais cela ne semble pas être disponible dans une application console.

7 votes

Avez-vous installé .NET Framework sur la machine cible (Client, Développement) ? Si votre réponse est vraie ; Alors, vous pouvez ajouter une référence à System.Windows.Forms.dll et utiliser Application.StartupPath ! C'est le meilleur moyen si vous voulez éviter les exceptions futures !

0 votes

AppDomain.BaseDirectory est le répertoire de l'application. Soyez conscient que l'application peut se comporter différemment dans l'environnement VS et l'environnement Win. Mais AppDomain devrait être le même que application.path mais j'espère que ce n'est pas seulement pour IIS.

5voto

Nirav Mehta Points 1
AppDomain.CurrentDomain.BaseDirectory

Résoudra le problème de la référence aux fichiers de référence des tiers avec les paquets d'installation.

5voto

Donny V. Points 4229

Avec .NET Core 3 et plus, vous obtiendrez le fichier .dll et non le fichier .exe. Pour obtenir le chemin du fichier .exe, vous pouvez utiliser.

var appExePath = Process.GetCurrentProcess().MainModule.FileName;

4voto

daniele3004 Points 62

Essayez cette simple ligne de code :

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

2voto

colin lamarre Points 661

Aucune de ces méthodes ne fonctionne dans des cas particuliers comme l'utilisation d'un lien symbolique vers l'exe, elles renverront l'emplacement du lien et non l'exe réel.

On peut donc utiliser QueryFullProcessImageName pour contourner ça :

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) + @"\";
    }
}

2voto

Sinned Lolwut Points 162

Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName) C'est le seul qui a fonctionné pour moi dans tous les cas que j'ai essayés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X