2009-08-27 10 views
13

Antecedentes:Environment.CurrentDirectory está dando resultados inesperados cuando se ejecuta aplicación instalada

me construyeron un instalador para mi aplicación, y toda mi DLL y archivos de contenido están consiguiendo copia correctamente al directorio C:\Program Files\MyCompany\MyApp. Cuando ejecuto mi aplicación desde Visual Studio, todo funciona bien. Sin embargo, cuando ejecuto la versión instalada de mi aplicación, obtengo un DirectoryNotFoundException. El problema parece ser con Environment.CurrentDirectory.

que estaba esperando para ser Environment.CurrentDirectory ...

"C:\\Program Files\\MyCompany\\MyApp" 

... pero en realidad era ...

"C:\\Documents and Settings\\DanThMan" 

lo que está pasando aquí? ¿Cómo puedo solucionar esto?

Gracias.

EDIT:

bien, hmm. Este problema solo ocurre si ejecuto el atajo del menú Inicio. Si ejecuto MyApp.exe directamente, todo está bien.

EDIT 2:

creo que he llegado a la parte inferior de esto ahora. En mi Instalador (que es un Proyecto de Configuración de Visual Studio), el acceso directo al Menú de Inicio tiene una propiedad llamada WorkingFolder, que "Especifica la carpeta donde se instalará la aplicación de destino para el acceso directo". Accidentalmente configuré WorkingFolder en "MyCompany". Debería ser "Carpeta de aplicación". Ahora que lo tengo configurado correctamente, Environment.CurrentDirectory está funcionando nuevamente como se esperaba. Gracias por toda tu ayuda.

Datos 3:

Sin embargo, leer las advertencias A continuación, he decidido ir con los siguientes como un reemplazo para Environment.CurrentDirectory:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); 

Respuesta

31

Si desea obtener la ruta al directorio en el que se ejecuta el ejecutable, no debe confiar en Environment.CurrentDirectory, ya que se puede cambiar de varias maneras (configuración de corte de tiro, etc.). Prueba una de estas opciones en su lugar:

System.IO.Path.GetDirectoryName(Application.ExecutablePath); 

o

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); 
+1

Fui con la segunda solución porque la primera no funcionará con una aplicación WPF (a menos que incluya el ensamblado para Windows Forms). – devuxer

8

Uso Application.StartupPath en lugar de Environment.CurrentDirectory.
Tuve un problema similar, donde el CurrentDirectory estaba siendo cambiado inadvertidamente por algo así como OpenFileDialog sin que yo siquiera lo diera cuenta.
En su caso, parece que el proceso en el que está iniciando el formulario de solicitud está cambiando el CurrentDirectory sin su conocimiento.

+0

StartupPath no parece ser un miembro de System.Windows.Application, System.Net.Mime.MediaTypeNames.Application o MS.Internal.Documents.Application. Si hace alguna diferencia, esta es una aplicación de WPF. – devuxer

+0

Ah ok ... sí, 'Application.StartupPath' se encuentra en el espacio de nombres' System.Windows.Forms'. – Donut

1

Cuando se inicia un programa, el directorio actual suele ser el mismo que el de la aplicación inicial, a menos que la aplicación inicial especifique un directorio de trabajo diferente. Realmente puede estar en cualquier lugar del disco.

En su caso, la aplicación de inicio es el shell (explorer.exe) en ambos casos. Especifica un directorio de trabajo al iniciar un programa, según el contexto del lanzamiento. Ha visto dos casos diferentes (haciendo doble clic en un archivo en el explorador y ejecutándose desde el menú de inicio); también ha encontrado lo que Microsoft considera los valores más razonables para el directorio actual en cualquier caso: el directorio de inicio del usuario y el directorio que se muestra en el explorador (respectivamente).

1

Environment.CurrentDirectory contiene el directorio actual que es realmente el directorio actual. El valor depende de muchos factores. Cualquier aplicación puede cambiar el valor. Este valor no se refiere solo a su aplicación.

Si desea obtener el directorio de inicio, utilice Application.StartupPath.

3

ya que dijo que la aplicación está utilizando WPF, se puede usar el siguiente código en lugar de Application.StartupPath:

String appPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); 
Cuestiones relacionadas