Ho creato una semplice applicazione console con il seguente codice:
Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);
Ho copiato il file eseguibile risultante a C:\temp2
. Ho quindi inserito un collegamento a quell'eseguibile in C:\temp3
e lo ho eseguito (una volta dall'exe stesso e una volta dal collegamento). Ha dato le seguenti uscite entrambe le volte:
C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2
Mentre sono sicuro che ci deve essere qualche ragione cockamamie per spiegare il motivo per cui ci sono cinque diversi metodi di che fanno praticamente la stessa cosa, certamente don' so di cosa si tratta Tuttavia, sembrerebbe che nella maggior parte delle circostanze, sei libero di scegliere quale ti piace.
UPDATE: ho modificato le proprietà di scelta rapida, cambiando la "Start In:" campo per C:\temp3
. Questo ha portato alla seguente output:
C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3
... che dimostra almeno alcuni delle distinzioni tra i diversi metodi.
GetEntryAssembly() e GetExecutingAssembly() presentano una differenza interessante. Per i dettagli, consultare http://stackoverflow.com/a/18562036/30289 – bhadra
Come ho detto: restituisce il percorso in cui risiede * l'assembly attualmente in esecuzione *. La differenza tra 'GetEntryAssembly' e' GetExecutingAssembly' non è tanto sorprendente, è anche evidente dal nome della funzione. Se hanno fatto lo stesso, perché dovrebbero esserci due funzioni? :-) –
+1 Assembly.GetEntryAssembly() mi ha aiutato in caso di applicazione in esecuzione tramite clickonce – Artiom