Was ist der beste Weg, um das Verzeichnis zu erhalten, von dem eine Baugruppe ausgeführt wird

StackOverflow https://stackoverflow.com/questions/253468

  •  05-07-2019
  •  | 
  •  

Frage

Für meine apps, speichere ich eine Konfigurationsdatei in XML zusammen mit der Baugruppe (exe), und etwas anderen temporären Dateien für verarbeitend Zweck.

fand ich einige Marotte mit ".\\" und Application.StartupPath.

Ich habe mit

String configPath = ".\\config.xml";

Es funktioniert gut, bis ich OpenFIleDialog genannt einige Dateien in andere Ordner zu öffnen, oben habe die Aussage. Scheinbar „\“ bezieht sich auf ‚Current‘, die jedes Mal ändert, wenn wir in einen anderen Ordner zu sehen.

An einem gewissen Punkt war ich mit

String configPath = Path.Combine(Application.StartupPath + "config.xml");

An einem gewissen Punkt, wenn ich diese Anordnung aus einem anderen Ordner ausführen muß von Process.Start() verwenden, beginnen die Dinge auseinander zu fallen. Anscheinend ist das Arbeitsverzeichnis ist nicht richtig eingestellt, und Application.StartupPath bezieht sich tatsächlich auf Arbeitsverzeichnis statt des Verzeichnisses von dem die Anordnung ausgeführt wird, wie ich angenommen habe. Also muss ich greifen Process Konfiguration siehe das Arbeitsverzeichnis in das Verzeichnis der Montage. Ich hatte auch Problem damit, wenn ich VSTO war zu schreiben.

Also, meine Frage ist, was ist die beste, einfachste und gesicherte Art und Weise das aktuelle Verzeichnis zu erhalten, dass die Montage ausgeführt wird, ohne dass diese Macken (oder Missverständnis), die ich habe gerade erwähnt?

EDIT: Ich meinte, das Verzeichnis zu erhalten, die die Baugruppe befinden

EDIT: Laut MSDN auf AppDomain.BaseDirectory , so scheint es, dass es Änderungen während der Laufzeit sein kann, das ist das, was ich nicht will (Nur um zu klären, nicht, dass ich will nicht zulassen Basedirectory ändern, sondern, wenn ich es wieder sicher, ohne zu wissen, ob es hat sich geändert)

EDIT: Ich habe bemerkt, dass eine ähnliche Frage wurde schon viel früher geschrieben. Was würde das aktuelle Verzeichnis eines verursachen App ausgeführt wird sich ändern?

Danke Jungs für die Antwort.

War es hilfreich?

Lösung

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))

Andere Tipps

Versuchen Sie, die Umsetzung unten. Die Code-Basis-Eigenschaft ist der zuverlässigste Weg, um die Lage zu bekommen, und dann wird der Rest des Codes wandelt sie in Standard-Windows-Format (anstelle einer URI).

static public string AssemblyLoadDirectory
{
    get
    {
        string codeBase = Assembly.GetCallingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

Haben Sie das aktuelle Arbeitsverzeichnis werden soll, oder das Verzeichnis der Baugruppe enthalten? Es ist nicht ganz klar.

Es gibt Environment.CurrentDirectory , wenn Sie das Arbeitsverzeichnis wollen oder Path.GetDirectoryName(typeof(Foo).Assembly.ManifestModule.FullyQualifiedName) die Position einer Baugruppe (oder zumindest dessen Manifest-Modul, das die gleiche Sache in fast allen Fällen sein wird) zu finden.

Es gibt auch,

System.Reflection.Assembly.GetExecutingAssembly().CodeBase

Ein bisschen kürzer:

AppDomain.Current.BaseDirectory

würde ich so etwas wie dies versuche, aus dem folgenden Link :

string path;
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
MessageBox.Show( path );

Wie wäre es

string currentAssemblyFile = System.Reflection.Assembly.GetExecutingAssembly().Location;

und dann herauszufinden, von dort ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top