2009-05-14 19 views
42

Come si ottiene il percorso dell'assieme corrente? Ho bisogno di ottenere dati da alcuni percorsi relativi alla posizione di hte current assembly (.dll).Come ottenere il percorso dell'assieme corrente

Ho pensato che qualcuno mi avesse detto di usare lo spazio dei nomi di riflessione ma non riesco a trovare nulla lì dentro.

+1

Assembly.GetExecutingAssembly(). Posizione – RichieHindle

risposta

72

È possibile utilizzare:

string path = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath; 

Alcuni suggerimenti nei commenti sono di passare che attraverso System.Uri.UnescapeDataString(da vvnurmi) per garantire che qualsiasi percentuale di codifica viene gestita, e di utilizzare Path.GetFullpath(da TrueWill per garantire che il percorso sia in formato Windows standard (anziché avere barre anziché barre rovesciate). Ecco un esempio di quello che si ottiene in ogni fase:

string s = Assembly.GetExecutingAssembly().CodeBase; 
Console.WriteLine("CodeBase: [" + s + "]"); 
s = (new Uri(s)).AbsolutePath; 
Console.WriteLine("AbsolutePath: [" + s + "]"); 
s = Uri.UnescapeDataString(s); 
Console.WriteLine("Unescaped: [" + s + "]"); 
s = Path.GetFullPath(s); 
Console.WriteLine("FullPath: [" + s + "]"); 

Output se stiamo correndo C:\Temp\Temp App\bin\Debug\TempApp.EXE:

 
CodeBase: [file:///C:/Temp/Temp App/bin/Debug/TempApp.EXE] 
AbsolutePath: [C:/Temp/Temp%20App/bin/Debug/TempApp.EXE] 
Unescaped: [C:/Temp/Temp App/bin/Debug/TempApp.EXE] 
FullPath: [C:\Temp\Temp App\bin\Debug\TempApp.EXE] 
+7

Si consiglia di chiamare Path.GetFullPath per trasformare le barre in barre inverse. È possibile ottenere un comportamento strano da Assembly.LoadFile (come i tipi che non si equivalgono) quando si utilizzano le barre in avanti. – TrueWill

+3

Qual è il vantaggio/lo scopo di usare questo invece di '.Location'? (Sospetto che ci debba essere un motivo, ma mi sfugge.) –

+4

@pst: A seconda dell'ambiente, la posizione può essere errata, poiché la copia shadow può "spostare" l'assieme prima dell'esecuzione. –

44
+13

+1 per i collegamenti della documentazione.8-) – RichieHindle

+0

Ciò fornisce la posizione di mscorlib, piuttosto che l'assembly, quando viene chiamato da un test dell'unità MSTest. –

6

Giusto per chiarire:

Assembly.GetExecutingAssembly().Location 
+0

+1: il dubbio è cattivo. – RichieHindle

2

preferisco

new System.Uri(Assembly.GetExecutingAssembly().EscapedCodeBase).LocalPath; 

EscapedCodeBase copre lo scenario in cui il vostro percorso locale potrebbe avere un invalido char URI in esso (vedi https://stackoverflow.com/a/21056435/852208)

LocalPath include il percorso completo per entrambi i percorsi locali e i percorsi unc, in cui AbsolutePath elimina "\\ server"

Problemi correlati