.net - significa - ruta relativa
¿Cuál es la mejor manera de obtener el directorio desde el que se está ejecutando un ensamblaje? (7)
Para mis aplicaciones, almaceno un archivo de configuración en xml junto con el ensamblado (exe) y otros archivos temporales para fines de proceso.
Encontré algunos caprichos con ".//"
y Application.StartupPath
.
He estado usando
String configPath = ".//config.xml";
Funciona bien hasta que llamé a OpenFIleDialog
para abrir algunos archivos en otras carpetas, la declaración anterior falló. Aparentemente ". /" Se refiere a "CurrentDirectory", que cambia cada vez que navegamos a otra carpeta.
En algún momento, estaba usando
String configPath = Path.Combine(Application.StartupPath + "config.xml");
En algún momento, cuando necesito ejecutar este ensamblaje desde otra carpeta usando Process.Start()
, las cosas comienzan a desmoronarse. Aparentemente, el directorio de trabajo no está configurado correctamente, y Application.StartupPath
está refiriendo al directorio de trabajo en lugar del directorio en el que se está ejecutando el ensamblado, como he supuesto. Así que tengo que recurrir a ProcessInfo para configurar el directorio de trabajo en el directorio del ensamblado. También tuve un problema con esto cuando escribía VSTO.
Entonces, mi pregunta es, ¿cuál es la mejor manera, la más simple y la más segura de obtener el directorio actual que está ejecutando el ensamblado, sin esos caprichos (o malentendidos) que acabo de mencionar?
EDITAR: tenía la intención de obtener el directorio donde reside el conjunto
EDITAR: según MSDN en AppDomain.BaseDirectory , parece que puede haber cambios durante el tiempo de ejecución, que es lo que no quiero (solo para aclarar, no es que no quiera permitir el cambio de BaseDirectory, sino más bien, cuando recuperarlo sin saber con certeza si ha sido cambiado)
EDIT: he notado que una pregunta relacionada fue publicada mucho antes. ¿Qué provocaría el cambio del directorio actual de una aplicación en ejecución?
Gracias chicos por la respuesta.
¿Desea el directorio de trabajo real o el directorio que contiene el ensamblado? No está del todo claro.
Hay Environment.CurrentDirectory
si quieres el directorio de trabajo, o Path.GetDirectoryName(typeof(Foo).Assembly.ManifestModule.FullyQualifiedName)
para encontrar la ubicación de un ensamblado (o al menos su módulo de manifiesto, que será lo mismo en casi todos los casos).
Intentaré algo como esto en el siguiente enlace :
string path;
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
MessageBox.Show( path );
Qué tal si
string currentAssemblyFile = System.Reflection.Assembly.GetExecutingAssembly().Location;
y luego descifrarlo a partir de ahí ...
También hay,
System.Reflection.Assembly.GetExecutingAssembly().CodeBase
Un poco más corto:
AppDomain.Current.BaseDirectory
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
Pruebe la implementación a continuación. La propiedad CodeBase es la forma más confiable de obtener la ubicación, y luego el resto del código la convierte en formato estándar de Windows (en lugar de un URI).
static public string AssemblyLoadDirectory
{
get
{
string codeBase = Assembly.GetCallingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}