Assembly.CodeBase parece prometedor, pero es una ruta UNC:
Ten en cuenta que se trata de algo parecido a un file uri, no un UNC path.
Resuelve esto haciendo la manipulación de cuerdas a mano. en serio.
Tratar todos los demás métodos se pueden encontrar en SO con el siguiente directorio (textualmente):
C:\Test\Space()(h#)(p%20){[a&],[email protected],p%,+}.,\Release
Se trata de un caso, ruta válida, tanto inusual de Windows. (Algunas personas se tienen uno de estos personajes de allí caminos, y que le gustaría que el método funcione para todo de esos, ¿verdad?)
La base de código disponible (we do not want Location
, right?) propiedades son (en mi Win7 con.NET 4):
assembly.CodeBase -> file:///C:/Test/Space()(h#)(p%20){[a&],[email protected],p%,+}.,/Release
assembly.EscapedCodeBase -> file:///C:/Test/Space(%20)(h%23)(p%20)%7B%5Ba%26%5D,[email protected],p%,+%7D.,/Release
Se le nota:
CodeBase
no se escaparon en absoluto, es sólo la ruta local regulares con el prefijo file:///
y las barras invertidas reemplazado. Como tal, no funciona para alimentar esto a System.Uri
.
EscapedCodeBase
no se escaparon por completo (lo hago no se sabe si se trata de un fallo, o si se trata de un defecto de la URI scheme):
- Nota cómo el carácter de espacio (
) se traduce en %20
- pero la secuencia
%20
también se traduce en %20
! (Porcentaje %
no se escapó en absoluto)
- Nadie puede reconstruir el original de esta forma destrozada!
Para los archivos locales (Y eso es todo lo que me importa para la materia CodeBase
, porque si el archivo no es local, es probable que desee utilizar .Location
todos modos, las siguientes obras para mí (en cuenta que no es el más bonito, ya sea:
public static string GetAssemblyFullPath(Assembly assembly)
{
string codeBasePseudoUrl = assembly.CodeBase; // "pseudo" because it is not properly escaped
if (codeBasePseudoUrl != null) {
const string filePrefix3 = @"file:///";
if (codeBasePseudoUrl.StartsWith(filePrefix3)) {
string sPath = codeBasePseudoUrl.Substring(filePrefix3.Length);
string bsPath = sPath.Replace('/', '\\');
Console.WriteLine("bsPath: " + bsPath);
string fp = Path.GetFullPath(bsPath);
Console.WriteLine("fp: " + fp);
return fp;
}
}
System.Diagnostics.Debug.Assert(false, "CodeBase evaluation failed! - Using Location as fallback.");
return Path.GetFullPath(assembly.Location);
}
estoy seguro de que uno puede llegar a mejores soluciones, probablemente incluso se podría llegar a una solución que lo hace adecuado en- URL/decodificación de la propiedad si CodeBase
es un camino local, pero dado que uno puede simplemente quitarse el file:///
un Hecho esto, yo diría que esta solución es lo suficientemente buena, si ciertamente realmente feo.
posible dupl icate de [¿Hay un método .NET Framework para convertir archivos URI a rutas con letras de unidad?] (http://stackoverflow.com/questions/278761/is-there-a-net-framework-method-for-converting- file-uris-to-paths-with-drive-le) – nawfal