2016-11-08 1 views
1

TL; DRAssemblée exécution L'emplacement est inconnu

Pourquoi

System.Reflection.Assembly.GetExecutingAssembly().Location 

retours "<Unknown>"?

Toute l'histoire: Lorsque je lance ma console manuellement, tout se passe bien. Lorsque je définis le planificateur de tâches pour exécuter mon application, un problème se pose: mon application ne trouve pas de fichiers dépendants. Ces fichiers sont écrits dans le fichier .config comme ceci: <add key="SomeFile" value="SomeFolder\SomeFile.xml"/>, je n'ai besoin que de chemins relatifs.

Quand je lance mon application manuellement, « dossier en cours » = « dossier d'application », mais quand je lance avec Planificateur de tâches, « dossier en cours » = C:\Windows\system32, car avec Planificateur de tâches de mon application fonctionne sous taskeng.exe qui se trouve dans system32.

donc trouver chemin d'assemblage Je veux utiliser ce code:

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

de cette réponse https://stackoverflow.com/a/16102640/6184866.

Mais cela ne fonctionne pas.

+0

vous pouvez obtenir Directory.GetCurrentDirectory même dans une variable, puis Directory.SetCurrentDirectory à votre requis puis à nouveau définir dir actuel à temp une fois que vous avez terminé votre travail –

Répondre

0

J'ai eu ce même problème également avec une application de console.

Je ne ai reçu cette erreur lorsque:

  1. L'ensemble est construit comme version avec Optimisations sur
  2. Le programme est exécuté en dehors de Visual Studio, puis le processus est attaché à
  3. La commande Assembly.GetExecutingAssembly().Location est exécuté via la fenêtre immédiate.

Il peut être répliqué avec le code suivant. Le sommeil dans une boucle est juste pour me donner le temps d'attacher le débogueur.

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

Breakpointing ce code (lorsque les contraintes ci-dessus sont vraies) et de la fenêtre Exécution d'exécuter la commande Assembly.GetExecutingAssembly().Location retours <Unknown>. L'exécution Directory.GetCurrentDirectory() retourne Cannot evaluate expression because the code of the current method is optimized.

Cependant, les deux commandes Executer et imprimer les valeurs correctes attendues à la console.