2009-01-29 10 views
19

Estoy bastante seguro de que un servicio de Windows obtiene C: \ winnt (o similar) como su directorio de trabajo cuando se instala utilizando InstallUtil.exe. ¿Hay alguna forma de que pueda acceder o capturar (en el momento de la instalación) el directorio desde el que se instaló originalmente el servicio? Por el momento estoy ingresando manualmente eso en el archivo app.exe.config, pero eso es terriblemente manual y se siente como un truco.¿Cómo puedo encontrar el directorio de instalación de un servicio de Windows, usando C#?

¿Existe una manera programática, ya sea en tiempo de ejecución o de instalación, para determinar desde dónde se instaló el servicio?

Respuesta

33

Puede usar el reflejo para obtener la ubicación del ensamblaje de ejecución. Aquí está una rutina simple que establece el directorio de trabajo a la ubicación de la reflexión de montaje ejecutar usando:

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

¿Esto no da 'C: \ Windows \ system32'? – ProfK

+0

@ProfK, no, proporciona la ubicación del ensamblaje en ejecución. Este sería el directorio del ejecutable real para el programa que se está ejecutando. –

+0

Mi mal. Encontré mi servicio buscando app.config en 'C: \ Windows \ system32' y asumí que pensaba que su ubicación estaba allí. – ProfK

7

¿Quiere decir que quiere el directorio que contiene el conjunto? Si es así, es fácil: use Assembly.Location.

No trataría de cambiar el directorio de trabajo del proceso sin embargo - No me sorprendería si eso tuviera efectos secundarios desagradables, si de hecho se le permite hacerlo.

+0

Gracias, Jon. Tenías razón, la pregunta no estaba redactada correctamente, así que la cambié. – endian

+0

Así que Jon, ¿se ha confirmado que uno NO querría cambiar la carpeta de trabajo de un servicio una vez que se instala y/o se ejecuta, o hay una forma de obtener la carpeta de trabajo establecida durante la INSTALACIÓN del servicio, para que pueda para acceder a archivos/carpetas usando rutas relativas, en lugar de rutas absolutas? Estoy viendo lo mismo con mi servicio, que fue escrito más o menos como un exe para probar/depurar, luego definir un solo símbolo y compilarlo lo compila en un servicio, pero siempre se está quedando sin% SYSTEMROOT% \ System32. – LarryF

+0

@LarryF: No conozco ninguna forma de cambiar el directorio de trabajo utilizado para un servicio, no. Eso no significa que no hay forma de hacerlo, pero no sé de ninguno. –

2

InstallUtil.exe llama al ServiceInstaller.Install() de su aplicación en el momento de la instalación.

Anule, agréguelo a la lista de su proyecto Installers y obtenga la información que necesita.

+0

Gracias. Los enfoques de tiempo de ejecución de Jon y Steve son en realidad una mejor opción para lo que tengo que hacer. – endian

5

No sabía el método Directory.SetCurrentDirectory. Normalmente lo hago:

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

Aunque es muy tarde, pero puede ayudar a alguien. He resuelto este problema utilizando AppDomain.CurrentDomain.BaseDirectory

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

AppDomain.CurrentDomain.BaseDirectory dio el directorio en el servicio de las ventanas era en realidad isntalled, no el directorio C: \ Windows \ system32 \ ruta.

Lo vi más tarde que @Ramon ya ha publicado la misma solución.

Cuestiones relacionadas