Obtener el directorio de la aplicación de una aplicación WPF

170

Encontré soluciones para Windows Forms con AppDomain pero, ¿cuál sería el equivalente para un Applicationobjeto WPF ?

Joey
fuente

Respuestas:

329

Un método:

System.AppDomain.CurrentDomain.BaseDirectory

Otra forma de hacerlo sería:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)
Helen
fuente
Ah gracias. Debe haber pasado por alto AppDomain de alguna manera. Lo estaba buscando, en realidad ...
Joey
3
@Helen: A juzgar por los votos a favor, esta es obviamente una excelente respuesta. Sin embargo, la respuesta tiene dos formas de obtener el directorio de la aplicación. ¿Funcionarán ambos igualmente bien?
Christoffer Lette
21
Yo usaría la primera alternativa. Parece más simple, no tiene una llamada al método y causa menos dudas sobre lo que la línea realmente hace cuando lee.
Filip
3
He usado el primer método en un servicio WCF, en una aplicación WPF y en un proyecto de biblioteca de clases y funcionó bien en todos.
Apostrofix
1
Para NetCore y NetStandard, recomendaría el segundo, porque AppDomain se agregó en 2.0 y no siempre se pudo configurar como se esperaba
cdie
28

Aquí está otro:

System.Reflection.Assembly.GetExecutingAssembly().Location
Eddie Butt
fuente
2
Éste obtiene la ubicación después de las instantáneas , como se indica en los documentos . En realidad, no estoy seguro de si las sugerencias en la respuesta aceptada se ven afectadas por las instantáneas.
Christoffer Lette
2
Esto me dio el subdirectorio de la DLL que estaba llamando, no el directorio principal del programa.
strattonn
7

También puede usar el primer argumento de los argumentos de la línea de comandos:

String exePath = System.Environment.GetCommandLineArgs()[0]

Dar la vuelta
fuente
1
Sin embargo, tenga en cuenta que una aplicación "malvada" puede modificar sus argumentos de línea de comando.
Daniel Rose
@Daniel: ¿Por qué se lo haría a sí mismo? ¿O te refieres a una aplicación diferente?
Merlyn Morgan-Graham
1
@ Merlyn: Ver blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Citaré: es un "parámetro convenientemente inicializado para el código de inicio del proceso". Por lo tanto, puede modificar deliberada o inadvertidamente esa ubicación de memoria.
Daniel Rose
1
@Daniel: ¿Quién puede? ¿Otro proceso, o el mismo proceso? Si te disparas en el pie, debería ser fácil rastrearlo. Yo lo llamaría menos malvado y más estúpido :) Si otro proceso puede hacerlo, entonces eso es más interesante. Editar: no veo nada en ese artículo sobre la modificación de la línea de comando de un programa en ejecución, solo que el proceso de lanzamiento lo pasa (no estoy seguro de que no sea deseable que el proceso de lanzamiento cambie la línea de comando) y que pueda consultarlo a través de WMI.
Merlyn Morgan-Graham
@ MerlynMorgan-Graham, una aplicación maliciosa puede modificar la dirección de memoria y forzar a su aplicación a ejecutar otra de sus aplicaciones maliciosas. Esto es malo, porque digamos que su aplicación es un keylogger y quieren que se active tan pronto como abra una aplicación específica. Entonces, en su código, capturarán el nombre de su aplicación, ejecutarán su keylogger en segundo plano y luego ejecutarán su aplicación. El usuario no tendrá ni idea. El artículo explica esto, pero no le dice cómo hacerlo. Tal vez eso es lo que estabas buscando?
pqsk
6

Solía ​​simple string baseDir = Environment.CurrentDirectory;y su trabajo para mí.

Buena suerte

Editar:

Solía ​​eliminar este tipo de error, pero prefiero editarlo porque creo que el punto negativo de esta respuesta ayuda a las personas a saber de manera incorrecta. :) Comprendí que la solución anterior no es útil y la cambié a string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Otras formas de obtenerla son:

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

Buena suerte

QMaster
fuente
3
Ese es el directorio de trabajo actual. Se puede conincide con el directorio de la aplicación pero esos son conceptos distintos (y lo más importante, el directorio de trabajo puede cambiar, por ejemplo, si usted tenía un cuadro de diálogo de archivo común abierto).
Joey
1
@joey tienes razón. Lo cambié a esto: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Gracias.
QMaster
3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

¡Prueba esto!

Arsen Mkrtchyan
fuente
3

Prueba esto. No se olvide using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
Roshan J
fuente
1

Intenté esto:

    label1.Content = Directory.GetCurrentDirectory();

y obtener también el directorio

Pablo
fuente
Esto obtiene el directorio de trabajo actual, que puede ser diferente del directorio de proceso.
Thraka
Supongo que tengo que evaluar Directory.GetCurrentDirectory (); más. Gracias @Thraka por la corrección.
Paul
0

¡También puede usar libremente Application.StartupPath desde System.Windows.Forms, pero debe agregar una referencia para el ensamblado System.Windows.Forms!

choque
fuente