Assembly.CodeBase sembra essere molto promettente, ma è un percorso UNC:
Do atto che si tratta di qualcosa di approssimare un file uri, non un UNC path.
Si risolve eseguendo la manipolazione delle stringhe a mano. Seriamente.
Prova tutti gli altri metodi si possono trovare sul SO con la seguente directory (testualmente):
C:\Test\Space()(h#)(p%20){[a&],[email protected],p%,+}.,\Release
Questa è una, se un po 'insolita, percorso di Windows valido. (Alcune persone saranno hanno uno di questi personaggi in là percorsi, e si vorrebbe che si metodo di lavorare per tutte di questi, giusto?)
La base di codice a disposizione (we do not want Location
, right?) proprietà sono poi (su il mio 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
Noterete:
CodeBase
non è sfuggito a tutti, è solo il percorso locale regolare prefisso file:///
e le barre inverse sostituito. Come tale, lo non funziona con per inviarlo a System.Uri
.
EscapedCodeBase
non è sfuggito completamente (io lo faccio non so se si tratta di un bug o se questo è un difetto della URI scheme):
- Si noti come il carattere di spazio (
) si traduce in %20
- ma la sequenza
%20
corrisponde a %20
! (% %
non è sfuggito affatto)
- Nessuno può ricostruire l'originale da questa forma deformata!
Per i file locali (E questo è davvero tutto quello che avevo a cuore per la roba CodeBase
, perché se il file non è locale, probabilmente si desidera utilizzare .Location
in ogni caso, i seguenti lavori per me (notare che non è la più bella sia:
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);
}
sono sicuro che si può trovare soluzioni migliori, probabilmente si potrebbe anche trovare una soluzione che fa proprio URL it-/decodifica del CodeBase
proprietà se è un percorso locale, ma dato che si può semplicemente togliere lo file:///
D sarebbe fatto con esso, direi che questa soluzione è abbastanza buona, se certamente davvero brutto.
possibile dupl icate of [Esiste un metodo .NET Framework per convertire gli URI di file in percorsi con lettere di unità?] (http://stackoverflow.com/questions/278761/is-there-a-net-framework-method-for-converting- file-uris-to-path-with-drive-le) – nawfal