¿Mejor manera de obtener el directorio base?

Tengo este código para cargar un archivo de configuración y leer todos los valores y funciona bien cuando se ejecuta la aplicación, pero por supuesto falla en la ciudad del equipo porque el directorio base del dominio de la aplicación es donde se inicia el script de comstackción (psake). Sé que puedo cambiar el directorio al directorio de comstackción antes de ejecutar las pruebas, pero pensé que es mejor hacer que la carga del archivo de configuración funcione en todo momento, independientemente.

XDocument.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, cfgFile)); 

¿Hay otra forma de obtener el “Directorio base” que realmente funcione todo el tiempo? Intenté lo siguiente también con los mismos resultados:

 string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); XDocument.Load(Path.Combine(path, cfgFile)); 

EDIT 1 El problema es el siguiente. Mi directorio base de soluciones es “C: \ Project”, todos los archivos comstackdos se copian en “C: \ Project \ build”. Ahora en el script de comstackción psake tengo el siguiente código:

 task Test -depends PrepareTests { try { #$old = pwd #cd $build_dir &$mspec $mspec_projects --teamcity #cd $old } catch { &echo "Error starting test runner" Exit 1; } } 

Como puede ver, comenté el cambio de directorios, lo que hace que BaseDirectory sea la ubicación del archivo / solución de comstackción en lugar del directorio de comstackción, independientemente de cómo bash acceder. Un poco confuso si me preguntas.

ACTUALIZACIÓN Realmente me gustaría saber si es posible obtener el directorio del ensamblaje independientemente del directorio en el que se encuentre la aplicación que inició el dominio de la aplicación. ¿Cómo?

 string origAssemblyLocation = Assembly.GetExecutingAssembly().CodeBase; 

Por MSDN:

Propiedad Assembly.CodeBase

Obtiene la ubicación del ensamblado como se especificó originalmente

Diferentes maneras de obtener el directorio base.

  1. AppDomain.CurrentDomain.BaseDirectory

  2. Directory.GetCurrentDirectory() // no se garantiza que funcione en la aplicación móvil

  3. Environment.CurrentDirectory // esto llama a Directory.GetCurrentDirectory()

  4. this.GetType().Assembly.Location // Assembly.location

  5. Application.StartupPath // para aplicaciones de formularios de Windows

  6. Application.ExecutablePath // igual que Application.StartupPath

Entonces suena / parece que está intentando obtener el archivo de configuración para un ensamblaje. Lo siguiente debe realizar esa tarea accediendo a la propiedad ‘Ubicación’ del ensamblaje y usándola para recuperar la ruta de configuración:

 static string GetConfigFileByType(Type type) { Configuration config = ConfigurationManager.OpenExeConfiguration(type.Assembly.Location); if (config.HasFile) return config.FilePath; throw new FileNotFoundException(); } 

Tu pregunta es un poco confusa. Realmente no sé si esto es lo que quieres.

Por lo general uso AppDomain.CurrentDomain.BaseDirectory

Alternativas

  • Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
  • Environment.CurrentDirectory

prueba este

  Module[] modules = Assembly.GetExecutingAssembly().GetModules(); return Path.GetDirectoryName(modules[0].FullyQualifiedName); 

¿ha intentado obtener el Nombre de archivo del MainModule del proceso actual?

 System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 

¿O GetEntryAssembly ()?

 System.Reflection.Assembly.GetEntryAssembly().Location 

Me gusta hacer que mis clases sean configurables; por ejemplo, obtienen el nombre de la carpeta como un parámetro en su constructor. Esto hace posible probar con diferentes archivos de configuración.

En el código de prueba usamos:

 TestContext.TestDeploymentDir 

Esta es la carpeta de ejecución de prueba, donde se copian todos los ensamblajes para una ejecución de prueba, junto con los elementos de implementación de prueba. “Implementamos” nuestros archivos de configuración de prueba de unidad en la carpeta de ejecución de prueba, esto se puede especificar en el cuadro de diálogo testrunconfig en Visual Studio.

Para nuestro código de producción pasamos.

 Assembly.GetExecutingAssembly().Location 

Al constructor, que trabaja para nosotros.

qué tal si:

 Application.StartupPath; 
 string baseDirectory=Application.StartupPath.Split(Path.DirectorySeparatorChar)[0]; 

La ruta de inicio de la aplicación devolverá la ruta donde se guarda el exe, la dividiremos usando “\” y obtendremos el directorio base como “C:” por ejemplo,