combine - Problema de ruta de C#impar
string ruta c# (2)
Mi aplicación C # escribe su ruta completa rodeada de comillas dobles en un archivo, con:
streamWriter.WriteLine("/"" + Application.ExecutablePath + "/"");
Normalmente funciona, el archivo escrito contiene
"D:/Dev/Projects/MyApp/bin/Debug/MyApp.exe"
Pero, si la ruta ejecutable de mi aplicación contiene un #, sucede algo extraño. La salida se convierte en:
"D:/Dev/Projects#/MyApp/bin/Debug/MyApp.exe"
Las barras después de # se convierten en barras delanteras. Esto causa problemas con el sistema que estoy desarrollando.
¿Por qué sucede esto y hay una manera de evitar que sea más elegante que la cadena? ¿Reemplazar la ruta antes de escribir?
Acabo de ver el código fuente de Application.ExecutablePath
, y la implementación es esencialmente esto *:
Assembly asm = Assembly.GetEntryAssembly();
string cb = asm.CodeBase;
var codeBase = new Uri(cb);
if (codeBase.IsFile)
return codeBase.LocalPath + Uri.UnescapeDataString(codeBase.Fragment);
else
return codeBase.ToString();
La propiedad Assembly.CodeBase
devolverá la ubicación como un URI. Algo como:
file:///C:/myfolder/myfile.exe
El #
es el marcador de fragmento en un URI; Marca el comienzo del fragmento. Aparentemente, la clase Uri
altera el uri dado cuando se analiza y se convierte nuevamente en una cadena.
Dado que Assembly.Location
contiene una ruta de archivo ''normal'', supongo que su mejor alternativa es:
string executablePath = Assembly().GetEntryAssembly().Location;
* ) La implementación es más compleja que esto, porque también se ocupa de situaciones en las que existen múltiples aplicaciones y otras situaciones especiales. Simplifiqué el código para la situación más común.
Error impar / error. Aparte de usar una función de reemplazo o un método de extensión para devolver siempre el formato correcto que podría intentar usar
System.Reflection.Assembly.GetExecutingAssembly().Location
En lugar de ExecutablePath.