Frage

Wie finde ich den Weg der Anwendung in einer Konsolenanwendung?

Windows Forms , ich Application.StartupPath kann den aktuellen Pfad zu finden, aber das doesn‘ t scheinen in einer Konsolenanwendung zur Verfügung stehen.

War es hilfreich?

Lösung

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

Kombinieren Sie das mit System.IO.Path.GetDirectoryName wenn alle Sie ist das Verzeichnis.

  

1 Wie pro Mr.Mindor Kommentar:
  System.Reflection.Assembly.GetExecutingAssembly().Location zurückkehrt, wo die Ausführung von Montage derzeit befindet, die möglicherweise oder auch nicht sein, wo die Anordnung angeordnet ist, wenn sie nicht ausgeführt wird. Im Fall von Schattenkopier Baugruppen, werden Sie einen Pfad in einem temporären Verzeichnis. System.Reflection.Assembly.GetExecutingAssembly().CodeBase die ‚ständigen‘ Weg der Rückkehr die Montage.

Andere Tipps

Sie können den folgenden Code verwenden, um das aktuelle Anwendungsverzeichnis zu erhalten.

AppDomain.CurrentDomain.BaseDirectory

Sie haben zwei Möglichkeiten für das Verzeichnis der Anwendung zu finden, die Sie auf Ihrem Zweck wählten abhängen.

// 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);

Wahrscheinlich ein bisschen spät, aber das ist eine Erwähnung wert:

Environment.GetCommandLineArgs()[0];

oder richtiger nur den Verzeichnispfad zu erhalten:

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

Edit:

Nicht wenige Menschen haben darauf hingewiesen, dass GetCommandLineArgs nicht den Namen des Programms garantiert zurückzukehren. Siehe Das erste Wort in der Befehlszeile nur der Programmname durch Konvention . Der Artikel macht fest, dass „Obwohl sehr wenige Windows-Programme diese Marotte verwenden (Ich bin nicht bekannt, dass ich)“. So ist es möglich, ‚Parodie‘ GetCommandLineArgs, aber wir sprechen über eine Konsolenanwendung. Console-Anwendungen sind in der Regel schnell und schmutzig. Also das paßt in meiner KISS-Philosophie.

Für alle Interessierten in asp.net Web-Anwendungen. Hier sind meine Ergebnisse von 3 verschiedenen Methoden

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);
}

Ergebnis

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

die App physisch von ausgeführt wird. "C: \ inetpub \ SBSPortal_staging", so die erste Lösung ist definitiv nicht geeignet für Web-Anwendungen

Die Antwort war mehr als 90% von dem, was ich brauchte, aber einen Uri anstelle einem normalen Weg für mich zurück.

Wie in den MSDN-Foren posten,

Sie können suchen, dies zu tun:

System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

Sie können dieses verwenden statt.

System.Environment.CurrentDirectory

Für Konsolenanwendungen, können Sie dies versuchen:

System.IO.Directory.GetCurrentDirectory();

Output (auf meinem lokalen Rechner):

  

c: \ users \ xxxxxxx \ Dokumente \ Visual Studio 2012 \ Projects \ imagehandler \ GetDir \ bin \ Debug

Sie können auch versuchen (es gibt einen zusätzlichen Backslash am Ende):

AppDomain.CurrentDomain.BaseDirectory

Ausgabe:

  

c: \ users \ xxxxxxx \ Dokumente \ Visual Studio 2012 \ Projects \ imagehandler \ GetDir \ bin \ Debug \

Ich habe diesen Code verwendet und die Lösung bekommen.

AppDomain.CurrentDomain.BaseDirectory

Ich habe verwendet

System.AppDomain.CurrentDomain.BaseDirectory

, wenn ich will einen Pfad relativ zu einem Anwendungsordner finden. Dies funktioniert sowohl für ASP.Net und winform Anwendungen. Es erfordert auch keinen Hinweis auf System.Web Baugruppen.

Sie können einfach auf Ihre Projektreferenzen System.Windows.Forms hinzufügen und dann die System.Windows.Forms.Application.StartupPath wie gewohnt verwenden.

