2016-11-08 2 views
1

TL; DRAusführen von Assembly Ort ist unbekannt

Warum

System.Reflection.Assembly.GetExecutingAssembly().Location 

kehrt "<Unknown>"?

Die ganze Geschichte: Wenn ich meine Konsolenanwendung manuell ausführen, läuft alles gut. Wenn ich den Taskplaner so konfiguriere, dass meine App ausgeführt wird, liegt ein Problem vor: Meine App kann keine abhängigen Dateien finden. Diese Dateien werden in der .config-Datei wie folgt geschrieben: <add key="SomeFile" value="SomeFolder\SomeFile.xml"/>, ich brauche nur relative Pfade.

Wenn ich betreiben meinen App manuell ‚aktuelle Ordner‘ = ‚Anwendungsordner‘, aber wenn ich mit Taskplaner ausführen, ‚aktuelle Ordner‘ = C:\Windows\system32, weil mit dem Task Scheduler meiner App läuft unter taskeng.exe, die in system32 liegt.

So Montage Weg zu finden Ich möchte diesen Code verwenden:

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

aus dieser Antwort https://stackoverflow.com/a/16102640/6184866.

Aber es funktioniert nicht.

+0

können Sie Directory.GetCurrentDirectory dasselbe in einigen Variablen dann Directory.SetCurrentDirectory zu Ihrem erforderlichen dann wieder setzen aktuellen dir zu temp, sobald Sie mit Ihrer Arbeit fertig sind –

Antwort

0

Ich hatte das gleiche Problem auch mit einer Konsolenanwendung.

I erhielt nur diese Störung, wenn:

  1. Baugruppe nach Freisetzung mit Optimierungen auf
  2. gebaut wird das Programm außerhalb von Visual Studio ausgeführt, und dann wird der Prozess zu
  3. Der Befehl angebracht Assembly.GetExecutingAssembly().Location wird über das Direktfenster ausgeführt.

Es kann mit dem folgenden Code repliziert werden. Der Schlaf in einer Schleife dient nur dazu, mir Zeit zu geben, den Debugger anzuhängen.

static void Main(string[] args) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      Console.WriteLine(10 - i); 
      Thread.Sleep(1000); 
     } 

     Console.WriteLine(Assembly.GetExecutingAssembly().Location); 
     Console.WriteLine(Directory.GetCurrentDirectory()); 

     Console.ReadLine(); 
    } 

Setzen von Breakpoints diesen Code (wenn die obigen Einschränkungen erfüllt sind), und aus dem Direktfenster Ausführen des Befehls Assembly.GetExecutingAssembly().Location kehrt <Unknown>. Das Ausführen von Directory.GetCurrentDirectory() gibt Cannot evaluate expression because the code of the current method is optimized.

zurück Beide Befehle führen jedoch aus, und die erwarteten korrekten Werte werden auf der Konsole gedruckt.

Verwandte Themen