2010-06-26 16 views
38

¿Cómo puedo encontrar la ubicación del archivo ejecutable de mi aplicación en WPF (C# o VB.Net)?¿Encuentra la ubicación del ejecutable de mi aplicación en WPF (C# o vb.net)?

He utilizado este código con Windows Forms:

Application.ExecutablePath.ToString(); 

Pero con WPF que recibieron este error de Visual Studio:

System.Window.Application no contiene una definición para ExecutablePath .

+1

posible duplicado de [Obtener ruta de la aplicación] (http://stackoverflow.com/questions/218061/get-the-applications- ruta) –

+5

¿No? Java! = C#? – Kian

Respuesta

76

System.Reflection.Assembly.GetExecutingAssembly().Location debería funcionar.

+8

Esto puede no funcionar correctamente todo el tiempo. Obtendrá el ensamblado de ejecución, no el ejecutable de la aplicación. Esto significa que esto no funcionará si se ejecuta a través de una DLL referenciada si desea el ejecutable de la aplicación. –

24

varias alternativas:

Directory.GetParent(Assembly.GetExecutingAssembly().Location) 

System.AppDomain.CurrentDomain.BaseDirectory 

Sólo en VB:

My.Application.Info.DirectoryPath 
+0

gracias por su atención trabajado – Shahin

+1

System.AppDomain.CurrentDomain.BaseDirectory devuelve el directorio actual, no la ubicación ejecutable, es decir, cuando se ejecuta desde outlook (enviado como un enlace a \\ server \ folder \ file.exe establecerá BaseDirectory a los documentos del usuario en su lugar, ubicación ejecutable –

+0

¿No debería ser esta la solución aceptada? – FranzHuber23

2

El montaje de ejecución puede ser un DLL si el código se encuentra en una biblioteca:

var executingAssembly = Assembly.GetExecutingAssembly(); //MyLibrary.dll 
var callingAssembly = Assembly.GetCallingAssembly(); //MyLibrary.dll 
var entryAssembly = Assembly.GetEntryAssembly(); //WpfApp.exe or MyLibrary.dll 

Así que la La mejor manera que encontré es (C#):

var wpfAssembly = (AppDomain.CurrentDomain 
       .GetAssemblies() 
       .Where(item => item.EntryPoint != null) 
       .Select(item => 
        new {item, applicationType = item.GetType(item.GetName().Name + ".App", false)}) 
       .Where(a => a.applicationType != null && typeof(System.Windows.Application) 
        .IsAssignableFrom(a.applicationType)) 
        .Select(a => a.item)) 
      .FirstOrDefault(); 

Así, en su caso, se puede encontrar la ubicación de la asamblea:

var location = wpfAssembly.Location; 
+0

Buena técnica @ scrat789. Llega al ensamblado regular de .exe incluso cuando se ejecuta en el depurador. Nada de eso XXX.vshost.exe. –

0

apoyan en otras respuestas, he aquí un ejemplo que muestra cómo quitar el nombre del ejecutable del camino y combinar el resultado con alguna subcarpeta y nombre de archivo:

en mi versión actualizada Hotspotizer (http://github.com/birbilis/Hotspotizer), que acaba de añadir soporte para cargar un archivo de colección de gestos en el arranque, si se encuentra en la Biblioteca \ Default.hsjson, utilizando el siguiente código:

const string GESTURE_COLLECTION_LIBRARY_PATH = "Library" 
const string DEFAULT_GESTURE_COLLECTION = "Default.hsjson" 

//... 

LoadGestureCollection(
    Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), 
    GESTURE_COLLECTION_LIBRARY_PATH, 
    DEFAULT_GESTURE_COLLECTION)); 
1

esto es útil para usted: Application.ExecutablePath es igual a:

Process.GetCurrentProcess().MainModule.FileName; 
Cuestiones relacionadas