Also, nicht braucht für kompliziertere Methoden oder mit der Reflexion.

Ich benutze dies, wenn die exe mit einem Doppelklick zu heißen soll, klicken Sie

var thisPath = System.IO.Directory.GetCurrentDirectory();

Ich meine, warum nicht ein p / aufrufen Methode?

    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());
                }
            }
    }

Sie würden es nutzen ebenso wie die Application.StartupPath:

    Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");

Zeile Nach erhalten Sie einen Anwendungspfad:

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

Vor Lösung ordnungsgemäß funktionieren Situationen in der folgenden:

  • einfache Anwendung
  • in einer anderen Domäne, in Assembly.GetEntryAssembly () zurückkehren würde null
  • DLL wird von Embedded-Ressourcen als Byte-Array geladen und AppDomain als Assembly.Load (byteArrayOfEmbeddedDll)
  • geladen

Assembly.GetEntryAssembly().Location oder Assembly.GetExecutingAssembly().Location

In Kombination mit System.IO.Path.GetDirectoryName() nur das Verzeichnis zu erhalten.

Die Wege von GetEntryAssembly() und GetExecutingAssembly() können unterschiedlich sein, auch wenn für die meisten Fälle wird das Verzeichnis gleich sein.

Mit GetEntryAssembly() müssen Sie beachten, dass dieser null zurückkehren kann, wenn das Eingabemodul unmanaged ist (dh C ++ oder VB6 ausführbar). In diesen Fällen ist es möglich, GetModuleFileName aus der Win32-API zu verwenden:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
AppDomain.CurrentDomain.BaseDirectory

Wird das Problem beheben, um die 3rd-Party-Referenzdateien mit Installationspaketen beziehen.

in VB.net

My.Application.Info.DirectoryPath

funktioniert für mich (Anwendungsart: Klassenbibliothek). Nicht sicher C # ... Gibt den Pfad w / o Dateiname als Zeichenfolge

Keine dieser Methoden in besonderen Fällen arbeiten, um eine symbolische Verbindung zum exe wie verwendet, werden sie die Lage der Verbindung nicht die tatsächliche exe zurück.

kann also benutzen QueryFullProcessImageName zu umgehen, dass:

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

Versuchen Sie diese einfache Codezeile:

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

Eine andere Lösung relative Pfade verwendet, um den Strompfad zeigt:

Path.GetFullPath(".")

Ich habe niemand die LocalPath von Net Core-Reflexion in einen nutzbaren System.IO Pfad vorgesehen konvertieren, so ist hier meine Version.

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

   return new FileInfo(exePath).DirectoryName;

}

Dies wird die volle „C: \ xxx \ xxx“ Rückkehr formatiert Pfad zu dem der Code ist.

Es gibt viele Möglichkeiten ausführbaren Pfad zu bekommen, was man wir es auf unsere Bedürfnisse hängt verwenden sollte hier eine Verbindung, die verschiedenen Methoden zu diskutieren.

Verschiedene Möglichkeiten Anwendung direkt ausführbaren Pfad zu bekommen

Hier ist eine zuverlässige Lösung, die mit arbeitet 32bit und 64bit Anwendungen.

Fügen Sie diese Verweise:

  

using System.Diagnostics;

     

mit System.Management;

Fügen Sie diese Methode zu einem Projekt:

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;
}

es nun mit etwa so:

int RootProcessId = Process.GetCurrentProcess().Id;

GetProcessPath(RootProcessId);

Beachten Sie, dass, wenn Sie die ID des Prozesses kennen, dann wird diese Methode die entsprechenden ExecutePath zurück.

Extra, für die Interessenten:

Process.GetProcesses() 

... werden Sie einen Array aller laufenden Prozesse und ...

Process.GetCurrentProcess()

... geben Sie den aktuellen Prozess, zusammen mit ihren Informationen z.B. ID usw. und auch begrenzt Steuer z.B. Töten, etc. *

Sie können einen Ordnernamen als Ressourcen innerhalb des Projektes erstellen mit Mappen-Explorer, können Sie eine Datei in den Ressourcen einfügen.

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top