2008-10-14 19 views
57

¿Cómo puedo encontrar la carpeta donde está instalado dinámicamente el archivo .exe del servicio de Windows?Obteniendo la ruta completa para el servicio de Windows

Path.GetFullPath(relativePath); 

devuelve una ruta basada en C:\WINDOWS\system32 directorio.

Sin embargo, el método XmlDocument.Load(string filename) parece estar trabajando contra la ruta relativa dentro del directorio donde está instalado el archivo .exe de servicio.

Respuesta

82

Trate

System.Reflection.Assembly.GetEntryAssembly().Location 
+1

corto y dulce. :) –

+3

"System.Reflection.Assembly.GetEntryAssembly()" es nulo para mi servicio. –

+2

Mira Curtis Yallop answser. ¡Mucho mejor! –

-4

Esto debería dar el camino que el ejecutable reside en:

Environment.CurrentDirectory; 

Si no es así, usted podría intentar:

Directory.GetParent(Assembly.GetEntryAssembly().Location).FullName 

A más hacky, pero forma funcional:

Path.GetFullPath("a").TrimEnd('a') 

:)

+5

-1: Environment.CurrentDirectory y su solución hacky devuelven el directorio de trabajo actual, que por lo que OP dice es el directorio system32. – Joe

5

Esto funciona para nuestro servicio de ventanas:

//CommandLine without the first and last two characters 
//Path.GetDirectory seems to have some difficulties with these (special chars maybe?) 
string cmdLine = Environment.CommandLine.Remove(Environment.CommandLine.Length - 2, 2).Remove(0, 1); 
string workDir = Path.GetDirectoryName(cmdLine); 

Esto debe darle la ruta absoluta del ejecutable.

5

Otra versión de lo anterior:

string path = Assembly.GetExecutingAssembly().Location; 
FileInfo fileInfo = new FileInfo(path); 
string dir = fileInfo.DirectoryName; 
38
Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) 
3

Environment.CurrentDirectory vuelve directorio actual en el programa se está ejecutando. En el caso del servicio de Windows, devuelve la ruta% WINDIR%/system32 que es donde se ejecutará el ejecutable en lugar de donde se despliegue el ejecutable.

65

Prueba esto:

AppDomain.CurrentDomain.BaseDirectory 

(igual que aquí: How to find windows service exe path)

+0

+1 Esta solución es mucho mejor que la seleccionada. –

+1

Gracias por esto. Tenía un servicio NServiceBus, y dado que se cierra en NServiceBus.Host.exe, el 'GetEntryAssembly()' era nulo en mi proyecto real. Esto funcionó perfectamente sin embargo. – Matt

Cuestiones relacionadas