¿Cómo encuentro la ruta de la aplicación en una aplicación de consola?
En Windows Forms , puedo usar Application.StartupPath
para encontrar la ruta actual, pero esto no parece estar disponible en una aplicación de consola.
c#
.net
console
console-application
JSmyth
fuente
fuente
Respuestas:
System.Reflection.Assembly.GetExecutingAssembly()
. 1Location
Combina eso con
System.IO.Path.GetDirectoryName
si todo lo que quieres es el directorio.fuente
GetExecutingAssembly
devuelve el ensamblado que contiene el código que se está ejecutando actualmente . Esto puede no ser necesariamente el ensamblado .exe de la consola . Puede ser un ensamblaje que se ha cargado desde una ubicación totalmente diferente. Tendrás que usarGetEntryAssembly
! También tenga en cuenta que esCodeBase
posible que no se configure cuando el ensamblaje está en el GAC. La mejor alternativa esAppDomain.CurrentDomain.BaseDirectory
.Puede usar el siguiente código para obtener el directorio de la aplicación actual.
fuente
BaseDirectory
se puede configurar en tiempo de ejecución? Solo tiene un captador.Tiene dos opciones para encontrar el directorio de la aplicación, que elija dependerá de su propósito.
fuente
var localDirectory = new Uri(directory).LocalPath;
Probablemente un poco tarde, pero vale la pena mencionarlo:
O más correctamente para obtener solo la ruta del directorio:
Editar:
Muchas personas han señalado que
GetCommandLineArgs
no se garantiza que devuelva el nombre del programa. Consulte La primera palabra en la línea de comando es el nombre del programa solo por convención . El artículo establece que "Aunque muy pocos programas de Windows usan este capricho (no conozco ninguno)". Por lo tanto, es posible "falsificar"GetCommandLineArgs
, pero estamos hablando de una aplicación de consola. Las aplicaciones de consola suelen ser rápidas y sucias. Entonces esto encaja con mi filosofía KISS.fuente
Para cualquier persona interesada en las aplicaciones web asp.net. Aquí están mis resultados de 3 métodos diferentes
resultado
la aplicación se ejecuta físicamente desde "C: \ inetpub \ SBSPortal_staging", por lo que la primera solución definitivamente no es apropiada para aplicaciones web.
fuente
La respuesta anterior fue el 90% de lo que necesitaba, pero me devolvió un Uri en lugar de un camino normal.
Como se explica en la publicación de foros de MSDN, ¿Cómo convertir la ruta URI a la ruta de archivo normal? , Usé lo siguiente:
fuente
File.CreateDirectory(path)
, se le dará la excepción de que no permite URI caminos ...#
carácter). El identificador y todo lo que sigue se trunca de la ruta resultante.new Uri
ySystem.IO.Path.GetDirectoryName
? Eso te da una cadena de ruta normal en lugar de aUri
.Puede que estés buscando hacer esto:
fuente
puedes usar este en su lugar.
fuente
Si está buscando una forma compatible con .NET Core, use
Esto se introdujo en .NET Framework 4.6 y .NET Core 1.0 (y .NET Standard 1.3). Ver: AppContext.BaseDirectory Property .
De acuerdo con esta página ,
fuente
Process.GetCurrentProcess().MainModule.FileName
Para aplicaciones de consola, puede probar esto:
Salida (en mi máquina local):
O puede intentarlo (hay una barra invertida adicional al final):
Salida:
fuente
BaseDirectory
puede configurar en tiempo de ejecución. NO se garantiza que sea correcto"He usado este código y obtengo la solución.
fuente
Simplemente puede agregar a sus referencias de proyecto
System.Windows.Forms
y luego usar las deSystem.Windows.Forms.Application.StartupPath
siempre.Por lo tanto, no es necesario utilizar métodos más complicados o usar la reflexión.
fuente
La siguiente línea le dará una ruta de aplicación:
La solución anterior funciona correctamente en las siguientes situaciones:
mkbundle
paquetes de Mono (ningún otro método funciona)fuente
Lo uso si se supone que se llama al exe haciendo doble clic en él
fuente
He usado
cuando quiero encontrar una ruta relativa a una carpeta de aplicaciones. Esto funciona tanto para ASP.Net como para aplicaciones winform. Tampoco requiere ninguna referencia a los ensamblados System.Web.
fuente
Quiero decir, ¿por qué no un método ap / invoke?
Lo usarías al igual que Application.StartupPath:
fuente
Assembly.GetEntryAssembly().Location
oAssembly.GetExecutingAssembly().Location
Use en combinación con
System.IO.Path.GetDirectoryName()
para obtener solo el directorio.Las rutas desde
GetEntryAssembly()
yGetExecutingAssembly()
pueden ser diferentes, aunque en la mayoría de los casos el directorio será el mismo.Tenga
GetEntryAssembly()
en cuenta que esto puede volvernull
si el módulo de entrada no está administrado (es decir, C ++ o VB6 ejecutable). En esos casos, es posible usarGetModuleFileName
desde la API de Win32:fuente
en VB.net
funciona para mí (Tipo de aplicación: Biblioteca de clases). No estoy seguro acerca de C # ... Devuelve la ruta sin nombre de archivo como cadena
fuente
Resolverá el problema para referir los archivos de referencia de terceros con paquetes de instalación.
fuente
Ninguno de estos métodos funciona en casos especiales como el uso de un enlace simbólico al exe, devolverán la ubicación del enlace, no el exe real.
Entonces, puede usar QueryFullProcessImageName para evitar eso:
fuente
Pruebe esta simple línea de código:
fuente
Otra solución es usar rutas relativas que apuntan a la ruta actual:
fuente
No vi a nadie convertir el LocalPath proporcionado por la reflexión de .Net Core en una ruta utilizable de System.IO, así que aquí está mi versión.
Esto devolverá la ruta formateada "C: \ xxx \ xxx" completa a donde está su código.
fuente
Hay muchas formas de obtener una ruta ejecutable, la que deberíamos usar depende de nuestras necesidades. Aquí hay un enlace que analiza diferentes métodos.
Diferentes formas de obtener la ruta ejecutable de la aplicación
fuente
Aquí hay una solución confiable que funciona con aplicaciones de 32 bits y 64 bits .
Agregue estas referencias:
Agregue este método a su proyecto:
Ahora úsalo así:
Tenga en cuenta que si conoce la identificación del proceso, este método devolverá el ExecutePath correspondiente.
Extra, para los interesados:
... le dará una serie de todos los procesos que se ejecutan actualmente, y ...
... le dará el proceso actual, junto con su información, por ejemplo, Id, etc. y también un control limitado, por ejemplo, Kill, etc. *
fuente
Puede crear un nombre de carpeta como Recursos dentro del proyecto usando el Explorador de soluciones, luego puede pegar un archivo dentro de los Recursos.
fuente