2012-10-18 8 views
18

mio C# applicazione scrive il percorso completo, circondato da doppi apici in un file, con:Odd C numero # percorso

streamWriter.WriteLine("\"" + Application.ExecutablePath + "\""); 

Normalmente funziona, il file scritto contiene

"D:\Dev\Projects\MyApp\bin\Debug\MyApp.exe" 

Ma, se il il percorso eseguibile della mia applicazione contiene un #, qualcosa di strano accade. L'output diventa:

"D:\Dev\Projects#/MyApp/bin/Debug/MyApp.exe" 

Le barre dopo il # diventano barre in avanti. Ciò causa problemi con il sistema che sto sviluppando.

Perché sta succedendo questo, e c'è un modo per prevenirlo che è più elegante di string.replacing il percorso prima di scrivere?

+0

Non riesco a riprodurre questo. Ho la mia app in esecuzione da C: \ my # \ project \ foo.exe e scrive Application.ExecutablePath correttamente come hai scritto sopra. Quando esegui il debug, Application.ExecutablePath controlla correttamente? Stai facendo post-elaborazione sul testo che scrivi che non viene mostrato qui? – Joe

+2

L'ho ricontrollato in un nuovo progetto, con solo il codice per scrivere il file. Si riproduce ancora. Il framework che sta usando è 4,5 se questo fa alcuna differenza. – Ryan

+0

Interessante, soprattutto alla luce del post di Elian qui sotto. Mi chiedo cosa ho fatto in modo diverso (anche se ho usato il framework 4.0 ...) – Joe

risposta

9

Ho appena guardato nel codice sorgente di Application.ExecutablePath, e la realizzazione è essenzialmente questo *:

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 proprietà Assembly.CodeBase tornerà la posizione come un URI. Qualcosa di simile:

file:///C:/myfolder/myfile.exe

Il # è il marcatore frammento in un URI; segna l'inizio del frammento. Apparentemente, la classe Uri altera l'uri dato quando viene analizzato e convertito nuovamente in una stringa.

Dal Assembly.Location contiene un 'normale' percorso del file, penso che la migliore alternativa è:

string executablePath = Assembly().GetEntryAssembly().Location; 

* ) L'implementazione è più complessa di questa, perché si occupa anche di situazioni in cui ci sono più AppDomain e altre situazioni speciali. Ho semplificato il codice per la situazione più comune.

+0

Interessante problema .. comunque, mi sono convertito in Assembly.Location ed è stato risolto. Grazie :) – Ryan

1

Errore/errore dispari. Altro che utilizzando una funzione sostituire o metodo di estensione per restituire sempre il formato corretto si potrebbe provare a utilizzare

System.Reflection.Assembly.GetExecutingAssembly().Location 

invece di ExecutablePath.