2009-01-29 5 views
19

Je suis assez sûr qu'un service Windows obtient C: \ winnt (ou similaire) comme son répertoire de travail lorsqu'il est installé en utilisant InstallUtil.exe. Est-il possible d'accéder ou de capturer (au moment de l'installation) le répertoire à partir duquel le service a été installé à l'origine? En ce moment, je saisis manuellement cela dans le fichier app.exe.config, mais c'est horriblement manuel et on se sent comme un hack.Comment trouver le répertoire d'installation d'un service Windows en utilisant C#?

Existe-t-il une méthode par programmation, au moment de l'exécution ou de l'installation, pour déterminer l'origine du service?

Répondre

33

Vous pouvez utiliser la réflexion pour obtenir l'emplacement de l'assemblage en cours d'exécution. Voici une routine simple qui définit le répertoire de travail à l'emplacement de la réflexion exécution en utilisant l'assemblage:

String path = System.Reflection.Assembly.GetExecutingAssembly().Location; 
path = System.IO.Path.GetDirectoryName(path); 
Directory.SetCurrentDirectory(path); 
+1

Cela ne donne-t-il pas 'C: \ Windows \ system32'? – ProfK

+0

@ProfK, non, il donne l'emplacement de l'assemblage en cours d'exécution. Ce serait le répertoire de l'exécutable réel pour le programme en cours d'exécution. –

+0

Mon mauvais. J'ai trouvé mon service à la recherche de app.config dans 'C: \ Windows \ system32' et supposé qu'il pensait que son emplacement était là. – ProfK

7

Voulez-vous dire que vous voulez le répertoire contenant l'assemblage? Si oui, c'est facile: utilisez Assembly.Location.

Je ne voudrais pas essayer changer le répertoire de travail du processus si - je ne serais pas surpris si cela avait des effets secondaires désagréables, si en effet vous êtes autorisé à le faire.

+0

Merci, Jon. Vous aviez raison, la question n'était pas formulée correctement, alors j'ai changé. – endian

+0

Alors Jon, a-t-il été confirmé que l'on ne voudrait PAS changer le dossier de travail d'un service une fois qu'il est installé et/ou en cours d'exécution, ou existe-t-il un moyen de accéder aux fichiers/dossiers en utilisant des chemins relatifs, plutôt que des chemins absolus? Je vois la même chose avec mon service, qui a été écrit à peu près comme un exe pour tester/déboguer, puis définir un seul symbole et compiler le compile vers un service, mais il est toujours à court de% SYSTEMROOT% \ System32 .. – LarryF

+0

@LarryF: Je ne connais aucun moyen de changer le répertoire de travail utilisé pour un service, non. Cela ne veut pas dire qu'il n'y a aucun moyen de le faire, mais je n'en connais pas. –

2

InstallUtil.exe appelle ServiceInstaller.Install() de votre application lors de l'installation. Remplacez-le, ajoutez-le à la liste des Installers de votre projet et obtenez toutes les informations dont vous avez besoin.

+0

Merci. Les approches d'exécution de Jon et Steve sont en fait un meilleur ajustement pour ce que je dois faire. – endian

5

je ne savais pas la méthode Directory.SetCurrentDirectory. Habituellement je fais:

Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory; 
3

Bien que très tard, mais il peut aider quelqu'un. Je l'ai résolu ce problème en utilisant AppDomain.CurrentDomain.BaseDirectory

string someFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Resources\SomeResource.xml"; 

AppDomain.CurrentDomain.BaseDirectory a donné le répertoire où a été fait isntalled le service Windows, et non pas le répertoire C: \ Windows \ system32 \ chemin.

J'ai vu plus tard que @Ramon a déjà posté la même solution.

Questions connexes